设为首页收藏本站帮助中心
查看: 484|回复: 5
收起左侧

C51/STC单片机定时器中断实现1个按钮控制1位共阳数码管十六进制数字短按加1(长按连加)

[复制链接]
发表于 2021-10-6 16:30:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?加入我们

x
main.png
单片机型号:STC任意 晶振频率:12Mhz
硬件连接:P2.0~P2.7连接1位共阳数码管与VCC,P3.0连接轻触开关与GND。
轻触开关按下后,数码管显示十六进制数字+1,按住不放则连加。
  1. #include "STC12C5A60S2.h"
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define feed_dog() WDT_CONTR |= 0x10        //看门狗喂狗
  6. u8 code nbr[16] = {                //共阳数码管段码16进制
  7.     0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
  8. };

  9. sbit sKEY = P3 ^ 0; //P3.0与GND连接一个按键
  10. bit key = 1;        //按键按下25毫秒后清0,松开置1 (按键消抖专用)
  11. bit delay = 0;      //定时器中断延时标志
  12. u16 delay_ms;       //定时器中断延时任意毫秒
  13. u16 KEYms = 0;      //按键按下的时间 最长65535 松开清0

  14. void InitTimer0(){
  15.     TMOD = 0x01;
  16.     TH0 = 0x0FC;
  17.     TL0 = 0x18;
  18.     EA = 1;
  19.     ET0 = 1;
  20.     TR0 = 1;
  21. }

  22. void main(){
  23.     u8 a = 0;
  24.     WDT_CONTR = 0x27;
  25.     P2 = nbr[a];
  26.     InitTimer0();
  27.     while (1) {
  28.         feed_dog();
  29.         if (key == 0) {     //短按加1
  30.             if (a++ >= 15) a = 0;
  31.             P2 = nbr[a];
  32.             delay_ms = 500; delay = 1;
  33.             while (delay && key == 0);      //长按延时等待
  34.             while (KEYms >= 500) {          //按键长按,开始连加
  35.                 feed_dog();
  36.                 delay_ms = 125; delay = 1;  //125毫秒延时连加一次
  37.                 while (delay && key == 0);
  38.                 if (a++ >= 15) a = 0;
  39.                 P2 = nbr[a];
  40.             }
  41.             delay = 0;
  42.             delay_ms = 0;
  43.         }
  44.     }
  45. }

  46. void Timer0Interrupt() interrupt 1 {        //12Mhz 1mS 定时器中断
  47.     TH0 = 0x0FC;
  48.     TL0 = 0x18;
  49.     if (sKEY) {
  50.         KEYms = 0;
  51.     } else {
  52.         if (KEYms != 0xFFFF) {
  53.             KEYms++;
  54.         }
  55.     }
  56.     key = !(KEYms >= 25);       //按键消抖25毫秒
  57.     if (delay && !--delay_ms) {
  58.         delay = 0;
  59.     }

  60. }
复制代码

相关帖子

这个小可爱很神秘,什么都没留下
回复

使用道具 举报

发表于 2021-10-7 10:25:28 | 显示全部楼层
这个小可爱很神秘,什么都没留下
回复 支持 反对

使用道具 举报

发表于 2021-10-8 21:07:06 | 显示全部楼层
这个小可爱很神秘,什么都没留下
回复 支持 反对

使用道具 举报

发表于 2021-10-16 18:30:15 | 显示全部楼层

你来晚了
这个小可爱很神秘,什么都没留下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则