找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机数码管显示时钟,4×4矩阵键盘设置(源程序加仿真)

  [复制链接]
跳转到指定楼层
楼主
数码管显示时间,矩阵键盘设置时间(仿真加程序)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)




单片机源程序如下:
  1. #include<REG51.H>
  2. #define LED P0//P0为数码管的段选
  3. #define WS P2//P2为数码管的位选

  4. char tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};//0~9最后 “—”号

  5. unsigned char sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi;//定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位
  6. unsigned char t;

  7. //---------------------------------------------------------------------
  8. //---------------------------------------------------------------------
  9. void initT0()
  10. {
  11. TMOD=0x01;//定义定时器0工作与方式1
  12. TH0=(65536-5000)/256;//定时器赋初值         
  13. TL0=(65536-5000)%256;         //50ms
  14. EA=1;//开总中断和T0中断
  15. ET0=1;
  16. }
  17. void TOint()interrupt 1
  18. {
  19.         TH0=(65536-50000)/256;//定时器赋初值         
  20.         TL0=(65536-50000)%256;
  21.         t++;
  22. }
  23. //--------------------------------延时子函数------------------------------------
  24. void Delay_ms(unsigned int x)                //延时Xms
  25. {
  26.         unsigned int i,j;
  27.         for(i=x;i>0;i--)
  28.                 for(j=110;j>0;j--);
  29. }
  30. //-------------------------------显示子函数---------------------------------------
  31. void display()
  32. {
  33. //        TR0=1;
  34.           if(t==20)
  35.         {
  36.            t=0;
  37.            sec++;//秒加1
  38.     }
  39.         if(sec==60)//如果秒为60,则清零,分加1
  40.          {
  41.            sec=0;
  42.            min++;
  43.          }
  44.         if(min==60)//如果分为60,则清零,时加1
  45.           {
  46.            min=0;
  47.            hour++;
  48.       }
  49.         if(hour==24)//如果时为24,则清零
  50.          {
  51.           hour=0;
  52.          }

  53. sec_ge=sec%10;//秒的个位和十位
  54. sec_shi=sec/10;
  55. min_ge=min%10;//分的个位和十位
  56. min_shi=min/10;
  57. hour_ge=hour%10;//时的个位和十位
  58. hour_shi=hour/10;

  59. WS=0x80;//循环扫描
  60. LED=tab[sec_ge];
  61. Delay_ms(1);
  62. WS=0x40;
  63. LED=tab[sec_shi];
  64. Delay_ms(1);

  65. //-//0X20
  66. WS=0x20;
  67. LED=tab[10];
  68. Delay_ms(1);

  69. WS=0x10;
  70. LED=tab[min_ge];
  71. Delay_ms(1);
  72. WS=0x08;
  73. LED=tab[min_shi];
  74. Delay_ms(1);

  75. //-//  0X04
  76. WS=0x04;
  77. LED=tab[10];
  78. Delay_ms(1);

  79. WS=0x02;
  80. LED=tab[hour_ge];
  81. Delay_ms(1);
  82. WS=0x01;
  83. LED=tab[hour_shi];
  84. Delay_ms(1);
  85. }

  86. void keyscan()                        
  87.             {
  88.                         unsigned char temp;
  89.                         P1=0xfe;                                        //第一行置低
  90.                         temp=P1;                                           //将P2口的值赋给temp
  91.                         temp=temp&0xf0;                                //将temp跟1111 0000 按位与
  92.                         if(temp!=0xf0)
  93.                         {
  94.                                 Delay_ms(10);
  95.                                 temp=P1;
  96.                                 temp=temp&0xf0;
  97.                                 if(temp!=0xf0)
  98.                                 {
  99.                                         temp=P1;
  100.                                         switch(temp)
  101.                                         {
  102.                                                 case 0xee:
  103.                                                 {
  104.                                                 sec++;
  105.                                                 if(sec==60)
  106.                                                 sec=0;
  107.                                                
  108.                                                 break;
  109.                                                 }
  110.                                                 case 0xde:
  111.                                                  {
  112.                                                         min++;
  113.                                                         if(min==60)
  114.                                                         min=0;
  115.                                                        
  116.                                                         break;
  117.                                              }
  118.                                                 case 0xbe:
  119.                                                  {
  120.                                                    hour++;
  121.                                                   if(hour==24)
  122.                                                         hour=0;
  123.                                                        
  124.                                                    break;
  125.                                                  }
  126.                                                   case 0x7e:
  127.                                                   break;
  128.                                         }
  129.                                         while(temp!=0xf0)
  130.                                         {        TR0=0;
  131.                                                 temp=P1;
  132.                                                 temp=temp&0xf0;
  133.                                         }                       
  134.                                 }
  135.            TR0=1;
  136.         }

  137.         P1=0xfd;                                        //第二行置低
  138.         temp=P1;                                           //将P2口的值赋给temp
  139.         temp=temp&0xf0;                                //将temp跟1111 0000 按位与
  140.         if(temp!=0xf0)
  141.         {
  142.                 Delay_ms(10);
  143.                 temp=P1;
  144.                 temp=temp&0xf0;
  145.                 if(temp!=0xf0)
  146.                 {
  147.                         temp=P1;
  148.                         switch(temp)
  149.                         {
  150.                                 case 0xed:
  151.                                
  152.                                 break;

  153.                                 case 0xdd:
  154.                                
  155.                                 break;

  156.                                 case 0xbd:
  157.                                
  158.                                 break;

  159.                                 case 0x7d:
  160.                                
  161.                                 break;
  162.                         }
  163.                         while(temp!=0xf0)
  164.                         {
  165.                                 temp=P1;
  166.                                 temp=temp&0xf0;
  167.                         }
  168.                 }
  169.         }

  170.         P1=0xfb;                                        //第二行置低
  171.         temp=P1;                                           //将P2口的值赋给temp
  172.         temp=temp&0xf0;                                //将temp跟1111 0000 按位与
  173.         if(temp!=0xf0)
  174.         {
  175.                 Delay_ms(10);
  176.                 temp=P1;
  177.                 temp=temp&0xf0;
  178.                 if(temp!=0xf0)
  179.                 {
  180.                         temp=P1;
  181.                         switch(temp)
  182.                         {
  183.                                 case 0xeb:
  184.                                 break;

  185.                                 case 0xdb:
  186.                                 break;

  187.                                 case 0xbb:
  188.                                
  189.                                 break;

  190.                                 case 0x7b:
  191.                                
  192.                                 break;
  193.                         }
  194.                         while(temp!=0xf0)
  195.                         {
  196.                                 temp=P1;
  197.                                 temp=temp&0xf0;
  198.                         }
  199.                 }
  200.         }

  201.         P1=0xf7;                                        //第二行置低
  202.         temp=P1;                                           //将P2口的值赋给temp
  203.         temp=temp&0xf0;                                //将temp跟1111 0000 按位与
  204.         if(temp!=0xf0)
  205.         {
  206.                 Delay_ms(10);
  207.                 temp=P1;
  208.                 temp=temp&0xf0;
  209.                 if(temp!=0xf0)
  210.                 {
  211.                         temp=P1;
  212.                         switch(temp)
  213.                         {
  214.                                 case 0xe7:
  215.                                
  216.                                 break;

  217.                                 case 0xd7:
  218.                                
  219.                                 break;

  220.                                 case 0xb7:
  221. ……………………

  222. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
数码管显示时间4×4键盘矩阵按键.rar (49.83 KB, 下载次数: 148)



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

使用道具 举报

沙发
ID:250151 发表于 2017-11-16 19:41 来自手机 | 只看该作者
收一波
回复

使用道具 举报

板凳
ID:250176 发表于 2017-11-16 20:20 | 只看该作者
学习中
回复

使用道具 举报

地板
ID:304767 发表于 2018-4-9 22:47 | 只看该作者
这不是52的单片机吗
回复

使用道具 举报

5#
ID:299355 发表于 2018-5-22 18:44 | 只看该作者
苏秦 发表于 2018-4-9 22:47
这不是52的单片机吗

51和52程序上的区别为0
回复

使用道具 举报

6#
ID:439430 发表于 2018-12-4 21:26 来自手机 | 只看该作者
请问有实现设置时间按那个键就显示那个键的么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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