找回密码
 立即注册

QQ登录

只需一步,快速开始

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

普中HC6800-ES V2.0开发板8X8点阵时钟

[复制链接]
跳转到指定楼层
楼主
ID:87686 发表于 2018-9-7 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用8X8点阵流动显示时间,三个按键用来设置时间。
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. //--定义要使用的IO口--//
  4. #define COMMONPORTS                P0
  5. sbit SRCLK= P3 ^ 6;
  6. sbit RCLK = P3 ^ 5;
  7. sbit SER  = P3 ^ 4;
  8. sbit KEY1 = P3 ^ 0; //按键2用于时间设置
  9. sbit KEY2 = P3 ^ 2; //按键3用于时间设置加
  10. sbit KEY3 = P3 ^ 3;        //按键4用于时间设置减

  11. unsigned char Time,time_hrs=20,time_min=59,time_sec=35;
  12. unsigned char MENU;//菜单切换标志位
  13. //--列选通控制--//
  14. unsigned char code TAB[8]  = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

  15. //--点阵字码--//
  16. unsigned char code CHARCODE [113]=
  17. {
  18. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空白
  19. 0x3e,0x41,0x41,0x41,0x3e,0x00,          //0
  20. 0x11,0x21,0x7F,0x01,0x01,0x00,          //1
  21. 0x21,0x43,0x45,0x49,0x31,0x00,          //2
  22. 0x22,0x41,0x49,0x49,0x36,0x00,          //3
  23. 0x0C,0x14,0x24,0x7F,0x04,0x00,          //4
  24. 0x72,0x51,0x51,0x51,0x4E,0x00,          //5
  25. 0x3E,0x49,0x49,0x49,0x26,0x00,          //6
  26. 0x40,0x47,0x48,0x50,0x60,0x00,          //7
  27. 0x36,0x49,0x49,0x49,0x36,0x00,          //8
  28. 0x32,0x49,0x49,0x49,0x3E,0x00,          //9
  29. 0x36,0x36,0x00,                                  //:
  30. 0x3E,0x2A,0x3E,0x00,0x14,0x11,0x7F,0x10,0x00,                   //时
  31. 0xBF,0x40,0xBE,0xAA,0xBE,0x81,0xFF,0x00,             //间
  32. 0xA0,0x60,0x3F,0x02,0x58,0xD5,0x92,0xD6,0x59,0x00,         //设
  33. 0xD1,0xDF,0xD5,0xF5,0xD5,0xDF,0xD1,                                   //置  
  34. 0x11,0x22,0x54,0x18,0x91,0x5F,0x20,0x10,             //分
  35. };

  36. unsigned char WS[50];//用来存放要显示的位数的值

  37. /*******************************************************************************
  38. * 函数名         : buffer_normal();
  39. * 函数功能                 : 正常显示缓冲数组
  40. * 输入           : 无
  41. * 输出                  : 无
  42. *******************************************************************************/
  43. void buffer_normal()                                        //正常显示数组
  44. {
  45.         unsigned char a,b,c,d,e,f,g;
  46.         for(g=35;g<43;g++)                                                        //空白
  47.         {
  48.                 WS[g]=CHARCODE[g-35];
  49.         }       

  50.         for(f=29;f<35;f++)                                                        //分钟个位
  51.         {                                                                                       
  52.                 WS[f]=CHARCODE[time_min%10*6+f-21];
  53.         }       
  54.                
  55.         for(e=23;e<29;e++)
  56.         {                                                                                        //分钟十位
  57.                 WS[e]=CHARCODE[time_min%100/10*6+e-15];
  58.         }
  59.        
  60.         for(d=20;d<23;d++)                                                        //秒点
  61.         {       
  62.                 WS[d]=CHARCODE[d+48];
  63.         }
  64.        
  65.         for(c=14;c<20;c++)                                                        //小时个位
  66.         {
  67.                 WS[c]=CHARCODE[time_hrs%10*6+c-6];
  68.         }       

  69.         for(b=8;b<14;b++)                                                        //小时十位
  70.         {
  71.                 WS[b]=CHARCODE[time_hrs%100/10*6+b];       
  72.         }       

  73.         for(a=0;a<8;a++)                                                        //空白
  74.         {
  75.                 WS[a]=CHARCODE[a];
  76.         }
  77. }
  78. /*******************************************************************************
  79. * 函数名         : timeset();
  80. * 函数功能                 : 时间设置显示缓冲数组
  81. * 输入           : 无
  82. * 输出                  : 无
  83. *******************************************************************************/
  84. void timeset()                                        //时间设置
  85. {
  86.         unsigned char a,b,c;

  87.         for(c=42;c<50;c++)                                        //空白
  88.         {
  89.                 WS[c]=CHARCODE[c-42];
  90.         }       

  91.         for(b=8;b<42;b++)                                        //时间设置               
  92.         {
  93.                 WS[b]=CHARCODE[b+63];
  94.         }

  95.                 for(a=0;a<8;a++)                                //空白
  96.         {
  97.                 WS[a]=CHARCODE[a];
  98.         }
  99.        
  100. }
  101. /*******************************************************************************
  102. * 函数名         : Hour_setting();
  103. * 函数功能                 : 小时设置显示缓冲数组
  104. * 输入           : 无
  105. * 输出                  : 无
  106. *******************************************************************************/
  107. void Hour_setting()                                        //小时设置显示缓冲数组
  108. {
  109.         unsigned char a,b,c,d,e;
  110.         for(e=28;e<36;e++)                                                        //空白
  111.         {
  112.                 WS[e]=CHARCODE[e-28];
  113.         }       
  114.        
  115.         for(d=20;d<28;d++)                                                        //时
  116.         {       
  117.                 WS[d]=CHARCODE[d+51];
  118.         }
  119.        
  120.         for(c=14;c<20;c++)                                                        //小时个位
  121.         {
  122.                 WS[c]=CHARCODE[time_hrs%10*6+c-6];
  123.         }       

  124.         for(b=8;b<14;b++)                                                        //小时十位
  125.         {
  126.                 WS[b]=CHARCODE[time_hrs%100/10*6+b];       
  127.         }       

  128.         for(a=0;a<8;a++)                                                        //空白
  129.         {
  130.                 WS[a]=CHARCODE[a];
  131.         }
  132. }
  133. /*******************************************************************************
  134. * 函数名         : Minute_setting();
  135. * 函数功能                 : 分钟设置显示缓冲数组
  136. * 输入           : 无
  137. * 输出                  : 无
  138. *******************************************************************************/
  139. void Minute_setting()                                        //分钟设置显示缓冲数组
  140. {
  141.         unsigned char a,b,c,d,e;
  142.         for(e=28;e<36;e++)                                                        //空白
  143.         {
  144.                 WS[e]=CHARCODE[e-28];
  145.         }       
  146.        
  147.         for(d=20;d<28;d++)                                                        //分
  148.         {       
  149.                 WS[d]=CHARCODE[d+85];
  150.         }

  151.         for(c=14;c<20;c++)                                                        //分钟个位
  152.         {                                                                                       
  153.                 WS[c]=CHARCODE[time_min%10*6+c-6];
  154.         }       
  155.                
  156.         for(b=8;b<14;b++)
  157.         {                                                                                        //分钟十位
  158.                 WS[b]=CHARCODE[time_min%100/10*6+b];
  159.         }

  160.         for(a=0;a<8;a++)                                                        //空白
  161.         {
  162.                 WS[a]=CHARCODE[a];
  163.         }
  164. }

  165. /*******************************************************************************
  166. * 函数名         : delay();
  167. * 函数功能                 : 延时
  168. * 输入           : 无
  169. * 输出                  : 无
  170. *******************************************************************************/                  
  171. void delay(unsigned int time)
  172. {
  173.   unsigned int i,j;
  174.   for(i=0;i<time;i++)
  175.     for(j=0;j<47;j++);
  176. }
  177. /*******************************************************************************
  178. * 函数名         : TimerConfiguration();
  179. * 函数功能                 : 配置定时器值
  180. * 输入           : 无
  181. * 输出                  : 无
  182. *******************************************************************************/                  
  183. void TimerConfiguration()
  184. {
  185.     TMOD = 0x01; //选择工作方式1
  186.     TH0 = 0x3C;         //设置初始值,定时50MS
  187.     TL0 = 0xB0;
  188.     EA = 1;                         //打开总中断
  189.     ET0 = 1;                 //打开定时器0中断
  190.     TR0 = 1;                 //启动定时器0
  191. }
  192. /*******************************************************************************
  193. * 函数名         : Timer0()
  194. * 函数功能                 : 定时器0中断函数
  195. * 输入           : 无
  196. * 输出                  : 无
  197. *******************************************************************************/                  
  198. void Timer0() interrupt 1
  199. {
  200.         TH0 = 0x3C;         //设置初始值50ms
  201.     TL0 = 0xB0;
  202.         Time++;
  203.         if(Time==20)                                         
  204.         {  
  205.                  Time=0;
  206.                  time_sec++;                                 
  207.                  if(time_sec==60)
  208.                  {
  209.                                 time_sec=0;
  210.                                 time_min++;
  211.                                 if(time_min==60)
  212.                                 {
  213.                                         time_min=0;
  214.                                         time_hrs++;
  215.                                         if(time_hrs==24)
  216.                                         {
  217.                                                 time_hrs=0;
  218.                                         }
  219.                                 }
  220.                  }
  221.         }
  222. }

  223. /*******************************************************************************
  224. * 函数名         : Hc595SendByte(unsigned char dat);
  225. * 函数功能                 : 向74H595发送一个字节的数据
  226. * 输入           : 无
  227. * 输出                  : 无
  228. *******************************************************************************/
  229. void Hc595SendByte(unsigned char dat)
  230. {
  231.         unsigned char a;
  232.         SRCLK=0;
  233.         RCLK=0;
  234.         for(a=0;a<8;a++)
  235.         {
  236.                 SER=dat>>7;
  237.                 dat<<=1;

  238.                 SRCLK=1;
  239.                 _nop_();
  240.                 _nop_();
  241.                 SRCLK=0;       
  242.         }

  243.         RCLK=1;
  244.         _nop_();
  245.         _nop_();
  246.         RCLK=0;
  247. }
  248. /*******************************************************************************
  249. * 函数名         : display();
  250. * 函数功能                 : 显示函数
  251. * 输入           : 无
  252. * 输出                  : 无
  253. *******************************************************************************/
  254. void  display(unsigned char array)
  255. {
  256.         unsigned char tab;
  257.         unsigned int  a,b,c;

  258.                 for(a=0;a<8;a++)
  259.                 {
  260.                         if(a ==7)
  261.                         {
  262.                                 b++;
  263.                                 if(b==array)                           //数组数量减8      
  264.                                 {
  265.                                         b=0;
  266.                                 }
  267.                         }
  268.                         for(c=0;c<2;c++)                                            //控制流动速度
  269.                         {               
  270.                                 for(tab=0;tab<8;tab++)
  271.                                 {       
  272.                                         Hc595SendByte(0x00);                    //消隐                                                                                                                               
  273.                                         COMMONPORTS        = TAB[tab];                    //P0输出字码       
  274.                                         Hc595SendByte(WS[tab+b]);       
  275.                                         delay(1);
  276.                                 }
  277.                         }
  278.                 }
  279. }
  280. /*******************************************************************************
  281. * 函数名         : array_clear();
  282. * 函数功能                 : 缓冲数组清零函数
  283. * 输入           : 无
  284. * 输出                  : 无
  285. *******************************************************************************/
  286. void  array_clear()
  287. {
  288.         unsigned int  a;

  289.                 for(a=0;a<50;a++)
  290.                 {
  291.                         WS[a]=0;
  292.                 }
  293. }

  294. /*******************************************************************************
  295. * 函数名         : main
  296. * 函数功能                   : 主函数
  297. * 输入           : 无
  298. * 输出                  : 无
  299. *******************************************************************************/

  300. void main()
  301. {       
  302.         unsigned char s=0;
  303.         MENU=0;
  304.         TimerConfiguration();
  305.         while(1)
  306.         {       
  307.                 if(KEY1==0)
  308.                 {
  309.                         s++;
  310.                         if(s>2)
  311.                         {
  312.                                  s=0;MENU++;
  313.                         }               
  314.                 }

  315.                 if(MENU==0)                           //正常走时
  316.                 {
  317.                         array_clear();
  318.                         buffer_normal();
  319.                         display(35);
  320.                 }

  321.                 if(MENU==1)                           //显示时间设置
  322.                 {
  323.                         timeset();
  324.                         display(42);
  325.                 }

  326.                 if(MENU==2)                           //小时设置
  327.                 {
  328.                         array_clear();
  329.                         if(KEY2==0)
  330.                         {
  331.                                  s++;
  332.                                 if(s>2)
  333.                                 {
  334.                                         s=0;time_hrs++;                 //小时加
  335.                                         if(time_hrs>23)
  336.                                         {
  337.                                                   time_hrs=0;
  338.                                         }
  339.                                 }
  340.                         }

  341.                         if(KEY3==0)
  342.                         {
  343.                                  s++;
  344.                                 if(s>2)
  345.                                 {
  346.                                         s=0;time_hrs--;                 //小时减
  347.                                         if(time_hrs>24)
  348.                                         {
  349.                                                   time_hrs=23;
  350.                                         }
  351.                                 }
  352.                         }

  353.                         Hour_setting();
  354.                         display(28);
  355.                 }

  356.                 if(MENU==3)                           //分钟设置
  357.                 {
  358.                         array_clear();
  359.                         if(KEY2==0)
  360.                         {
  361.                                  s++;
  362.                                 if(s>2)
  363.                                 {
  364.                                         s=0;time_min++;                 //分钟加
  365.                                         if(time_min>59)
  366.                                         {
  367.                                                   time_min=0;
  368.                                         }
  369.                                 }
  370.                         }

  371.                         if(KEY3==0)
  372.                         {
  373.                                  s++;
  374.                                 if(s>2)
  375.                                 {
  376.                                         s=0;time_min--;                 //分钟减
  377.                                         if(time_min>60)
  378.                                         {
  379.                                                   time_min=59;
  380.                                         }
  381.                                 }
  382.                         }

  383.                         Minute_setting();
  384.                         display(28);
  385.                 }

  386.                 if(MENU>3)
  387.                 {
  388.                          MENU=0;
  389.                         time_sec=0;
  390.                 }

  391.         }       
  392. }
复制代码

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

使用道具 举报

沙发
ID:619942 发表于 2019-12-23 12:55 | 只看该作者
优秀大佬
回复

使用道具 举报

板凳
ID:1064915 发表于 2023-6-2 11:40 | 只看该作者
程序很严谨
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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