单片机C语言,适合于初学者。
低功耗模式的按键去抖开关机
单片机源程序如下:
- #include <reg52.h>
- sbit KEY4 = P3^2;
- unsigned char code LedChar[] =
- { //定义表格一定要使用code,这样会做到程序存储区中
- 0x3F, //表格第1步数据0b00111111
- 0x06, //表格第2步数据0b00000110
- 0x5B, //表格第3步数据0b01011011
- 0x4F, //表格第4步数据0b01001111
- 0x66, //表格第5步数据0b01100110
- 0x6D, //表格第6步数据0b01101101
- 0x7D, //表格第7步数据0b01111101
- 0x07, //表格第8步数据0b00000111
- 0x7F, //表格第9步数据0b01111111
- 0x6F, //表格第10步数据0b01101111
- };
- bit KeySta = 1; //当前按键状态
- unsigned char Ke;
- void main()
- {
- bit backup = 1; //按键值备份,保存前一次的扫描值
- unsigned char cnt = 0; //按键计数,记录按键按下的次数
-
- EA = 1; //使能总中断
- TMOD = 0x01; //设置T0为模式1
- TH0 = 0xF8; //为T0赋初值0xF8CD,定时2ms
- TL0 = 0xCD;
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- P0 = LedChar[cnt]; //显示按键次数初值
-
- while (1)
- {
- if (KeySta != backup) //当前值与前次值不相等说明此时按键有动作
- {
- if (backup == 0) //如果前次值为0,则说明当前是弹起动作
- {
- cnt++;
- P0=0;
-
- if(Ke==0)
- {
- IT0 = 1; //外部中断0为下降沿触发
- EX0 = 1; //使能总中断
- EA = 1;
- PCON=0x02;
- }
- Ke++;
- if(Ke==2) Ke=0;
- // else if(Ke!=1) Ke=0;
- if (cnt >= 10)
- { //只用1个数码管显示,所以加到10就清零重新开始
- cnt = 0;
-
- }
- P0 = LedChar[cnt]; //计数值显示到数码管上
- }
- backup = KeySta; //更新备份为当前值,以备进行下次比较
- }
- }
- }
- /* T0中断服务函数,用于按键状态的扫描并消抖 */
- void InterruptTimer0() interrupt 1
- {
- static unsigned char keybuf = 0xFF; //扫描缓冲区,保存一段时间内的扫描值
-
- TH0 = 0xF8; //重新加载初值
- TL0 = 0xCD;
- keybuf = (keybuf<<1) | KEY4; //缓冲区左移一位,并将当前扫描值移入最低位
- if (keybuf == 0x00)
- { //连续8次扫描值都为0,即16ms内都只检测到按下状态时,可认为按键已按下
- KeySta = 0;
- }
- else if (keybuf == 0xFF)
- { //连续8次扫描值都为1,即16ms内都只检测到弹起状态时,可认为按键已弹起
- KeySta = 1;
- }
- else
- {} //其它情况则说明按键状态尚未稳定,则不对KeySta变量值进行更新
- }
- void int0() interrupt 0
- {
- PCON=0;//唤醒单片机
- }
复制代码
所有资料51hei提供下载:
按键去抖开关机.rar
(27.78 KB, 下载次数: 43)
|