使用芯片STM8S003
所用端口:PD2~PD6, PA1~PA3
其中,PD3~PD6為輸出,PA1~PA3 / PD2為輸入(默認(rèn)上拉)
/*
PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
PD6 PD5 PD4 PD3 PD2 PA3 PA2 PA1
*/
程序如下:
/*添加包含芯片的頭文件*/
#include
volatileunsignedcharCF[4];//按鍵觸發(fā)標(biāo)志(表示4列,每一列同一行的
//值是一樣的但列標(biāo)不一樣來區(qū)分不同列的鍵)
volatileunsignedcharCont[4];
unsignedcharKeyVal;//鍵值
//unsignedcharKeyOut[4]={0xef,0xdf,0xbf,0x7f};//4X4按輸出端控制
//unsignedcharKeyOut[4]={0x7f,0xbf,0xdf,0xef};
unsignedcharKeyOut[4]={0x3f,0x5f,0x6f,0x77};//兩個端口組合4x4端口輸出控制
unsignedcharPortCom;//兩個端口組合的端口
unsignedcharcIn0,cIn1,cIn2,cIn3;
/*******************************************************************************
**函數(shù)名稱:voiddelay(unsignedintms)Name:voiddelay(unsignedintms)
**功能描述:大概延時
**入口參數(shù):unsignedintms輸入大概延時數(shù)值
**輸出:無
*******************************************************************************/
voiddelay(unsignedintms)
{
unsignedintx,y;
for(x=ms;x>0;x--)
for(y=1000;y>0;y--);
}
/*
**描述:新型4X4按鍵掃描程序放在1ms-10ms中斷內(nèi)使用(十分穩(wěn)定不需要再寫消抖程序)
**備注:按鍵彈起時keyVal=0單鍵按下keyVal有16個值,你自己程序可以針對不同值
**進(jìn)行不同程序操作keyVal單鍵值分別為
**0x01,0x02,0x04,0x08,
**0x11,0x12,0x14,0x18,
**0x21,0x22,0x24,0x28,
**0x31,0x32,0x34,0x38,
*/
voidKey_Head()
{
unsignedcharReadData[4];
staticunsignedchari;
/*
PortComBIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0
PD6PD5PD4PD3PD2PA3PA2PA1
*/
cIn0=0;
cIn1=0;
cIn2=0;
cIn3=0;
if(++i>=4)i=0;
//PortCom=KeyOut[i]|0x0f;//忽略低4位
//輸出掃描
PD_ODR=KeyOut[i];
//輸入偵測
cIn0=PA_IDR_bit.IDR1;
cIn1=PA_IDR_bit.IDR2;
cIn2=PA_IDR_bit.IDR3;
cIn3=PD_IDR_bit.IDR2;
PortCom=(cIn3<<3)|(cIn2<<2)|(cIn1<<1)|cIn0;
ReadData[i]=(PortCom|0xf0)^0xff;//忽略高4位取反
CF[i]=ReadData[i]&(ReadData[i]^Cont[i]);
Cont[i]=ReadData[i];
//輸出鍵值
switch(CF[i])//第i列
{
case0x08:KeyVal=((i<<4)+8);break;
case0x04:KeyVal=((i<<4)+4);break;
case0x02:KeyVal=((i<<4)+2);break;
case0x01:KeyVal=((i<<4)+1);break;
default:KeyVal=0;break;
}
delay(30);
}
/*******************************************************************************
**函數(shù)名稱:voidALL_LED_Init()Name:voidALL_LED_Init()
**功能描述:初始化LED燈的IO口設(shè)為輸出
**入口參數(shù):無
**輸出:無
*******************************************************************************/
voidALL_LED_Init()
{
//LED1Init
//PD_DDR_bit.DDR2=1;//設(shè)置端口PD->2的輸入輸出方向寄存器為輸出方向
//PD_CR1_bit.C12=1;//設(shè)置PD2為推挽輸出
//PD_CR2_bit.C22=1;//設(shè)置PD2的輸出最大速度為10MHZ
//LED2Init
PC_DDR_bit.DDR7=1;//設(shè)置端口PC->7的輸入輸出方向寄存器為輸出方向
PC_CR1_bit.C17=1;//設(shè)置PC7為推挽輸出
PC_CR2_bit.C27=1;//設(shè)置PC7的輸出最大速度為10MHZ
//LED3Init
PC_DDR_bit.DDR6=1;//設(shè)置端口PC->6的輸入輸出方向寄存器為輸出方向
PC_CR1_bit.C16=1;//設(shè)置PC6為推挽輸出
PC_CR2_bit.C26=1;//設(shè)置PC6的輸出最大速度為10MHZ
//LED4Init
PC_DDR_bit.DDR3=1;//設(shè)置端口PC->3的輸入輸出方向寄存器為輸出方向
PC_CR1_bit.C13=1;//設(shè)置PC3為推挽輸出
PC_CR2_bit.C23=1;//設(shè)置PC3的輸出最大速度為10MHZ
}
/*******************************************************************************
**函數(shù)名稱:ALLKeyInit()
**功能描述:配置Key1,Key2,Key3輸入按鍵
**入口參數(shù):無
**輸出:無
*******************************************************************************/
voidALLKeyInit()
{
//PA1_Init
PA_DDR_bit.DDR1=0;//GPA->PIN3設(shè)置為輸入模式
PA_CR1_bit.C11=1;//GPA->PIN3帶上拉電阻輸入
PA_CR2_bit.C21=0;//GPA->PIN3禁止外部中斷
//PA2_Init
PA_DDR_bit.DDR2=0;//GPA->PIN3設(shè)置為輸入模式
PA_CR1_bit.C12=1;//GPA->PIN3帶上拉電阻輸入
PA_CR2_bit.C22=0;//GPA->PIN3禁止外部中斷
//PA3_Init
PA_DDR_bit.DDR3=0;//GPA->PIN3設(shè)置為輸入模式
PA_CR1_bit.C13=1;//GPA->PIN3帶上拉電阻輸入
PA_CR2_bit.C23=0;//GPA->PIN3禁止外部中斷
//PD2_Init
PD_DDR_bit.DDR2=0;//GPD->PIN3設(shè)置為輸入模式
PD_CR1_bit.C12=1;//GPD->PIN3帶上拉電阻輸入
PD_CR2_bit.C22=0;//GPD->PIN3禁止外部中斷
//PD3_Init