找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2604|回复: 5
收起左侧

为什么单片机数码管电子钟按键是黑一下屏?

[复制链接]
ID:261485 发表于 2018-8-7 23:38 | 显示全部楼层 |阅读模式
我的数码管电子钟什么都没问题了,可就是按键调时间时,一按下按键整个频就黑了,松开又亮了,而且功能也都实现了,就是按下按键时会黑一下,请问各位大佬是怎么回事呢???????我在板子上实现的,应该是我的程序不完善,下面是我的程序。。。。。希望各位大佬帮忙解答下。。。。。

单片机源程序如下:
  1. #include<reg51.h>

  2. typedef unsigned int u16;
  3. typedef unsigned char u8;

  4. u8 ms0;
  5. u8 sec;
  6. u8 min;
  7. u8 hour;

  8. sbit LSA=P2^2;
  9. sbit LSB=P2^3;
  10. sbit LSC=P2^4;

  11. sbit k1=P3^1;
  12. sbit k2=P3^0;
  13. sbit k3=P3^2;
  14. sbit k4=P3^3;

  15. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };

  16. void delay(u8 i)
  17. {
  18.    i--;
  19. }


  20. void keyscan();
  21. void display();


  22. void main()
  23. {       
  24.               P0=0X00;
  25.              TMOD|=0X01;
  26.                  TH0=(65536-49960)/256;
  27.                  TL0=(65536-49960)%256;
  28.                  EA=1;
  29.                  ET0=1;
  30.                  TR0=1;

  31.                  while(1)
  32.                  {
  33.               display();
  34.                  }
  35.    
  36. }
  37. void display()
  38. {
  39.    while(1)
  40.    {
  41.       LSA=0;LSB=0;LSC=0;
  42.           P0=smgduan[sec%10];
  43.           delay(2);
  44.           P0=0x00;

  45.           LSA=1;LSB=0;LSC=0;
  46.           P0=smgduan[sec/10];
  47.           delay(2);
  48.           P0=0x00;

  49.           LSA=0;LSB=1;LSC=0;
  50.           P0=0x40;
  51.           delay(2);
  52.           P0=0x00;

  53.           LSA=1;LSB=1;LSC=0;
  54.           P0=smgduan[min%10];
  55.           delay(2);
  56.           P0=0x00;

  57.           LSA=0;LSB=0;LSC=1;
  58.           P0=smgduan[min/10];
  59.           delay(2);
  60.           P0=0x00;

  61.           LSA=1;LSB=0;LSC=1;
  62.           P0=0x40;
  63.           delay(2);
  64.           P0=0x00;
  65.           
  66.           LSA=0;LSB=1;LSC=1;
  67.           P0=smgduan[hour%10];
  68.           delay(2);
  69.           P0=0x00;

  70.           LSA=1;LSB=1;LSC=1;
  71.           P0=smgduan[hour/10];
  72.           delay(2);
  73.           P0=0x00;

  74.    }
  75. }


  76. void T0_time() interrupt 1
  77. {
  78.      TH0=(65536-49960)/256;
  79.          TL0=(65536-49960)%256;
  80.          ms0++;
  81.          if(ms0>=20)      
  82.          {
  83.                 ms0=0;
  84.             sec++;
  85.                 if(sec>=60)
  86.                 {
  87.                    sec=0;
  88.                    min++;
  89.                    if(min>=60)
  90.                    {
  91.                       min=0;
  92.                       hour++;
  93.                           if(hour>=20)
  94.                           hour=0;
  95.                    }
  96.                 }
  97.          }
  98.          keyscan();
  99. }
  100. /*void digdisplay()
  101. {
  102.     switch(a)
  103.         {
  104.             case(0):
  105.                         LSA=0;LSB=0;LSC=0;break;
  106.                 case(1):
  107.                         LSA=0;LSB=0;LSC=1;break;
  108.             case(2):
  109.                         LSA=0;LSB=1;LSC=0;break;
  110.                 case(3):
  111.                         LSA=0;LSB=1;LSC=1;break;
  112.                 case(4):
  113.                         LSA=1;LSB=0;LSC=0;break;
  114.             case(5):
  115.                         LSA=1;KSB=0;LSC=1;break;
  116.                 case(6):
  117.                         LSA=1;LSB=1;LSC=0;break;
  118.                 case(7):
  119.                         LSA=1;LSB=1;LSC=1;break;
  120.         }
  121. }  */

  122. void keyscan()
  123. {
  124.    if(k1==0)
  125.      {
  126.              delay(5);
  127.                  if(k1==0)
  128.                  {
  129.                     min--;
  130.                         if(min>=60)
  131.                         min=0;
  132.                  }
  133.                  while(!k1);
  134.          }
  135.         if(k2==0)
  136.           {
  137.              delay(5);
  138.                  if(k2==0)
  139.                  {
  140.                     min++;
  141.                         if(min>=60)
  142.                         min=0;
  143.                  }
  144.                  while(!k2);
  145.           }
  146.          if(k3==0)
  147.            {
  148.               delay(5);
  149.                   if(k3==0)
  150.                   {
  151.                      hour--;
  152.                          if(hour>=24)
  153.                          hour=0;
  154.                   }
  155.                   while(!k3);
  156.            }
  157.           if(k4==0)
  158.           {
  159.              delay(5);
  160.                  if(k4==0)
  161.                  {
  162.                      hour++;
  163.                          if(hour>=24)
  164.                          hour=0;
  165.                  }
  166.                  while(!k4);
  167.           }
  168. }
复制代码

所有资料51hei提供下载:
数码管.zip (24.99 KB, 下载次数: 5)
回复

使用道具 举报

ID:213173 发表于 2018-8-8 06:43 | 显示全部楼层
你的按键扫描程序使用while(!k1)死循环判断松手,并且按键扫描程序被放在定时器中断中,在此期间内单片机任何工作都停止等待松手。
回复

使用道具 举报

ID:164602 发表于 2018-8-8 08:13 | 显示全部楼层
看了你的按键函数,就知道是你的程序问题了。
第一:为什么数码管会黑呢?因为没有执行显示部分的程序啊。
第二:为什么没有执行显示部分的程序呢?因为你按键程序用 while(!k1);占住了程序的执行啊——只要你不松手,数码管就会一直是黑的。
按键的松手消抖程序,不应该这样写,可能以前你都是这样写的,并且从来没有碰到问题,因为没有碰到这样的需要适时显示的情况。
这样写比较好:
for (i=0;((i<10)&&(k1==0));i++)
{
    Delay1ms();
}

评分

参与人数 2黑币 +27 收起 理由
凌净清河 + 15 学习了
咻咻修 + 12 赞一个!

查看全部评分

回复

使用道具 举报

ID:7485 发表于 2018-8-8 10:03 | 显示全部楼层
你可以使用“显示”函数来延时就不会这样了。根据显示函数的运行占用时间,确定循环几次,满足延时。
回复

使用道具 举报

ID:384109 发表于 2018-8-8 13:04 | 显示全部楼层
按键扫描不要放在定时器中断里,放在主程序的循环里,显示程序应该放在定时器里,这样不论按键扫描或其他的程序死循环,只要定时器正常运行,就都能显示了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:384167 发表于 2018-8-8 13:56 | 显示全部楼层
按键程序有问题,你按住按键程序就死在那,当然不执行显示程序了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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