标题: 单片机按键实现0-9999计数器程序+仿真 4位一体数码管显示 [打印本页]

作者: 陈润源home    时间: 2019-4-15 08:33
标题: 单片机按键实现0-9999计数器程序+仿真 4位一体数码管显示
名称:按键调节数码管显示

  功能:通过按键加减数码管所显示的数字
            按下k1加1,最大加到9999
            按下k2减1,最小减到0
            按下k3清零复位   
   用了最简单的思路,各路大神不喜勿喷.

   小弟就不和各位爷绕弯子了,直接上图

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. //----------------------------------------------------------------------
  2. //名称:按键调节数码管显示
  3. //----------------------------------------------------------------------
  4. //功能:通过按键加减数码管所显示的数字
  5. //     按下k1加1,最大加到9999
  6. //     按下k2减1,最小减到0
  7. //     按下k3清零复位   
  8. //----------------------------------------------------------------------
  9. //姓名:陈润源
  10. //地点:内江职业技术学院
  11. //时间:2019年4月6日21:39:46
  12. //----------------------------------------------------------------------
  13. #include <reg51.h>
  14. #define uchar unsigned char
  15. #define uint unsigned int

  16. sbit k1 = P1^0;                   //加
  17. sbit k2 = P1^1;                   //减
  18. sbit k3 = P1^2;                   //复位
  19. void key(void);
  20. void display(void);

  21. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
  22.                     0x92,0x82,0xf8,0x80,0x90};           //数组
  23.                        
  24. char m=99,n=98;                                //显示初值,m,n的值决定开机显示数值
  25. //****************************************
  26. //延时程序
  27. //****************************************
  28. void delayms(uint xms)
  29. {
  30.    uint i,j;
  31.    for(i=xms;i>0;i--)
  32.    for(j=110;j>0;j--);
  33. }
  34. //***********************************************
  35. //显示程序
  36. //***********************************************
  37. void display(void)
  38. {
  39.         P2=0X08;
  40.                 P0=table[m%10];   //显示个位
  41.                 delayms(5);  
  42.                 P2=0X04;
  43.             P0=table[m/10];          //显示十位
  44.                 delayms(5);                                                              
  45.             P2=0X02;
  46.                 P0=table[n%10];          //显示百位
  47.                 delayms(5);
  48.                 P2=0X01;
  49.                 P0=table[n/10];          //显示千位
  50.                 delayms(5);
  51. }

  52. //***************************************************
  53. //按键处理
  54. //***************************************************
  55. void key()
  56. {
  57.   if(k1==0)                                         //检测按键是否被按下
  58.    {                                                 //延时消抖
  59.            delayms(10);                         
  60.         if(k1==0)                                 //再次检测是否真正按下按键
  61.         {
  62.           m++;                                         //m自加一
  63.           if(m>=100)                         //如果m加到100则n加一 (限制m的取值范围) 个位、十位最大显示99
  64.           {
  65.                   n++;                                 //n自加一
  66.                 m=0;                                 //使m又从0开始计数
  67.                 if(n>=100)                         //如果n加到100则m=n=99 (限制n的取值范围) 百位、千位最大显示99
  68.                 {
  69.                   m=99;                                 //最大显示9999
  70.                   n=99;
  71.                 }
  72.           }
  73.         }
  74.         while(!k1);                                 //按键松开
  75.    }

  76.   if(k2==0)                                         //检测按键是否被按下
  77.    {                                                 //延时消抖
  78.            delayms(10);                         //再次检测是否真正按下按键
  79.         if(k2==0)
  80.         {                                                 //m自减一
  81.           m--;
  82.           if(m<=0)                                 //如果m减到0则n减一 (限制n的取值范围) 个位、十位最小显示00
  83.           {                                                 
  84.             m=99;                                 //重新给m装初值
  85.                   n--;                                 //n自减一
  86.                 if(n==-1)                         //如果n减到-1,则m=n=0 (限制n的取值范围) 百位、千位最小显示00
  87.                 {
  88.                  n=0;                                 //最小显示0000
  89.                  m=0;
  90.                 }
  91.           }
  92.         }
  93.         while(!k2);                                 //按键松开
  94.    }

  95. if(k3==0)                                         //检测按键是否被按下
  96. {
  97.    delayms(10);                                 //延时消抖
  98.    if(k3==0)                                 //再次检测是否真正按下按键
  99.    {
  100.             m=0;                                         //复位,显示0000
  101.          n=0;
  102.    }
  103.    while(!k3);                                 //按键松开
  104. }
  105. }

  106. void main()
  107. {
  108.   while(1)
  109.   {                                                         //调用按键检测
  110.    key();                                         //数码管显示
  111.    display();
  112.   }

  113. }                                  
复制代码

所有资料51hei提供下载:
0~9999计数器.zip (53.03 KB, 下载次数: 375)




作者: 吹毛求疵    时间: 2019-6-20 15:36
哭了如果是汇编就好了呜呜呜
作者: l5201314z    时间: 2019-6-25 15:56
好,非常好
作者: 123@23    时间: 2019-6-25 16:42
好,很好
作者: wl020807    时间: 2019-9-5 15:14
程序有问题  数码管无法正常显示
作者: wl020807    时间: 2019-9-6 18:09
数码管接错了,改了可以正常显示和计数了,只是个位计数时前面的十百千位跟着闪烁
作者: 陈润源home    时间: 2019-9-7 20:36
wl020807 发表于 2019-9-6 18:09
数码管接错了,改了可以正常显示和计数了,只是个位计数时前面的十百千位跟着闪烁

谢谢提出来
作者: 1802002669    时间: 2019-10-19 15:29
怎么改?急在线等

作者: 周周大魔王    时间: 2020-5-17 14:42
大神在不在 要答辩了 有点问题想问您 能不能加个qq
作者: Succulent    时间: 2021-5-13 18:42
哭了,非常感谢
作者: YTWO    时间: 2021-5-13 20:25
CPU Delay 是大忌,为啥不用定时器?
作者: 陈润源home    时间: 2022-5-7 15:19
YTWO 发表于 2021-5-13 20:25
CPU Delay 是大忌,为啥不用定时器?

因为我不会
作者: lzzasd    时间: 2022-5-7 21:47
为什么大家发出来的程序都不用操作系统呢   最次也可以用个rtx51tny   要是闲麻烦可以移植下STC库文件的分时任务调度   就3个函数   用起来不要太方便   
作者: zhangyubin    时间: 2023-6-9 16:46
可以变成自动加1和减1吗



作者: 陈润源home    时间: 2023-6-10 11:15
zhangyubin 发表于 2023-6-9 16:46
可以变成自动加1和减1吗

可以  去掉按键检测   自加1程序放定时器里面  




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1