找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2068|回复: 1
收起左侧

可上下左右滚动的可调式单片机16x64点钟时钟(源代码+仿真)

[复制链接]
ID:126738 发表于 2019-3-4 14:04 | 显示全部楼层 |阅读模式
可调式点阵时钟,带温度显示,proteus仿真,并且可以上下左右滚动

64点阵仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png 0.png 0.png

单片机源程序如下:
  1. // A B C D 对应P1.0; P1.1 ; P1.2; P1.3
  2. //--------------------------------
  3. #include "reg52.h"

  4. #define  uchar unsigned char
  5. #define  uint  unsigned int
  6. //========================
  7. //****滚屏事件定义****
  8. #define         MSG_MV_L         1         //左移
  9. #define         MSG_MV_R         2        //右移
  10. #define         MSG_MV_U    3        //上移
  11. #define         MSG_MV_D    4        //下移
  12. #define         MSG_NONE         0        //无
  13. uchar MSG_MV = 0;
  14. //========================
  15. //****显示状态定义****
  16. #define STA_gTIME        1        //滚动显示时间
  17. #define        STA_gTEMP        2        //滚动显示温度
  18. #define        STA_gWORD        3        //滚动显示文字
  19. #define        STA_sTIME        4        //静态显示时间
  20. #define        STA_sWEEK        5        //静态显示星期
  21. #define        STA_sDATE        6        //静态显示日期
  22. #define STA_sYEAR        7        //静态显示年份
  23. #define        STA_sTEMP        8        //静态显示温度
  24. #define        STA_sWORD        9        //静态显示文字
  25. #define STA_CHG                10        //校时模式
  26. #define STA_SONG        11        //滚动显示诗歌
  27. #define STA_COPYRIGHT        12        //开机显示
  28. uchar STATE = 1;
  29. //=========================
  30. //****校时状态定义****
  31. #define CHG_HOUR        1        //调整小时
  32. #define CHG_MIN                2        //调整分
  33. #define CHG_SEC                3        //调整秒
  34. #define CHG_MON                4        //调整月
  35. #define CHG_DAY                5        //调整日
  36. #define CHG_WEEK        6        //调整星期
  37. #define CHG_YEAR        7        //调整年
  38. uchar CHANGE = 1;
  39. uchar hide_times = 0;        //校时闪烁时间变量
  40. uchar HIDE = 0;                //隐藏显示标志位
  41. uchar TMP_TIME = 0;
  42. //=========================
  43. //****按键定义****
  44. sbit  key0 = P1^0;
  45. sbit  key1 = P1^1;
  46. sbit  key2 = P1^2;
  47. sbit  key3 = P1^3;

  48. #define KEY0        0x0e
  49. #define KEY1         0x0d
  50. #define KEY2         0x0b
  51. #define KEY3         0x07

  52. #define KEY0_S        0x0e        //KEY0短按下
  53. #define KEY1_S        0x0d        //KEY1短按下
  54. #define KEY2_S        0x0b        //KEY2短按下
  55. #define KEY3_S        0x07        //KEY3短按下
  56. #define KEY0_L        0x1e        //KEY0长按下
  57. #define KEY1_L        0x1d        //KEY1长按下
  58. #define KEY2_L        0x1b        //KEY2长按下
  59. #define KEY3_L        0x17        //KEY3长按下
  60. #define KEY_NONE        0        //无按键
  61. uchar MSG_KEY = KEY_NONE;
  62. uchar key_times = 0;        //持续时间
  63. uchar key_keep_times = 0;
  64. uchar cur_key_val = 0;
  65. uchar key_done = 0;        //按键事件有无做好
  66. uchar exit = 0;        //校时状态下长时间无按键退出
  67. //=========================
  68. //uchar time_read_times = 0;        //读时间
  69. //uchar tem_read_times = 0;        //读温度
  70. //=========================
  71. //****引脚定义****
  72. sbit  CLK =P2^5 ;                  //74HC595移时钟
  73. sbit  STB =P2^4        ;          // 74HC595锁存信号
  74. sbit  Red=P2^7        ;          //红色数据输出引脚低电平有效            
  75. sbit  Greed=P2^6;         //全屏控制使能0,低电平有效
  76. sbit  OE = P0^7;           //全屏使能
  77. //========================
  78. //****DS1302****
  79. sbit SCLK=P0^5;   //位定义1302芯片的接口,时钟输出端口定义在P2.4引脚
  80. sbit DATA=P0^6;   //位定义1302芯片的接口,数据输出端定义在P2.5引脚
  81. sbit RST=P0^7;    //位定义1302芯片的接口,复位端口定义在P2.6引脚

  82. typedef struct __SYSTEMTIME__
  83. {
  84.         uchar Second;
  85.         uchar Minute;
  86.         uchar Hour;
  87.         uchar Day;
  88.         uchar Month;
  89.         uchar Week;
  90.         uchar  Year;
  91. }SYSTEMTIME;        //定义的时间类型
  92. SYSTEMTIME Time;


  93. //=========================================
  94. //****18B20****
  95. sbit DQ = P0^4
  96. ;  //定义DS18B20端口DQ  

  97. unsigned char data  temp_data[2] = {0x00,0x00} ;
  98. unsigned char data  temp_ram[5] =   {0x00,0x00,0x00,0x00,0x00} ;
  99. unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  100.                                     0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  101. //==========================================
  102. bit presence  ;
  103. uchar SendData;                  //要发送的数据变量
  104. uchar hang;                        //行扫描变量  (半屏只有16行,所以hang=0到15)
  105. uchar move_times = 0;        //左右移动位数
  106. uchar start_word = 0;


  107. uchar data h_dispram[10];         //显示缓存
  108. uchar code *disword[26];        //显示文字指针


  109. void  Keyscan (void); //修改参数按键扫描子程序
  110. void  Sendping(); //发送半屏子程序
  111. void  Put_Wdispram(uchar first_word);//
  112. void  Put_Hdispram(); //把显示文字放入显示缓存
  113. void  Move_Left();        //左移
  114. void  Move_Right();        //右移
  115. void  RL_Move();
  116. void  UD_Move();
  117. void  Show_Line();
  118. void  Show_Move_Word(uchar code *WORDS[][8]);
  119. void  delay();
  120. void  SendByte(void);
  121. void  RowsCan(void);
  122. void  Disp_Temperature();
  123. void Put_gTEMP();
  124. void Change_obj();

  125. uchar ReadKey1();



  126. uchar code MY_WORDS[][16]=
  127.                                         {
  128. {0x21,0x11,0x11,0x02,0x97,0x52,0x52,0x12,0x2F,0x22,0xE2,0x22,0x23,0x20,0x20,0x20},


  129. **************详见51hei附件****************
  130. {0x00,0x00,0x80,0x04,0xFC,0x00,0x04,0xF8,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00},/*"宁",1*/
  131. {0x00,0x06,0x14,0x24,0x3F,0x44,0x7F,0x04,0x24,0x3F,0x24,0x24,0x25,0x04,0x00,0x00},
  132. {0x00,0x02,0x02,0x92,0x12,0x12,0xD2,0x12,0x52,0xD2,0x52,0x42,0x82,0x0C,0x04,0x00},/*"制",2*/
  133. {0x00,0x0C,0x08,0x09,0x11,0x1A,0x34,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00},
  134. {0x00,0xC0,0x80,0x04,0xF8,0x40,0x40,0x7C,0x40,0x40,0x44,0x78,0x40,0x40,0x00,0x00},/*"作",3*/
  135. };

  136. void Put_Wdispram(uchar code *WORDS[][8]){        //,uchar first_word
  137.         uchar i;
  138.         disword[0] = &NO_WORDS[12][0];
  139.         for(i=1;i<25;i++){
  140.                 disword[i] = &WORDS[i-1][0];        //first_word+
  141.         }
  142. }        

  143. void  Put_Hdispram(){
  144.         uchar i;
  145.         for(i=0;i<10;i++){
  146.                 h_dispram[i] = *(disword[i+start_word]+hang);        //
  147.         }
  148. }

  149. void Move_Left(){
  150.         uchar i;
  151.         for(i=0;i<9;i++){
  152.                 h_dispram[i] = (h_dispram[i] << (move_times)) | (h_dispram[i+1] >> (8-move_times));
  153.         }
  154. }

  155. void Move_Right(){
  156.         uchar i;
  157.         for(i=9;i>0;i--){
  158.                 h_dispram[i] = (h_dispram[i] >> (move_times)) | (h_dispram[i-1] << (8-move_times));
  159.         }
  160. }

  161. void RL_Move(){
  162.         //
  163.         switch(MSG_MV){
  164.                 case MSG_MV_L:        //左移
  165.                         Move_Left();
  166.                         break;
  167.                 case MSG_MV_R:        //右移
  168.                         Move_Right();
  169.                         break;
  170.                 case MSG_NONE:
  171.                         break;
  172.                 default:
  173.                         break;
  174.                 }
  175. }

  176. void Move_Up(){
  177.         //
  178.         uchar i,j,m,n;
  179.         for(m=0;m<16;m++){
  180.                 for(n=0;n<8;n++){
  181.                         for(j=0;j<16-m;j++){
  182.                                 for(i=0;i<10;i++){
  183.                                         h_dispram[i] = *(disword[i]+m+j);                //
  184.                                 }
  185.                                 Show_Line();
  186.                         }
  187.                         for(j=16-m;j<16;j++){
  188.                                 for(i=0;i<10;i++){
  189.                                         h_dispram[i] = *(disword[i+8]+m+j-16);                //0x00
  190.                                 }
  191.                                 Show_Line();
  192.                         }
  193.                 }
  194.         }
  195. }

  196. void Move_Down(){
  197.         //
  198.         uchar i,j,m,n;
  199.         for(m=0;m<16;m++){
  200.                 for(n=0;n<8;n++){
  201.                         for(j=0;j<m;j++){
  202.                                 for(i=0;i<10;i++){
  203.                                         h_dispram[i] = *(disword[i+8]+15-m+j);                //
  204.                                 }
  205.                                 Show_Line();
  206.                         }
  207.                         for(j=m;j<16;j++){
  208.                                 for(i=0;i<10;i++){
  209.                                         h_dispram[i] = *(disword[i]-m+j);                //0x00
  210.                                 }
  211.                                 Show_Line();
  212.                         }
  213.                 }
  214.         }
  215. }

  216. void UD_Move(){
  217.         //
  218.         switch(MSG_MV){
  219.                 case MSG_MV_U:        //左移
  220.                 //        Move_Up();
  221.                         break;
  222.                 case MSG_MV_D:        //右移
  223.                 //        Move_Down();
  224.                         break;
  225.                 case MSG_NONE:
  226.                         break;
  227.                 default:
  228.                         break;
  229.                 }
  230. }

  231. void Show_Line(){
  232.         uchar m;
  233.         OE=1;
  234.         for(m =0;m<8;m++)  
  235.         {        
  236.                 SendData = h_dispram[m+1];
  237.                 SendByte();
  238.         }
  239.         STB = 0;
  240.         STB = 1;                 //上升沿数据锁存
  241.         RowsCan();                //行扫描
  242.         OE = 0;
  243. //        delay();        //
  244. }

  245. void Show_sWord(){
  246.         int m,i;//
  247.         hang = 0;
  248.         for(m=0;m<14;m++){
  249.                 for(i=0;i<16;i++){
  250.                         Put_Hdispram();        //把第i行放入行缓冲
  251.                         Show_Line();
  252.                         //delay();        //看需要
  253.                 }
  254.                
  255.         }
  256. }
  257. void Show_Move_Word(uchar code *WORDS[][8]){
  258.         int m,i;
  259.         while(1){
  260.         for(m=0;m<6;m++){        //若要上下移动 m=16
  261.                 //hang = 0;
  262.                 for(i=0;i<16;i++){
  263.                         Put_Hdispram();        //把第i行放入行缓冲
  264.                         RL_Move();        //是否要左右移动
  265.                         Show_Line();
  266.                         //delay();        //看需要
  267.                 }
  268.         //UD_Move();        //是否要上下移动
  269.         }
  270.         //========================================
  271.         //测试左移右移        切换时有跳变!!
  272. //        if(MSG_MV){
  273.                 move_times++;
  274.                 if((move_times == 9) && (MSG_MV == MSG_MV_L)){
  275.                         move_times = 1;
  276.                         Put_Wdispram(WORDS);
  277.                         start_word++;
  278.                         switch(STATE){
  279.                                 case STA_gTEMP:
  280.                                         Read_Temperature();
  281.                                         Disp_Temperature();                                   //
  282.                                         Put_gTEMP();          //
  283.                                         if(start_word > (sizeof(TMP_WORDS)/16 - 8))
  284.                                                 MSG_MV = MSG_MV_R;
  285.                                         break;
  286.                                 case STA_gWORD:
  287.                                         if(start_word > (sizeof(MY_WORDS)/16 - 8))
  288.                                                 MSG_MV = MSG_MV_R;
  289.                                 default:
  290.                                         break;
  291.                         }
  292.                 if(start_word > (sizeof(TMP_WORDS)/16 - 4))
  293.                                 MSG_MV = MSG_MV_R;
  294.                 }
  295.                 else if((move_times == 9) && (MSG_MV == MSG_MV_R)){
  296.                         move_times = 1;
  297.                         Put_Wdispram(WORDS);  //
  298.                         start_word-- ;
  299.                         switch(STATE){
  300.                                 case STA_gTEMP:
  301.                                         Disp_Temperature();                                   //
  302.                                         Put_gTEMP();
  303.                                                 break;
  304.                                 default:
  305.                                         break;
  306.                         }
  307.                         if(start_word < 1){
  308.                                 MSG_MV = MSG_MV_L;
  309.                                 return;
  310.                         }
  311.                 }
  312. //        }
  313.                 }
  314. }
  315. void Show_All_Word(){
  316.         int m,i;
  317.         //MSG_MV = MSG_MV_L;
  318.         for(start_word = 0;start_word < 8;start_word++){
  319.                 for(move_times = 0; move_times < 8;move_times++){
  320.                         for(m=0;m<4;m++){        //若要上下移动 m=16
  321.                                 for(i=0;i<16;i++){
  322.                                         Put_Hdispram();        //把第i行放入行缓冲
  323.                                         RL_Move();        //是否要左右移动
  324.                                         Show_Line();
  325.                                 }
  326.                         }
  327.                 }
  328.         }
  329. }

  330. void delay()
  331. {
  332.         uint i;
  333.         for(i=0;i<40;i++);
  334. }                        
  335.         
  336. //------------------------------------
  337. //----------字发送子程序-----------
  338.         void SendByte(void)
  339.                 {
  340.                    uchar m;
  341.                    for(m=0;m<8;m++)
  342.                    {
  343.                                    CLK = 0;
  344.                                 Red = (SendData & 0x80);                  //红屏显示
  345.                     //        Greed =  (SendData & 0x80);                  //绿屏显示
  346.                                   SendData =SendData<<1;                        
  347.                                 CLK = 1;          //移位时钟上升沿
  348.                    }
  349.                 }
  350. //-----------------------------------
  351. //----------行扫描子程序-------------
  352.            void RowsCan(void)
  353.            {
  354.                         P2 = P2 & 0xf0;
  355.                         P2 = P2 | hang;
  356.                         hang++;
  357.                         if (hang>=16)
  358.                         {
  359.                                 hang =0x00;
  360.                         }
  361.                 }

  362.                 void initial(void)
  363.                    {
  364.                           OE = 1;
  365.                         Red = 1;
  366.                         Greed = 1;
  367.                         SendData = 0x00;
  368.                         hang = 0x00;
  369.                                                         
  370.                  }
  371. /*****************************************************
  372. 函数功能:延时若干微秒
  373. 入口参数:n
  374. ***************************************************/
  375. void delaynus(unsigned char n)
  376. {
  377. unsigned char i;
  378. // for(i=0;i<n;i++)
  379.       ;
  380. }
  381. /*****************************************************
  382. 函数功能:向1302写一个字节数据
  383. 入口参数:x
  384. ***************************************************/
  385. void Write1302(unsigned char dat)
  386. {
  387.   unsigned char i;
  388.   SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备
  389.   delaynus(2);       //稍微等待,使硬件做好准备
  390.   for(i=0;i<8;i++)      //连续写8个二进制位数据
  391.     {
  392.             DATA=dat&0x01;    //取出dat的第0位数据写入1302
  393.                 delaynus(2);       //稍微等待,使硬件做好准备
  394.                  SCLK=1;           //上升沿写入数据
  395.                  delaynus(2);      //稍微等待,使硬件做好准备
  396.                  SCLK=0;           //重新拉低SCLK,形成脉冲
  397.                  dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位
  398.           }
  399.         
  400. }
  401. /*****************************************************
  402. 函数功能:根据命令字,向1302写一个字节数据
  403. 入口参数:Cmd,储存命令字;dat,储存待写的数据
  404. ***************************************************/
  405. void WriteSet1302(unsigned char Cmd,unsigned char dat)
  406. {
  407.    RST=0;           //禁止数据传递
  408.    SCLK=0;          //确保写数居前SCLK被拉低
  409.         RST=1;           //启动数据传输
  410.         delaynus(2);     //稍微等待,使硬件做好准备
  411.         Write1302(Cmd);  //写入命令字
  412.         Write1302(dat);  //写数据
  413.         SCLK=1;          //将时钟电平置于已知状态
  414.         RST=0;           //禁止数据传递
  415. }
  416. /*****************************************************
  417. 函数功能:从1302读一个字节数据
  418. 入口参数:x
  419. ***************************************************/
  420. unsigned char Read1302(void)
  421. {
  422.    unsigned char i,dat;
  423.         delaynus(2);       //稍微等待,使硬件做好准备
  424.         for(i=0;i<8;i++)   //连续读8个二进制位数据
  425.          {
  426.            dat>>=1;       //将dat的各数据位右移1位,因为先读出的是字节的最低位
  427.                 if(DATA==1)    //如果读出的数据是1
  428.                  dat|=0x80;    //将1取出,写在dat的最高位
  429.                  SCLK=1;       //将SCLK置于高电平,为下降沿读出
  430.                  delaynus(2);  //稍微等待
  431.                  SCLK=0;       //拉低SCLK,形成脉冲下降沿
  432.                  delaynus(2);  //稍微等待
  433.           }         
  434.   return dat;        //将读出的数据返回
  435. }  
  436. /*****************************************************
  437. 函数功能:根据命令字,从1302读取一个字节数据
  438. 入口参数:Cmd
  439. ***************************************************/
  440. unsigned char  ReadSet1302(unsigned char Cmd)
  441. {
  442.   unsigned char dat;
  443.   RST=0;                 //拉低RST
  444.   SCLK=0;                //确保写数居前SCLK被拉低
  445.   RST=1;                 //启动数据传输
  446.   Write1302(Cmd);       //写入命令字
  447.   dat=Read1302();       //读出数据
  448.   SCLK=1;              //将时钟电平置于已知状态
  449.   RST=0;               //禁止数据传递
  450.   return dat;          //将读出的数据返回
  451. }
  452. /*****************************************************
  453. 函数功能: 1302进行初始化设置
  454. ***************************************************/
  455. void Init_DS1302(void)
  456. {        
  457.   unsigned char flag;
  458.    
  459.     flag= ReadSet1302(0x81);
  460.         if(flag&0x80)        {      //判断时钟芯片是否关闭
  461.    WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令
  462.    WriteSet1302(0x80,((0/10)<<4|(0%10)));   //根据写秒寄存器命令字,写入秒的初始值
  463.         WriteSet1302(0x82,((18/10)<<4|(18%10)));   //根据写分寄存器命令字,写入分的初始值
  464.         WriteSet1302(0x84,((21/10)<<4|(21%10))); //根据写小时寄存器命令字,写入小时的初始值
  465.         WriteSet1302(0x86,((23/10)<<4|(23%10))); //根据写日寄存器命令字,写入日的初始值
  466.         WriteSet1302(0x88,((7/10)<<4|(7%10))); //根据写月寄存器命令字,写入月的初始值
  467.         //WriteSet1302(0x8A,2);
  468.         WriteSet1302(0x8c,((10/10)<<4|(10%10)));   //根据写小时寄存器命令字,写入小时的初始值
  469.                 WriteSet1302(0x90,0xa5);
  470.         WriteSet1302(0x8E,0x80);
  471.   }
  472.   //如果不想每次都初始化时间,也就是掉电后还想让时钟继续走时的话 就用上面的语句


  473.   /*--------------------这是每次都初始化的语句-----------------*/
  474.     /* WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令
  475.    WriteSet1302(0x80,((0/10)<<4|(0%10)));   //根据写秒寄存器命令字,写入秒的初始值
  476.         WriteSet1302(0x82,((18/10)<<4|(18%10)));   //根据写分寄存器命令字,写入分的初始值
  477.         WriteSet1302(0x84,((21/10)<<4|(21%10))); //根据写小时寄存器命令字,写入小时的初始值
  478.         WriteSet1302(0x86,((23/10)<<4|(23%10))); //根据写日寄存器命令字,写入日的初始值
  479.         WriteSet1302(0x88,((7/10)<<4|(7%10))); //根据写月寄存器命令字,写入月的初始值
  480.         //WriteSet1302(0x8A,2);
  481.         WriteSet1302(0x8c,((10/10)<<4|(10%10)));   //根据写小时寄存器命令字,写入小时的初始值
  482.                 WriteSet1302(0x90,0xa5);
  483.         WriteSet1302(0x8E,0x80);
  484.         */



  485. }
  486. void write_time1302(){
  487.     WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令
  488.     WriteSet1302(0x80,Time.Second);   //根据写秒寄存器命令字,写入秒的初始值
  489.         WriteSet1302(0x82,Time.Minute);   //根据写分寄存器命令字,写入分的初始值
  490.         WriteSet1302(0x84,Time.Hour); //根据写小时寄存器命令字,写入小时的初始值
  491.         WriteSet1302(0x86,Time.Day); //根据写日寄存器命令字,写入日的初始值
  492.         WriteSet1302(0x88,Time.Month); //根据写月寄存器命令字,写入月的初始值
  493.         WriteSet1302(0x8A,Time.Week);
  494.         WriteSet1302(0x8c,Time.Year);   //根据写小时寄存器命令字,写入小时的初始值
  495.         //        WriteSet1302(0x90,0xa5);
  496.         //WriteSet1302(0x8E,0x80);        
  497. }

  498. //读时间
  499. void Read_TIME(){

  500.         RST=0;                 //拉低RST
  501.           SCLK=0;                //确保写数居前SCLK被拉低
  502.           RST=1;                 //启动数据传输
  503.           Write1302(0xbf);       //写入命令字
  504.         Time.Second = Read1302() & 0x7f;
  505.         Time.Minute = Read1302() & 0x7f;
  506.         Time.Hour = Read1302() & 0x7f;
  507.         Time.Day = Read1302() & 0x7f;
  508.         Time.Month = Read1302() & 0x7f;  
  509.          Time.Week= Read1302() & 0x7f;
  510.         Time.Year = Read1302() & 0x7f;
  511.         SCLK=1;          //将时钟电平置于已知状态
  512.         RST=0;           //禁止数据传递
  513.          
  514.         /*unsigned char ReadValue;   //储存从1302读取的数据
  515.         ReadValue = ReadSet1302(0x81);   //从秒寄存器读数据
  516.         Time.Second =ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F);//将读出数据转化
  517.          ReadValue = ReadSet1302(0x83);  //从分寄存器读
  518.      Time.Minute = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
  519.      ReadValue = ReadSet1302(0x85);  //从时寄存器读
  520.      Time.Hour = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
  521.      ReadValue = ReadSet1302(0x87);  //从分寄存器读
  522.      Time.Day = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
  523.          ReadValue = ReadSet1302(0x89);  //从分寄存器读
  524.      Time.Month = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
  525.         ReadValue = ReadSet1302(0x8B);  //从时寄存器读
  526.         Time.Week= ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化
  527.          ReadValue = ReadSet1302(0x8d);  //从分寄存器读                                                                           
  528.      Time.Year = ReadValue&0x7f;//(ReadValue&0x70) + (ReadValue&0x0F); //将读出数据转化  
  529.    
  530.    */ }

  531. void Put_Adispram(uchar a){
  532.         uchar i;
  533.         //第一屏"今天是:"
  534.         disword[a+1] = &NO_WORDS[12][0];        //空格
  535.         for(i=0;i<6;i++)
  536.                 disword[a+i+2] = &TIME_WORDS[i][0];
  537.         disword[a+8] = &NO_WORDS[11][0];        //":"
  538.         //第二屏
  539.         //disword[4] = &TIME_WORDS[];
  540.                
  541. }
  542.         
  543. //将年份放入到显示缓存
  544. //需要参数:缓冲区首地址下标
  545. void Put_Ydispram(uchar i){
  546.         disword[i+1] = &NO_WORDS[12][0];
  547.         if(Time.Year < 30 && !HIDE){
  548.                 disword[i+2] = &NO_WORDS[2][0];
  549.                 disword[i+3] = &NO_WORDS[0][0];
  550.                 }
  551.         else if(!HIDE){
  552.                 disword[i+2] = &NO_WORDS[1][0];
  553.                 disword[i+3] = &NO_WORDS[9][0];
  554.                 }
  555.         disword[i+4] = &NO_WORDS[Time.Year>>4][0];
  556.         disword[i+5] = &NO_WORDS[Time.Year&0x0f][0];
  557.         disword[i+6] = &TIME_WORDS[6][0];
  558.         disword[i+7] = &TIME_WORDS[7][0];        //年
  559.         disword[i+8] = &NO_WORDS[12][0];
  560. }        
  561. //将星期放入到显示缓存
  562. //参数:缓冲区首地址下标
  563. void Put_Kdispram(uchar i){
  564.         disword[i+1] = &NO_WORDS[12][0];                 
  565.         disword[i+2] = &TIME_WORDS[12][0];               
  566.         disword[i+3] = &TIME_WORDS[13][0];        //星期               
  567.         disword[i+4] = &TIME_WORDS[14][0];                 
  568.         disword[i+5] = &TIME_WORDS[15][0];
  569.         if(STATE== STA_CHG &&HIDE){
  570.                 disword[i+6] = &NO_WORDS[12][0];                //
  571.                 disword[i+7] = &NO_WORDS[12][0];                  //
  572.                 }
  573.         else{
  574.                 disword[i+6] = &WEEK_WORDS[Time.Week*2-2][0];                //
  575.                 disword[i+7] = &WEEK_WORDS[Time.Week*2-1][0];                  //
  576.                 }
  577.         disword[i+8] = &NO_WORDS[12][0];                 
  578. }

  579. //将日期放入到显示缓存
  580. //参数:缓冲区首地址下标
  581. void Put_Ddispram(uchar i){
  582.         disword[i+1] = &NO_WORDS[Time.Month>>4][0];                 //小时高位
  583.         disword[i+2] = &NO_WORDS[ Time.Month&0x0f][0];                //小时地位
  584.         disword[i+3] = &TIME_WORDS[8][0];                //-
  585.         disword[i+4] = &TIME_WORDS[9][0];                 //分钟高位
  586.         disword[i+5] = &NO_WORDS[ Time.Day>>4][0];                //分钟地位
  587.         disword[i+6] = &NO_WORDS[Time.Day&0x0f][0];                //-
  588.         disword[i+7] = &TIME_WORDS[10][0];                  //秒高位
  589.         disword[i+8] = &TIME_WORDS[11][0];                 //秒地位
  590. }

  591. //将时间放入到显示缓存
  592. //参数:缓冲区首地址下标
  593. void Put_Tdispram(uchar i){
  594.         disword[i+1] = &NO_WORDS[Time.Hour>>4][0];                 //小时高位
  595.         disword[i+2] = &NO_WORDS[ Time.Hour&0x0f][0];                //小时地位
  596.         disword[i+3] = &NO_WORDS[ 11 ];                //-
  597.         disword[i+4] = &NO_WORDS[Time.Minute>>4][0];                 //分钟高位
  598.         disword[i+5] = &NO_WORDS[ Time.Minute&0x0f][0];                //分钟地位
  599.         disword[i+6] = &NO_WORDS[ 11 ];                //-
  600.         disword[i+7] = &NO_WORDS[Time.Second>>4][0];                 //秒高位
  601.         disword[i+8] = &NO_WORDS[ Time.Second&0x0f][0];                //秒地位
  602. }
  603. //===================================
  604. //*****关于温度检测部分*****
  605. void Put_gTEMP(){
  606. //        uchar i;
  607. //        Put_Wdispram(TMP_WORDS,0);
  608.         disword[6] = &NO_WORDS[temp_ram[3]][0];                 //百位
  609.         disword[7] = &NO_WORDS[temp_ram[2]][0];                //十位
  610.         disword[8] = &NO_WORDS[temp_ram[1]][0];                //个位
  611.         disword[10] = &NO_WORDS[temp_ram[0]][0];                //小数
  612.         disword[12]        = &NO_WORDS[12];                //空格
  613.         disword[13]        = &NO_WORDS[12];                //空格
  614.          //
  615. }

  616. void Put_sTEMP(uchar i){
  617.         disword[i+1] = &NO_WORDS[12];                //空格
  618.         disword[i+2] = &NO_WORDS[12];//&NO_WORDS[temp_ram[3]][0];                 //百位
  619.         disword[i+3] = &NO_WORDS[temp_ram[2]][0];                //十位
  620.         disword[i+4] = &NO_WORDS[temp_ram[1]][0];                //个位
  621.         disword[i+5] = &TMP_WORDS[8][0];        //小数点
  622.         disword[i+6] = &NO_WORDS[temp_ram[0]][0];                //小数
  623.         disword[i+7] = &TMP_WORDS[10][0];
  624.         disword[i+8] = &NO_WORDS[12];                //空格
  625. }
  626. void Put_Cpyrt(uchar i){
  627.         uchar m;
  628.         for(m=0;m<8;m++)
  629.                 disword[i+1+m] = &CPYRT_WORDS[m];
  630. }
  631. void Show_Cpyrt(){
  632.         uchar i;
  633.         for(i=1;i<9;i++)
  634.                 disword[i] = &NO_WORDS[12];
  635.         Put_Cpyrt(8);
  636.         Move_Down();
  637.         Put_Cpyrt(0);
  638.         Put_Tdispram(8);
  639.         Move_Down();
  640. }
  641.         
  642. //========================
  643. //参数i:放入第几屏缓存
  644. //参数j:诗歌第几页
  645. //========================
  646. void Put_Song(uchar i,uchar j){
  647.         uchar m;
  648.         for(m=0;m<8;m++)
  649.                 disword[i+1+m] = &SONG_WORDS[j+m];
  650. }
  651. //显示诗歌
  652. void Show_Song(){
  653.         uchar i;
  654.         Put_Song(8,0);
  655.         Move_Up();
  656.         for(i=0;i<3;i++){
  657.                 Put_Song(0,i*8);
  658.                 Put_Song(8, (i+1)*8);
  659.                 Move_Up();
  660.                 }
  661.         Put_Song(0, 3*8);
  662.         Put_Tdispram(8);
  663.         Move_Up();
  664. }

  665.         
  666. //======================
  667. //*滚动显示所有信息*
  668. //======================
  669. void Show_All_Info(){
  670.         Put_Adispram(8);
  671.         Move_Down();        //切换效果
  672.         
  673.         Put_Adispram(0);
  674.         Put_Ydispram(8);        //XXXX年
  675.         Show_All_Word();
  676.         
  677.         Put_Ydispram(0);        //XXXX年
  678.         Put_Ddispram(8);
  679.         Show_All_Word();

  680.         Put_Ddispram(0);
  681.         Put_Kdispram(8);
  682.         Show_All_Word();

  683.         
  684.         Read_Temperature();
  685.         Disp_Temperature();
  686.         Put_Kdispram(0);
  687.         Put_Tdispram(8);
  688.         Show_All_Word();

  689.         Read_Temperature();
  690.         Disp_Temperature();
  691.         Put_Tdispram(0);
  692.         Put_sTEMP(8);
  693.         Show_All_Word();

  694.         Read_TIME();
  695.         Put_sTEMP(0);
  696.         Put_Tdispram(8);
  697.         Move_Up();
  698.         
  699. }

  700.         
  701. /*us级延时函数                                        */
  702. /*******************************************************************/

  703. void Delay(unsigned int num)
  704. {
  705.   num = num*2;
  706.   while( --num ) ;
  707. }

  708. /*初始化ds1820                                      */
  709. /*******************************************************************/
  710. Init_DS18B20(void)
  711. {  
  712.      DQ = 1 ;      //DQ复位
  713.      Delay(8) ;    //稍做延时

  714.      DQ = 0 ;      //单片机将DQ拉低
  715.      Delay(90) ;   //精确延时 大于 480us

  716.      DQ = 1 ;       //拉高总线
  717.      Delay(8) ;

  718.      presence = DQ ;    //如果=0则初始化成功 =1则初始化失败
  719.      Delay(100) ;
  720.      DQ = 1 ;
  721.      
  722.      return(presence) ; //返回信号,0=presence,1= no presence
  723. }


  724. /* 读一个字节                     */
  725. /*******************************************************************/
  726. ReadOneChar(void)
  727. {
  728. unsigned char i = 0 ;
  729. unsigned char dat = 0 ;

  730. for (i = 8 ; i > 0 ; i--)
  731.   {
  732.     DQ = 0 ; // 给脉冲信号
  733.     dat >>= 1 ;
  734.     DQ = 1 ; // 给脉冲信号

  735.     if(DQ)
  736.      dat |= 0x80 ;
  737.     Delay(4) ;
  738.   }

  739.     return (dat) ;
  740. }

  741. /* 写一个字节                                         */
  742. /*******************************************************************/
  743. WriteOneChar(unsigned char dat)
  744. {
  745.   unsigned char i = 0 ;
  746.   for (i = 8 ; i > 0 ; i--)
  747.   {
  748.     DQ = 0 ;
  749.     DQ = dat&0x01 ;
  750.     Delay(5) ;

  751.     DQ = 1 ;
  752.     dat>>=1 ;
  753.   }
  754. }

  755. /* 读取温度                            */
  756. /*******************************************************************/
  757. Read_Temperature(void)
  758. {
  759.      Init_DS18B20() ;
  760.   
  761.      WriteOneChar(0xCC) ;  // 跳过读序号列号的操作
  762.      WriteOneChar(0x44) ;  // 启动温度转换

  763.      Init_DS18B20() ;
  764.      WriteOneChar(0xCC) ;  //跳过读序号列号的操作
  765.      WriteOneChar(0xBE) ;  //读取温度寄存器

  766.      temp_data[0] = ReadOneChar() ;   //温度低8位
  767.      temp_data[1] = ReadOneChar() ;   //温度高8位
  768. }

  769. /* 数据转换与温度显示                                              */
  770. /*******************************************************************/
  771. void Disp_Temperature()
  772. {
  773.   temp_ram[4]=temp_data[0]&0x0f ;
  774.   temp_ram[0]=ditab[temp_ram[4]]+0x30 ;     //查表得小数位的值
  775.   
  776.   temp_ram[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
  777.   temp_ram[3]=temp_ram[4]/100+0x30 ;
  778.   temp_ram[1]=temp_ram[4]%100 ;
  779.   temp_ram[2]=temp_ram[1]/10+0x30 ;
  780.   temp_ram[1]=temp_ram[1]%10+0x30 ;

  781.     if(temp_ram[3]==0x30)        //高位为0,不显示
  782.    {
  783.      temp_ram[3]=0x20 ;              
  784.      if(temp_ram[2]==0x30)      //次高位为0,不显示
  785.      temp_ram[2]=0x20 ;
  786.    }

  787. }
  788. /*
  789. void start_time(){
  790.         Time.Year = 0x10;
  791.         Time.Month = 0x7;
  792.         Time.Day = 0x23;
  793.         Time.Hour = 0x21;
  794.         Time.Minute = 0x58;
  795.         Time.Second = 0x0;
  796.         Time.Week = 0x5;
  797. }*/

  798. //=================
  799. //****校时函数****
  800. //=================
  801. void Change_Time(){
  802.         //
  803.         MSG_MV = MSG_MV_L;
  804.         move_times = 0;
  805.         start_word=0;
  806.         TMP_TIME = Time.Hour;
  807.         TR1 = 1;                //开启定时器1闪烁
  808.         do{
  809.                 switch(CHANGE){
  810.                                 case CHG_HOUR:
  811.                                 case CHG_MIN:
  812.                                 case CHG_SEC:
  813.                                         Put_Tdispram(0);
  814.                                         break;
  815.                                 case CHG_MON:
  816.                                 case CHG_DAY:
  817.                                         Put_Ddispram(0);
  818.                                         break;
  819.                                 case CHG_WEEK:
  820.                                         Put_Kdispram(0);
  821.                                         break;
  822.                                 case CHG_YEAR:
  823.                                         Put_Ydispram(0);
  824.                                         break;
  825.                                 default:
  826.                                         break;
  827.                                 }        
  828.                 Show_sWord();
  829.                 //if(!key_done)
  830.                 //        ReadKey1();
  831.                 }while(ReadKey1() != KEY3_S && exit < 10);                //MSG_KEY
  832.         Change_obj();        //保证退出校时无隐身
  833.         HIDE = 0;
  834.         key_done = 0;
  835.         //key_done = 1;        //按键事件处理完成
  836.         TR1 = 0;                //关闭定时器1闪烁                                       
  837.         
  838. }
  839. //==================
  840. //****对象切换****
  841. //==================
  842. void Change_obj(){
  843.         switch(CHANGE){
  844.                                 case CHG_HOUR:
  845.                                         if(Time.Hour == 0xcc)
  846.                                                 Time.Hour = TMP_TIME;
  847.                                         TMP_TIME = Time.Minute;
  848.                                         break;
  849.                                 case CHG_MIN:
  850.                                         if(Time.Minute == 0xcc)
  851.                                                 Time.Minute = TMP_TIME;
  852.                                         TMP_TIME = Time.Second;
  853.                                         break;
  854.                                 case CHG_SEC:
  855.                                         if(Time.Second == 0xcc)
  856.                                                 Time.Second = TMP_TIME;
  857.                                         TMP_TIME = Time.Month;
  858.                                         break;
  859.                                 case CHG_MON:
  860.                                         if(Time.Month == 0xcc)
  861.                                                 Time.Month = TMP_TIME;
  862.                                         TMP_TIME = Time.Day;
  863.                                         break;
  864.                                 case CHG_DAY:
  865.                                         if(Time.Day == 0xcc)
  866.                                                 Time.Day = TMP_TIME;
  867.                                         TMP_TIME = Time.Week;
  868.                                         break;
  869.                                 case CHG_WEEK:
  870.                                         if(Time.Week == 0xcc)
  871.                                                 Time.Week = TMP_TIME;
  872.                                         TMP_TIME = Time.Year;
  873.                                         break;
  874.                                 case CHG_YEAR:
  875.                                         if(Time.Year == 0xcc)
  876.                                                 Time.Year = TMP_TIME;
  877.                                         TMP_TIME = Time.Hour;
  878.                                         break;
  879.                                 default:
  880.                                         break;
  881.                                 }
  882. }
  883. //==================
  884. //****加加函数****
  885. //功能: 0x19 ++  =0x20
  886. //==================
  887. uchar Add_num(char *num){
  888.         ++(*num);
  889.         if(((*num) & 0x0f) == 0x0a){
  890.                 *num += 0x10;
  891.                 *num &= 0xf0;
  892.                 }
  893.         return *num;
  894. }
  895. //==================
  896. //****校时加加****
  897. //==================
  898. void Add_Time(){
  899.         switch(CHANGE){
  900.                                 case CHG_HOUR:
  901.                                         if(HIDE){
  902.                                                 if(Add_num(&TMP_TIME) == 0x24)
  903.                                                         TMP_TIME= 0;
  904.                                                 }
  905.                                         else{
  906.                                                 if(Add_num(&Time.Hour) == 0x24)
  907.                                                         Time.Hour = 0;
  908.                                                 }
  909.                                         break;
  910.                                 case CHG_MIN:
  911.                                         if(HIDE){
  912.                                                 if(Add_num(&TMP_TIME) == 0x60)
  913.                                                         TMP_TIME= 0;
  914.                                                 }
  915.                                         else{
  916.                                                 if(Add_num(&Time.Minute) == 0x60)
  917.                                                         Time.Minute= 0;
  918.                                                 }
  919.                                         break;
  920.                                 case CHG_SEC:
  921.                                         if(HIDE){
  922.                                                 if(Add_num(&TMP_TIME) == 0x60)
  923.                                                         TMP_TIME= 0;
  924.                                                 }
  925.                                         else{
  926.                                                 if(Add_num(&Time.Second) == 0x60)
  927.                                                         Time.Second = 0;
  928.                                                 }
  929.                                         break;
  930.                                 case CHG_MON:
  931.                                         if(HIDE){
  932.                                                 if(Add_num(&TMP_TIME) == 0x13)
  933.                                                         TMP_TIME= 0;
  934.                                                 }
  935.                                         else{
  936.                                                 if(Add_num(&Time.Month) == 0x13)
  937.                                                         Time.Month= 1;
  938.                                                 }
  939.                                         break;
  940.                                 case CHG_DAY:
  941.                                         if(HIDE){
  942.                                                 if(Add_num(&TMP_TIME) == 0x32)
  943.                                                         TMP_TIME= 0;
  944.                                                 }
  945.                                         else{
  946.                                                 if(Add_num(&Time.Day) == 0x32)
  947.                                                         Time.Day= 0;
  948.                                                 }
  949.                                         break;
  950.                                 case CHG_WEEK:
  951.                                         if(HIDE){
  952.                                                 if(Add_num(&TMP_TIME) == 0x08)
  953.                                                         TMP_TIME= 1;
  954.                                                 }
  955.                                         else{
  956.                                                 if(Add_num(&Time.Week) == 0x08)
  957.                                                         Time.Week= 1;
  958.                                                 }
  959.                                         break;
  960.                                 case CHG_YEAR:
  961.                                         if(HIDE){
  962.                                                 if(Add_num(&TMP_TIME) == 0xa0)
  963.                                                         TMP_TIME = 0;
  964.                                                 }
  965.                                         else{
  966.                                                 if(Add_num(&Time.Year) == 0xa0)
  967.                                                         Time.Year = 0;
  968.                                                 }
  969.                                         //if(Add_num(&Time.Year) == 0x24)
  970.                                         //        Time.Year= 0;
  971.                                         break;
  972.                                 default:
  973.                                         break;
  974.                                 }
  975. }
  976. //==================
  977. //****减减函数****
  978. //功能: 0x20 --  =0x19
  979. //==================
  980. uchar Cut_num(char *num){
  981.         --(*num);
  982.         if(((*num)&0x0f) == 0x0f){
  983.                 //*num -= 0x10;
  984.                 *num &= 0xf9;
  985.         }
  986.         //if((*num == 0xf9)
  987.                 //*num = 0x99;
  988.         return *num;
  989. }
  990. //==================
  991. //****校时减减****
  992. //==================
  993. void Cut_Time(){
  994.         switch(CHANGE){
  995.                                 case CHG_HOUR:
  996.                                         if(HIDE){
  997.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  998.                                                         TMP_TIME= 0x23;
  999.                                                 }
  1000.                                         else{
  1001.                                                 if(Cut_num(&Time.Hour) == 0xf9)
  1002.                                                         Time.Hour = 0x23;
  1003.                                                 }
  1004.                                         break;
  1005.                                 case CHG_MIN:
  1006.                                         if(HIDE){
  1007.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1008.                                                         TMP_TIME= 0x59;
  1009.                                                 }
  1010.                                         else{
  1011.                                                 if(Cut_num(&Time.Minute) == 0xf9)
  1012.                                                         Time.Minute= 0x59;
  1013.                                                 }
  1014.                                         break;
  1015.                                 case CHG_SEC:
  1016.                                         if(HIDE){
  1017.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1018.                                                         TMP_TIME= 0x59;
  1019.                                                 }
  1020.                                         else{
  1021.                                                 if(Cut_num(&Time.Second) == 0xf9)
  1022.                                                         Time.Second = 0x59;
  1023.                                                 }
  1024.                                         break;
  1025.                                 case CHG_MON:
  1026.                                         if(HIDE){
  1027.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1028.                                                         TMP_TIME= 0x12;
  1029.                                                 }
  1030.                                         else{
  1031.                                                 if(Cut_num(&Time.Month) == 0xf9)
  1032.                                                         Time.Month= 0x12;
  1033.                                                 }
  1034.                                         break;
  1035.                                 case CHG_DAY:
  1036.                                         if(HIDE){
  1037.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1038.                                                         TMP_TIME= 0x31;
  1039.                                                 }
  1040.                                         else{
  1041.                                                 if(Cut_num(&Time.Day) == 0xf9)
  1042.                                                         Time.Day= 0x31;
  1043.                                                 }
  1044.                                         break;
  1045.                                 case CHG_WEEK:
  1046.                                         if(HIDE){
  1047.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1048.                                                         TMP_TIME= 0x7;
  1049.                                                 }
  1050.                                         else{
  1051.                                                 if(Cut_num(&Time.Week) == 0xf9)
  1052.                                                         Time.Week= 0x7;
  1053.                                                 }
  1054.                                         break;
  1055.                                 case CHG_YEAR:
  1056.                                         if(HIDE){
  1057.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  1058.                                                         TMP_TIME= 0x99;
  1059.                                                 }
  1060.                                         else{
  1061.                                                 if(Cut_num(&Time.Year) == 0xf9)
  1062.                                                         Time.Year = 0x99;
  1063.                                                 }
  1064.                                         //if(Cut_num(&Time.Year) == 0x99)
  1065.                                         //        Time.Year= 0;
  1066.                                         break;
  1067.                                 default:
  1068.                                         break;
  1069.                                 }
  1070. }

  1071. //======按键======
  1072. uchar ReadKey(){
  1073.         //
  1074.         if(!key_done){
  1075.         switch(MSG_KEY){
  1076.                 case KEY0_S:STATE = STA_sTIME;
  1077.                                         break;
  1078.                 case KEY1_S:STATE = STA_gWORD;        //STA_sWEEK
  1079.                                         break;
  1080.                 case KEY2_S:STATE = STA_gTEMP;
  1081.                                         break;
  1082.                 case KEY3_S:STATE = STA_gTIME;
  1083.                                         break;
  1084.                 case KEY0_L:STATE = STA_CHG;
  1085.                                         break;
  1086.                 case KEY1_L:STATE = STA_SONG;
  1087.                                         break;
  1088.                 case KEY2_L:STATE = STA_gTEMP;
  1089.                                         break;
  1090.                 case KEY3_L:STATE = STA_gWORD;        //STA_sTIME
  1091.                                         break;
  1092.                 default:        break;
  1093.                 }
  1094.                 }
  1095.         key_done = 1;        //按键事件处理完成
  1096.         return MSG_KEY;        
  1097. }
  1098. //=======================
  1099. //****校时按键处理****
  1100. //=======================
  1101. uchar ReadKey1(){
  1102.         //
  1103.         if(!key_done){
  1104.         switch(MSG_KEY){
  1105.                 case KEY0_S:                //切换校时对象
  1106.                 case KEY0_L:
  1107.                                         exit = 0;
  1108.                                         TR1 = 0;                //关闭定时器1闪烁
  1109.                                         Change_obj();
  1110.                                         if(CHANGE++ >= CHG_YEAR)
  1111.                                                 CHANGE = CHG_HOUR;
  1112.                                         TR1 = 1;                //开启定时器1闪烁
  1113.                                         break;
  1114.                 case KEY1_S:                //加加
  1115.                 case KEY1_L:
  1116.                                         exit = 0;
  1117.                                         TR1 = 0;                //关闭定时器1闪烁
  1118.                                         Add_Time();
  1119.                                         TR1 = 1;                //开启定时器1闪烁
  1120.                                         break;
  1121.                 case KEY2_S:                //减减
  1122.                 case KEY2_L:
  1123.                                         exit = 0;
  1124.                                         TR1 = 0;                //关闭定时器1闪烁
  1125.                                         Cut_Time();
  1126.                                         TR1 = 1;                //开启定时器1闪烁
  1127.                                         break;
  1128.                 case KEY3_L:
  1129.                 case KEY3_S:
  1130.                                         return KEY3_S;
  1131.                 default:        break;
  1132.                 }
  1133.                 }
  1134.         key_done = 1;        //按键事件处理完成
  1135.         return 0;
  1136. }
  1137. //===========================
  1138. void Tinit(){
  1139.         TMOD = 0x11;
  1140.         TH0 = 0xD8;
  1141.         TL0 = 0xF0;
  1142.         TH1 = 0x42;
  1143.         TL1 = 0xCA;
  1144.         TR0 = 1;
  1145.         //TR1 = 1;
  1146.         ET0 = 1;
  1147.         ET1 = 1;
  1148.         EA = 1;
  1149. }

  1150. timer0() interrupt 1{
  1151.         TH0 = 0xb1;
  1152.         TL0 = 0xe0;

  1153.         if(P1 != 0xff) {//若有键按下
  1154.                 cur_key_val = P1&0x0f;        //记录按键值
  1155.                 if(key_times < 150)
  1156.                         key_times++;  
  1157.                 else{
  1158.                         key_keep_times++;         //长按连击
  1159.                         if(key_keep_times >= 10){  //10 1秒连击10次
  1160.                                 key_keep_times = 0;
  1161.                                 MSG_KEY = 0x10 | cur_key_val;
  1162.                                 key_done = 0;        //按键事件复位
  1163.                                 }
  1164.                         }         
  1165.         }else{
  1166.                 if(key_times > 2 && key_times < 100 && key_done){        //短按键
  1167.                         MSG_KEY = cur_key_val;
  1168.                         key_done = 0;         //按键事件复位
  1169.                         }
  1170.                 else if(key_times >= 100 && key_done){        //长按键
  1171.                         MSG_KEY = 0x10 | cur_key_val;
  1172.                         key_done = 0;         //按键事件复位
  1173.                         }
  1174.                 key_times = 0;        
  1175.                 key_keep_times = 0;
  1176.                 }
  1177. }

  1178. timer1() interrupt 3{
  1179.         if(STATE == STA_CHG){
  1180.                 TH1 = 0x42;
  1181.                 TL1 = 0xCA;
  1182.                 if(hide_times++ == 8){
  1183.                         HIDE = 0;        //显示
  1184.                         switch(CHANGE){
  1185.                                 case CHG_HOUR:
  1186.                                         Time.Hour =TMP_TIME;
  1187.                                         break;
  1188.                                 case CHG_MIN:
  1189.                                         Time.Minute = TMP_TIME;
  1190.                                         break;
  1191.                                 case CHG_SEC:
  1192.                                         Time.Second = TMP_TIME;
  1193.                                         break;
  1194.                                 case CHG_MON:
  1195.                                         Time.Month = TMP_TIME;
  1196.                                         break;
  1197.                                 case CHG_DAY:
  1198.                                         Time.Day = TMP_TIME;
  1199.                                         break;
  1200.                                 case CHG_WEEK:
  1201.                                         Time.Week = TMP_TIME;
  1202.                                         break;
  1203.                                 case CHG_YEAR:
  1204.                                         Time.Year = TMP_TIME;
  1205.                                         break;
  1206.                                 default:
  1207.                                         break;
  1208.                                 }
  1209.                  }
  1210.                  if(hide_times > 17){
  1211.                          hide_times = 0;
  1212.                         HIDE = 1;        //隐藏
  1213.                         exit++;
  1214.                         switch(CHANGE){
  1215.                                 case CHG_HOUR:
  1216.                                         TMP_TIME = Time.Hour;
  1217.                                         Time.Hour = 0xcc;
  1218.                                         break;
  1219.                                 case CHG_MIN:
  1220.                                         TMP_TIME = Time.Minute;
  1221.                                         Time.Minute = 0xcc;
  1222.                                         break;
  1223.                                 case CHG_SEC:
  1224.                                         TMP_TIME = Time.Second;
  1225.                                         Time.Second = 0xcc;
  1226.                                         break;
  1227.                                 case CHG_MON:
  1228.                                         TMP_TIME = Time.Month;
  1229.                                         Time.Month = 0xcc;
  1230.                                         break;
  1231.                                 case CHG_DAY:
  1232.                                         TMP_TIME = Time.Day;
  1233.                                         Time.Day = 0xcc;
  1234.                                         break;
  1235.                                 case CHG_WEEK:
  1236.                                         TMP_TIME = Time.Week;
  1237.                                         Time.Week = 0xcc;
  1238.                                         break;
  1239.                                 case CHG_YEAR:
  1240.                                         TMP_TIME = Time.Year;
  1241.                                         Time.Year = 0xcc;
  1242.                                         break;
  1243.                                 default:
  1244.                                         break;
  1245.                                 }
  1246.                 }
  1247.         }
  1248. }

  1249. void Compute_State(){
  1250.         switch(Time.Second){
  1251.                 case 0x1:
  1252.                         //STATE = STA_gTIME;
  1253.                         break;
  1254.                 case 0x2:
  1255.                         STATE = STA_sYEAR;
  1256.                         break;
  1257.                 case 0x15:
  1258.                         STATE = STA_sTEMP;
  1259.                         break;
  1260.                 case 0x31:
  1261.                         STATE = STA_sDATE;
  1262.                         break;
  1263.                 case 0x40:
  1264.                         STATE = STA_sWEEK;
  1265.                         break;
  1266.                 case 0x50:
  1267.                         STATE = STA_sTEMP;
  1268.                         break;
  1269.                 default:
  1270.                         break;
  1271.                 }
  1272.         if(Time.Minute%2 == 0 && Time.Second == 0)
  1273.                 STATE = STA_gTIME;
  1274.         if((Time.Minute&0x0f)%5 == 0 && Time.Second == 30)
  1275.                 STATE = STA_gTEMP;
  1276.         if((Time.Minute&0x0f) == 7 && Time.Second == 0)
  1277.                 STATE = STA_gWORD;
  1278.         if((Time.Minute&0x0f) == 3 && Time.Second == 0)
  1279.                 STATE = STA_SONG;
  1280. }
  1281. //;---------主程序循环--------------
  1282.                    void main()
  1283.                 {
  1284.                         int i;
  1285.                         initial();
  1286.                         Tinit();
  1287.                         Init_DS1302();
  1288.                         Read_TIME();        //读取时间
  1289.                         Read_Temperature();
  1290.                         Show_Cpyrt();
  1291.                         //start_time();
  1292.                         //write_time1302();
  1293.                         MSG_MV = MSG_MV_L;
  1294.                         STATE        = STA_sTIME;
  1295.                         while(1)
  1296.                         {
  1297.                            ReadKey();
  1298.                                 switch(STATE){
  1299.                                         case STA_gTIME:
  1300.                                                 //添加代码
  1301.                                                 MSG_MV = MSG_MV_L;
  1302.                                                 move_times = 0;
  1303.                                                 start_word=0;
  1304.                                                 Read_TIME();        //读取时间
  1305.                                                 Show_All_Info();
  1306.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1307.                                                 key_done = 0;
  1308.                                                 break;
  1309.                                         case STA_gTEMP:
  1310.                                                 Put_Wdispram(TMP_WORDS); //,start_word++
  1311.                                                 Read_Temperature();
  1312.                                                   Disp_Temperature();
  1313.                                                   Put_gTEMP();
  1314.                                                 //Move_Down();
  1315.                                                   Show_Move_Word(TMP_WORDS);
  1316.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1317.                                                 key_done = 0;
  1318.                                                 break;
  1319.                                         case STA_gWORD:
  1320.                                                 //添加代码
  1321.                                                 Put_Wdispram(MY_WORDS); //,start_word++         
  1322.                                                 //Move_Down();
  1323.                                                   Show_Move_Word(MY_WORDS);
  1324.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1325.                                                 key_done = 0;
  1326.                                                 break;
  1327.                                         case STA_sTIME:
  1328.                                                 //添加代码
  1329.                                                 MSG_MV = MSG_MV_L;
  1330.                                                 move_times = 0;
  1331.                                                 start_word=0;
  1332.                                                 Read_TIME();        //读取时间
  1333.                                                 Put_Tdispram(0);        
  1334.                                                 Show_sWord();
  1335.                                                 Compute_State();
  1336.                                                 break;
  1337.                                         case STA_sDATE:
  1338.                                                 //添加代码
  1339.                                                 MSG_MV = MSG_MV_L;
  1340.                                                 move_times = 0;
  1341.                                                 start_word=0;
  1342.                                                 Read_TIME();        //读取时间
  1343.                                                 Put_Ddispram(8);
  1344.                                                 Move_Down();
  1345.                                                 Put_Ddispram(0);
  1346.                                                 for(i=0;i<8;i++)
  1347.                                                         Show_sWord();
  1348.                                                 Read_TIME();
  1349.                                                 Put_Tdispram(8);
  1350.                                                 Move_Up();
  1351.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1352.                                                 key_done = 0;
  1353.                                                 break;
  1354.                                         case STA_sWEEK:
  1355.                                                 //添加代码
  1356.                                                 MSG_MV = MSG_MV_L;
  1357.                                                 move_times = 0;
  1358.                                                 start_word=0;
  1359.                                                 Read_TIME();        //读取时间
  1360.                                                 Put_Kdispram(8);
  1361.                                                 Move_Up();        //Move_Down();
  1362.                                                 for(i=0;i<8;i++){        
  1363.                                                         Read_TIME();        //读取时间
  1364.                                                         Put_Kdispram(0);
  1365.                                                         Show_sWord();
  1366.                                                         }
  1367.                                                 Read_TIME();
  1368.                                                 Put_Tdispram(8);
  1369.                                                 Move_Down();        //Move_Up();
  1370.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1371.                                                 key_done = 0;
  1372.                                                 break;
  1373.                                         case STA_sYEAR:
  1374.                                                 MSG_MV = MSG_MV_L;
  1375.                                                 move_times = 0;
  1376.                                                 start_word=0;
  1377.                                                 Read_TIME();        //读取时间
  1378.                                                 Put_Ydispram(8);
  1379.                                                 Move_Down();
  1380.                                                 for(i=0;i<8;i++){        
  1381.                                                         Read_TIME();        //读取时间
  1382.                                                         Put_Ydispram(0);
  1383.                                                         Show_sWord();
  1384.                                                         }
  1385.                                                 Read_TIME();
  1386.                                                 Put_Tdispram(8);
  1387.                                                 Move_Up();
  1388.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1389.                                                 key_done = 0;
  1390.                                                 break;
  1391.                                         case STA_sTEMP:
  1392.                                                 //添加代码
  1393.                                                 MSG_MV = MSG_MV_L;
  1394.                                                 move_times = 0;
  1395.                                                 start_word=0;
  1396.                                                 Read_Temperature();
  1397.                                                   Disp_Temperature();
  1398.                                                 Put_sTEMP(8);
  1399.                                                 Move_Up();        //Move_Down();
  1400.                                                 for(i=0;i<8;i++)        {
  1401.                                                         Read_Temperature();
  1402.                                                           Disp_Temperature();
  1403.                                                         Put_sTEMP(0);
  1404.                                                         Show_sWord();
  1405.                                                         }
  1406.                                                 Read_TIME();
  1407.                                                 Put_Tdispram(8);
  1408.                                                 Move_Down();        //Move_Up();
  1409.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1410.                                                 key_done = 0;
  1411.                                                 break;
  1412.                                         case STA_sWORD:
  1413.                                                 //添加代码
  1414.                                                 break;
  1415.                                         case STA_CHG:
  1416.                                                 //校时模式
  1417.                                                 Change_Time();
  1418.                                                 write_time1302();
  1419.                                                 Read_TIME();
  1420.                                                 Put_Tdispram(8);
  1421.                                                 Move_Up();
  1422.                                                 MSG_KEY = KEY0_S;
  1423.                                                 break;
  1424.                                         case STA_SONG:
  1425.                                                 MSG_MV = MSG_MV_L;
  1426.                                                 move_times = 0;
  1427.                                                 start_word=0;
  1428.                                                 Show_Song();
  1429.                                                 MSG_KEY = KEY0_S;
  1430.                                                 key_done = 0;
  1431.                                                 break;
  1432.                                         default:
  1433.                                                 break;
  1434.                                          }
  1435.                         }
  1436.                  }

复制代码

所有资料51hei提供下载:
点阵时钟proteus仿真.rar (209.37 KB, 下载次数: 77)

评分

参与人数 1黑币 +90 收起 理由
admin + 90 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2019-3-5 15:47 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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