[DemoCode下载] 按键单片机程序

[复制链接]
1385|4
 楼主| Mancherstun 发表于 2016-2-29 15:50 | 显示全部楼层 |阅读模式
用4个按键来控制数码管显示的内容
  1. #include<reg51.h>
  2. #define duan   P0 //段选
  3. #define wei P2 //位选
  4. unsigned char code wei1[8] = {
  5. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制
  6. unsigned char code duan1[17] = {
  7. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  8. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  9. unsigned char ge,shi,bai,a,b;
  10. sbit key1=P1^0;
  11. sbit key2=P1^1;
  12. sbit key3=P1^2;
  13. sbit key4=P1^3;
  14. void keys();  //按键  函数
  15. void s(unsigned char xms); //延时函数
  16. void DigDisplay(); //动态显示函数
  17. void init(); //初始化函数
  18. void main(void)
  19. {
  20. init();
  21. while(1)
  22. {
  23.   DigDisplay();
  24.   keys();
  25. }   
  26. }

  27. void DigDisplay()
  28. {
  29. unsigned char i;
  30. unsigned int j;

  31. bai=a/100;
  32. shi=a%100/10;
  33. ge=a%10;

  34. i=0;
  35. wei = wei1[i]; //发送位选
  36. duan = duan1[bai];     //发送段码
  37. j = 10;      //扫描间隔时间设定
  38. while(j--);
  39. duan = 0x00;   //消隐
  40. i++;

  41. wei = wei1[i]; //发送位选
  42. duan = duan1[shi];     //发送段码
  43. j = 10;      //扫描间隔时间设定
  44. while(j--);
  45. duan = 0x00;   //消隐
  46. i++;

  47. wei = wei1[i]; //发送位选
  48. duan = duan1[ge];     //发送段码
  49. j = 10;      //扫描间隔时间设定
  50. while(j--);
  51. duan = 0x00;   //消隐
  52. }

  53. void init()
  54. {
  55. key1=1;
  56. key2=1;
  57. key3=1;
  58. key4=1;
  59. TMOD=0X01;
  60. TH0=(65536-45872)/256;
  61. TL0=(65536-45872)%256;
  62. EA=1;
  63. ET0=1;
  64. }

  65. void s(unsigned char xms)
  66. {
  67. unsigned char x,y;
  68. for(x=xms;x>0;x--)
  69.   for(y=110;y>0;y--);
  70. }
  71. void times() interrupt 1
  72. {
  73. TH0=(65536-45872)/256;
  74. TL0=(65536-45872)%256;
  75. b++;
  76. if(b==20)
  77. {
  78.   b=0;
  79.   a++;
  80.   if(a==256)
  81.   {
  82.    a=0;
  83.   }
  84. }
  85. }
  86. void keys()
  87. {
  88. if(key1==0)
  89. {
  90.   s(10);
  91.   if(key1==0)
  92.   {
  93.    a++;
  94.    TR0=0;
  95.    if(a==256)
  96.    a=0;
  97.    while(!key1)
  98.    DigDisplay();
  99.   }
  100. }

  101. if(key2==0)
  102. {
  103.   s(10);
  104.   if(key2==0)
  105.   {
  106.    TR0=0;
  107.    if(a==0)
  108.    a=256;
  109.    a--;
  110.    while(!key2)
  111.    DigDisplay();
  112.   }
  113. }

  114. if(key3==0)
  115. {
  116.   s(10);
  117.   if(key3==0)
  118.   {
  119.    TR0=0;
  120.    a=0;
  121.    while(!key3)
  122.    DigDisplay();
  123.   }
  124. }

  125. if(key4==0)
  126. {
  127.   s(10);
  128.   if(key4==0)
  129.   {
  130.    while(!key4)
  131.    DigDisplay();
  132.    TR0=~TR0;
  133.   }
  134. }

  135. }



Harvard 发表于 2016-2-29 18:29 | 显示全部楼层
这种代码就不要拿出来了. 此种死等延时的按键程序容易误导新人. 还是要实实在在用好状态机.
舒斯特尔 发表于 2016-2-29 19:47 | 显示全部楼层
这种代码怎么没有消抖啊,现在加入操作系统里面,这种写法已经过时了
cowboy2014 发表于 2016-3-5 20:12 | 显示全部楼层
这种样子的代码太古老了,现在都有新的形势了,还简单
mintspring 发表于 2016-3-5 20:22 | 显示全部楼层
死等延时的按键程序容易误导新人,浪费系统资源
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

294

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部