找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 21471|回复: 14
收起左侧

单片机按键实现0-9999计数器程序+仿真 4位一体数码管显示

  [复制链接]
ID:293363 发表于 2019-4-15 08:33 | 显示全部楼层 |阅读模式
名称:按键调节数码管显示

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

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

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

单片机源程序如下:
  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, 下载次数: 368)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:567885 发表于 2019-6-20 15:36 | 显示全部楼层
哭了如果是汇编就好了呜呜呜
回复

使用道具 举报

ID:571801 发表于 2019-6-25 15:56 | 显示全部楼层
好,非常好
回复

使用道具 举报

ID:571903 发表于 2019-6-25 16:42 | 显示全部楼层
好,很好
回复

使用道具 举报

ID:353831 发表于 2019-9-5 15:14 | 显示全部楼层
程序有问题  数码管无法正常显示
回复

使用道具 举报

ID:353831 发表于 2019-9-6 18:09 来自手机 | 显示全部楼层
数码管接错了,改了可以正常显示和计数了,只是个位计数时前面的十百千位跟着闪烁
回复

使用道具 举报

ID:293363 发表于 2019-9-7 20:36 | 显示全部楼层
wl020807 发表于 2019-9-6 18:09
数码管接错了,改了可以正常显示和计数了,只是个位计数时前面的十百千位跟着闪烁

谢谢提出来
回复

使用道具 举报

ID:626644 发表于 2019-10-19 15:29 | 显示全部楼层
怎么改?急在线等
回复

使用道具 举报

ID:753568 发表于 2020-5-17 14:42 | 显示全部楼层
大神在不在 要答辩了 有点问题想问您 能不能加个qq
回复

使用道具 举报

ID:920649 发表于 2021-5-13 18:42 | 显示全部楼层
哭了,非常感谢
回复

使用道具 举报

ID:331078 发表于 2021-5-13 20:25 | 显示全部楼层
CPU Delay 是大忌,为啥不用定时器?
回复

使用道具 举报

ID:293363 发表于 2022-5-7 15:19 | 显示全部楼层
YTWO 发表于 2021-5-13 20:25
CPU Delay 是大忌,为啥不用定时器?

因为我不会
回复

使用道具 举报

ID:514317 发表于 2022-5-7 21:47 | 显示全部楼层
为什么大家发出来的程序都不用操作系统呢   最次也可以用个rtx51tny   要是闲麻烦可以移植下STC库文件的分时任务调度   就3个函数   用起来不要太方便   
回复

使用道具 举报

ID:1082988 发表于 2023-6-9 16:46 | 显示全部楼层
可以变成自动加1和减1吗


回复

使用道具 举报

ID:293363 发表于 2023-6-10 11:15 | 显示全部楼层
zhangyubin 发表于 2023-6-9 16:46
可以变成自动加1和减1吗

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表