一个是用按键点亮LED,一个使用按键控制数码管。咱的开发板和金沙滩的不一样,按键可以使用的很少。这个是用按键控制LED:
#include <STC12C5A60S2.H>
sbit ENLED = P1^1;
sbit LED6 = P0^3;
sbit KEY4 = P2^3;
void main()
{
ENLED = 0; //使能74HC245
P2 = 0x7E;//因为我们的板子按键和74HC138公用单片机的同一端口,所以这里可以直接使能,但能用的按键也变少了
while(1)
{
LED6 = KEY4;//不按时为1,按下时为0,对应的LED点亮
}
}
这个是用按键控制数码管
#include <STC12C5A60S2.H>
sbit ENLED = P1^1;
sbit KEY4 = P2^3;
unsigned char code LedChar[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};//用数组来储存数码管的真值表,
void main()
{
bit backup = 1; //定义一个位变量,保存前一次扫描的按键值
unsigned char cnt = 0;//定义一个计数变量,记录按键按下的次数
ENLED = 0;//打开74HC245
P2 =0x7D;//利用三八译码器打开最右边的三极管,因为共用缘故,所以只能用P23对应的按键
P0 = LedChar[cnt];//显示按键初始值
while (1)
{
if (KEY4!=backup) //当前值与前次值不相等则说明按键有动作
{
if(backup == 0) //如果前次值为0,则说明当前为从0变1,即按键弹起
{
cnt++;//按键次数加1
if(cnt>=10)
{
cnt = 0;//因为只用一个数码管,所以加到10就清0
}
P0 = LedChar[cnt];//计数值显示到数码管上
}
backup = KEY4;//更新备份为当前值,以便下次比较
}
}
}
这个是按键的消抖:
#include <STC12C5A60S2.H>
sbit ENLED = P1^1;
sbit KEY4 = P2^3;
unsigned char code LedChar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};//用数组来储存数码管的真值表,
bit KeySta = 1; //当前按键状态
void main()
{
unsigned char cnt = 0;//按键计数
bit backup = 1;//按键值备份,保存前一次的扫描值
ENLED = 0;//使能74HC245;
EA = 1; //使能总中断
TMOD = 0x01;//设置定时器为模式1
TH0 = 0xEB;
TL0 = 0x2B;//为定时器赋初始值,定时2毫秒
TR0 = 1;//启动定时器
ET0 = 1;//启动中断
P2 = 0x7D;//利用三八译码器打开最右边的三极管,因为按键与三八译码器有冲突,所以只能用P23对应的按键
P0 = LedChar[cnt];//显示按键次数初始值
while(1)
{
if(KeySta!=backup)//如果当前值与前次值不相等则说明此时按键有动作
{
if(backup == 0)//如果前一次值为0,则说明当前是从0到1的弹起动作
{
cnt++;//按键次数加一
if(cnt>=10)
{
cnt = 0;
}//只用一个数码管,加到10之后清0,重新开始
P0 = LedChar[cnt];//计数值显示到数码管上
}
backup = KEY4;//更新备份为当前值,以备下次比较
}
}
}
void InterruptTimer0() interrupt 1//中断服务函数,用于按键的扫描与消抖
{
static unsigned char keybuf = 0xFF;//扫描缓冲区,保存一段时间的扫描值
TH0 = 0xEB;
TL0 = 0x2B;//重新加载初值
keybuf = (keybuf<<1)|KEY4;//缓存区左移一位,并将当前扫描值移入最低位
if(keybuf == 0x00)
{
KeySta = 0;
} //连续8次的扫描值都是0,即16秒内都检验到按下状态时,可以认为按键已经按下
else if(keybuf == 0xFF)
{
KeySta = 1;
} //连续8次的扫描值都是1,即16秒内都检验到弹起状态时,可以认为按键已经弹起
else
{} //其他情况则说明按键状态尚未稳定,则不对KeySta变量值进行更新
}
|