找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2347|回复: 0
打印 上一主题 下一主题
收起左侧

解决单片机按键控制数码管带来闪灭显示问题的项目工程(初级版)

[复制链接]
跳转到指定楼层
楼主
本帖最后由 51黑电子会员 于 2020-5-22 08:38 编辑
  1. /*****
  2. 本程序分两个程序。一个是程序一,按键控制数码管带来闪灭显示问题的程序。
  3. 另一个是程序二,解决按键控制数码管带来闪灭显示问题的程序。通过利用数码
  4. 管显示函数代替按键扫描函数内的按键延时,以及在按键扫描函数内按键松手时,
  5. 再次调用数码管显示函数。提醒:先试程序一,再试程序二,之后两者对比,找
  6. 出不同点,取最适合的。
  7. *****/
  8. //程序一:按键控制数码管带来闪灭显示问题的程序
  9. //#include<reg51.h>
  10. //#define uchar unsigned char
  11. //#define uint unsigned int
  12. //sbit add=P3^0;
  13. //sbit dec=P3^4;
  14. //uchar lingweiflag;
  15. //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
  16. //uint num;
  17. //uint qian,bai,shi,ge;//定义拆字变量
  18. //  /**ms级延时子程序**/
  19. //  void delay(uint x)
  20. //{
  21. //   uint i,j;                       
  22. //   for(i=0;i<x;i++)     
  23. //    for(j=0;j<110;j++);
  24. //  }
  25. //  void display()
  26. //{
  27. //   qian=num/1000;//取得千位数字
  28. //   bai=num%1000/100;//取得百位数字
  29. //   shi=num%100/10;//取得十位数字
  30. //   ge=num%10;//取得个位数字
  31. //
  32. //   P2=0xfe;//数码管千位显示位
  33. //   P1=table[qian];//数码管千位数值显示
  34. //   delay(2);//延时
  35. //
  36. //   P2=0xfd;//数码管百位显示位
  37. //   P1=table[bai];//数码管百位数值显示
  38. //   delay(2);//延时
  39. //
  40. //   P2=0xfb;//数码管十位显示位
  41. //   P1=table[shi];//数码管十位数值显示
  42. //   delay(2);//延时
  43. //
  44. //   P2=0xf7;//数码管个位显示位
  45. //   P1=table[ge];//数码管个位数值显示
  46. //   delay(2);//延时
  47. // }
  48. //  void keyscan()
  49. //{
  50. //   if(add==0)
  51. // {         
  52. //    delay(5);
  53. //    if(add==0)
  54. //  {
  55. //     num++;
  56. //     while(!add);
  57. //     lingweiflag=0;
  58. //    }
  59. //   }
  60. //   if(dec==0&&lingweiflag==0)
  61. // {         
  62. //    delay(5);
  63. //    if(dec==0)
  64. //  {
  65. //     num--;
  66. //     while(!dec);
  67. //    }
  68. //   }
  69. //   if(num>9999)
  70. // {
  71. //      num=0;
  72. //   }
  73. //   if(num==0)
  74. // {
  75. //       num=0;
  76. //       lingweiflag=1;
  77. //   }
  78. // }
  79. //  void main()
  80. //{
  81. //   while(1)
  82. // {
  83. //    display();
  84. //    keyscan();
  85. //   }
  86. //  }



  87. //程序二:解决按键控制数码管带来闪灭显示问题的程序
  88. #include<reg51.h>
  89. #define uchar unsigned char
  90. #define uint unsigned int
  91. sbit add=P3^0;
  92. sbit dec=P3^4;
  93. uchar lingweiflag;
  94. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
  95. uint num;
  96. uint qian,bai,shi,ge;//定义拆字变量
  97.   /**ms级延时子程序**/
  98.   void delay(uint x)
  99. {
  100.    uint i,j;                       
  101.    for(i=0;i<x;i++)     
  102.     for(j=0;j<110;j++);
  103.   }
  104.   void display()
  105. {
  106.    qian=num/1000;//取得千位数字
  107.    bai=num%1000/100;//取得百位数字
  108.    shi=num%100/10;//取得十位数字
  109.    ge=num%10;//取得个位数字

  110.    P2=0xfe;//数码管千位显示位
  111.    P1=table[qian];//数码管千位数值显示
  112.    delay(2);//延时

  113.    P2=0xfd;//数码管百位显示位
  114.    P1=table[bai];//数码管百位数值显示
  115.    delay(2);//延时

  116.    P2=0xfb;//数码管十位显示位
  117.    P1=table[shi];//数码管十位数值显示
  118.    delay(2);//延时

  119.    P2=0xf7;//数码管个位显示位
  120.    P1=table[ge];//数码管个位数值显示
  121.    delay(2);//延时
  122. }
  123.   void keyscan()
  124. {
  125.    if(add==0)
  126. {         
  127. //  delay(5);
  128.     display();
  129.     if(add==0)
  130.   {
  131.      num++;
  132. //   while(!add);
  133.      while(!add)
  134.   {   
  135.        display();
  136.      }
  137.      lingweiflag=0;
  138.     }
  139.    }
  140.    if(dec==0&&lingweiflag==0)
  141. {         
  142. //  delay(5);
  143.     display();
  144.     if(dec==0)
  145.   {
  146.      num--;
  147. //   while(!dec);
  148.      while(!dec)
  149.      display();
  150.     }
  151.    }
  152.    if(num>9999)
  153. {
  154.     num=0;
  155.    }
  156.    if(num==0)
  157. {
  158.     num=0;
  159.     lingweiflag=1;
  160.    }
  161. }
  162.   void main()
  163. {
  164.    while(1)
  165. {
  166.     display();
  167.     keyscan();
  168.    }
  169.   }
复制代码

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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