找回密码
 立即注册

QQ登录

只需一步,快速开始

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

时钟——数码管显示,大佬解释下代码呗

[复制链接]
跳转到指定楼层
楼主
ID:361716 发表于 2018-6-29 13:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "reg52.h"
  2. #include "intrins.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar code ledcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 0-9,-
  6. #define codport P0
  7. #define sitport P2
  8. sbit LSA=P2^2;
  9. sbit LSB=P2^1;
  10. sbit LSC=P2^0;
  11. uchar data disbuf[]={10, 10, 10, 10, 10, 10, 10, 10,};
  12. uchar data hou=23,min=59,s=50,num;
  13. uchar naoling[]={0,0,0};
  14. bit flag=0;
  15. sbit beep=P3^1;
  16. //************//延时************//
  17. void delay(unsigned int i)
  18. {
  19.         while(i--);        
  20. }

  21. //************//数码管动态扫描************//
  22. void display()
  23. {
  24.         unsigned int i;
  25.         for(i=0;i<8;i++)
  26.         {
  27.                 switch(i)
  28.                 {
  29.                         case(0):
  30.                                 LSA=0;LSB=0;LSC=0; break;
  31.                         case(1):
  32.                                 LSA=1;LSB=0;LSC=0; break;
  33.                         case(2):
  34.                                 LSA=0;LSB=1;LSC=0; break;
  35.                         case(3):
  36.                                 LSA=1;LSB=1;LSC=0; break;
  37.                         case(4):
  38.                                 LSA=0;LSB=0;LSC=1; break;
  39.                         case(5):
  40.                                 LSA=1;LSB=0;LSC=1; break;
  41.                         case(6):
  42.                                 LSA=0;LSB=1;LSC=1; break;
  43.                         case(7):
  44.                                 LSA=1;LSB=1;LSC=1; break;
  45.                 }
  46.                 codport = ledcode[disbuf[i]];
  47.                 delay(100);
  48.                 P0=0x00;
  49.         }
  50. }

  51. //************//矩阵按键************//
  52. unsigned char Key()
  53. {
  54.         unsigned char Row, Col, k;
  55.         P1 = 0x0f;
  56.         k=P1&0x0f;
  57.         if(k == 0x0f)
  58.                 return -1;
  59.         delay(12);
  60.         k = P1&0x0f;
  61.         if(k == 0x0f)
  62.                 return -1;
  63.         for(Row = 0; Row < 4; Row++)
  64.         {
  65.                 P1 = 0x7f>>Row;
  66.                 k = P1&0x0f;
  67.                 if(k!=0x0f)
  68.                 {
  69.                         Col = 0;
  70.                         while(k&(1<<Col))
  71.                                 Col++;
  72.                         break;
  73.                 }
  74.         }
  75.         while((P1&0x0f)!=0x0f);
  76.         k = Row + Col * 4;
  77.         return k;
  78. }

  79. //************//定时器0中断函数************//
  80. void time0() interrupt 1
  81. {
  82.         T0 = 55536%256;
  83.         TH0 = 55536/256;
  84.         num = num+1;
  85.         if(num > 99)
  86.         {
  87.                 num = 0;
  88.                 s = s + 1;
  89.                 if(s > 59)
  90.                 {
  91.                         s = 0;
  92.                         min = min + 1;
  93.                 }
  94.                         if(min > 59)
  95.                         {
  96.                                 min = 0;
  97.                                 hou = hou + 1;
  98.                         }
  99.                                 if(hou > 23)
  100.                                 {
  101.                                         hou = 0;
  102.                                 }
  103.                                 if((min==0)&&(s==0))
  104.                                 {
  105.                                         beep=~beep;
  106.                                         delay(300);
  107.                                        
  108.                                 }
  109.                 if(flag == 0)
  110.                 {
  111.                         disbuf[0] = hou/10;
  112.                         disbuf[1] = hou%10;
  113.                         disbuf[2] = 10;
  114.                         disbuf[3] = min/10;
  115.                         disbuf[4] = min%10;
  116.                         disbuf[5] = 10;
  117.                         disbuf[6] = s/10;
  118.                         disbuf[7] = s%10;
  119.                 }
  120.                 else
  121.                 {
  122.                         disbuf[0] = naoling[0]/10;
  123.                         disbuf[1] = naoling[0]%10;
  124.                         disbuf[2] = 10;
  125.                         disbuf[3] = naoling[1]/10;
  126.                         disbuf[4] = naoling[1]%10;
  127.                         disbuf[5] = 10;
  128.                         disbuf[6] = naoling[2]/10;
  129.                         disbuf[7] = naoling[2]%10;
  130.                 }
  131.         }
  132. }

  133. //************//选择矩阵按键************//
  134. void keyProcess(uchar k)
  135. {
  136.         if(k == 0)
  137.         {
  138.                 flag = ~flag;
  139.         }
  140.         if(flag == 0)
  141.         {
  142.                 if(k == 7){
  143.                         if(hou<=24){hou+=10;}
  144.                         else{hou=hou%10;}
  145.                 }
  146.                 if(k == 11){
  147.                         if(hou<=24){hou+=1;}
  148.                         else{hou=hou/10;}
  149.                 }
  150.                 if(k == 6){
  151.                         if(min<=60){min+=10;}
  152.                         else{min=min%10;}
  153.                 }
  154.                 if(k == 10){
  155.                         if(min<=60){min += 1;}
  156.                         else{min=min/10;}
  157.                 }
  158.                 if(k == 5){
  159.                         if(s<=60){s += 10;}
  160.                         else{s=s%10;}
  161.                 }
  162.                 if(k == 9){
  163.                         if(s<=60){s += 1;}
  164.                         else{s=s/10;}
  165.                 }
  166.         }        
  167. }

  168. //************//主函数************//
  169. void main()
  170. {
  171.         uchar k;
  172.         TMOD = 0x01;
  173.         TL0 = 55536%256;
  174.         TH0 = 55536/256;
  175.         ET0 =1;
  176.         EA = 1;
  177.         TR0 = 1;
  178.         while(1)
  179.         {
  180.                 display();
  181.                 k = Key();
  182.                 keyProcess(k);
  183.         }
  184. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:362076 发表于 2018-6-30 09:11 | 只看该作者
可以看到,主函数中保持循环的有这三个函数:
display();//用于显示某固定数组中的值
Key();//执行矩阵键盘扫描,返回定义的键值给K
keyProcess(k);//按键处理,根据采集的键值对时间进行相应的处理
程序不断运行,调用定时器0每过一段时间刷新时间值,并更新显示数组,同时根据键扫描结果修改显示的时间值,就酱。

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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