找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自制3264点阵DS3231_摇控_GPS时钟 附单片机程序

  [复制链接]
跳转到指定楼层
楼主
ID:505627 发表于 2019-5-6 04:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
成功仿制的51单片机+3264点阵屏DS3231高精度时钟芯片_摇控_GPS时钟,留下纪念,制作出来的实物图如下:


电路原理图如下:


元件清单:
名称
二手GPS 剪线(不保好坏,建议买两个以上)
F3.75双色LED显示屏32X64点
DS18B20 温度IC
双排弯针(2.54MM双排弯针2*40)
micro USB接口座
40脚 IC插座
STC12C5A60S2(40脚 IC)
7*9CM万能板
9*15CM万能板(割一小块下来焊按键接收板)
排线 杜邦线2P 20CM
排线 杜邦线4P 20CM
排线 杜邦线5P 20CM
排线 杜邦线8P 20CM
DS3231 AT24C32时钟模块(带电池)
红外遥控接收头 VS838
热敏电阻 MF52-10K B值3950
24.576M/24M晶振
5MM光敏电阻5528
104全新直插CA42钽电容 0.1UF
25V470UF 8*12mm电解电容
25V10UF 4*7mm电解电容
IN4007
1K金属膜电阻1/4W 1%(100个)
4.7K金属膜电阻1/4W 1%(100个)
10K金属膜电阻1/4W 1%(100个)
30PF全新独石电容直插
8550三极管
按键 6x6卧式带支架

单片机源程序如下:
  1. //原程序为Benli所创,只是把DS1302计时芯片换成DS3231+24C32模块。
  2. // 本时钟使用STC12C5A60S2单片机,24/24.576M晶振,DS3231高精度RTC芯片,GPS时间校正
  3. // 多模式显示,有三大模式,每个模式分别有时间粗体/细体,有秒/无秒,12时/24时8种模式,共计24模式
  4. // GPS时间校正,每天定时开启GPS校正本地时间
  5. // DS18B20/NTC温度传感器自适应,优先使用DS18B20
  6. // 自动亮度调节,根据环境光线自动调节屏幕亮度,白天清晰,晚上柔和而且省电
  7. // 学习型红外遥控
  8. // 停电后由电池供电并进入省电模式

  9. // 按键说明:
  10. // 在非设置模式下,按+键切换显示模式,-键切换12/24时制
  11. // 按SET分别设置  正常显示/年/月/日/时/分/秒/亮度/最低亮度/绿补偿/NTC补偿/遥控开关/学习模式
  12. // 按+/-调整数据,
  13. // ESC退出设置
  14. // 在学习模式下按遥控学习按键

  15. #include <STC12C5A60S2.H>
  16. #include <intrins.h>

  17. #define                ulong        unsigned long
  18. #define                uint        unsigned int
  19. #define                uchar        unsigned char
  20. #include "zimo2.h"
  21. #define NOP _nop_()
  22. #define NOP4 _nop_();_nop_();_nop_();_nop_()


  23. #define XSMOD_Max 11        //显示模式最大数
  24. #define Set_Max 15           //设置项目数
  25. #define Liangdu_Max 19
  26. #define Min_Liangdu_Max 9
  27. #define Liangdu_G_Max 9

  28. #define ES_ON AUXR |= 0x10; ES=1
  29. #define ES_OFF AUXR &= 0xEF; ES=0

  30. //#define BRT_INT 0x62        //4800bps@24M
  31. #define BRT_INT 0xb1        //9600bps@24M
  32. #define EN_OFF() OE=1                //使能低电平有效,高电平有效取反
  33. #define EN_ON() OE=0
  34. //#define DATAHI                        //数据高电平有效保留,低电平有效需去掉


  35. uchar code banben[4]="2.4";
  36. uchar idata GPRMC[]="$GPRMC";    //GPS选择接收字符$GPRMC,
  37. //uchar idata GPRMC[6]={0x24,0x47,0x50,0x52,0x4D,0x43};    //GPS选择接收字符$GPRMC,


  38. sbit G1=P0^4;                   //红绿数据
  39. sbit G2=P0^5;
  40. sbit R1=P2^6;
  41. sbit R2=P2^7;
  42. sbit LS=P0^6;                   //锁存
  43. sbit CK=P0^7;                   //时钟
  44. sbit OE=P2^5;                  //使能,低电平有效

  45. #define  ABCD P0                   //ABCD接到P0.0-P0.3

  46. sbit GPS_POW=P1^5;                //gps电源控制
  47. sbit POW_OK= P3^2;                //外部电源检测
  48. sbit IR_POW=P3^4;                //红外接收电源


  49. sbit KeySet= P2^3;            //调整按键
  50. sbit KeyAdd= P2^2;            //加按键
  51. sbit KeyDec= P2^1;            //减按键
  52. sbit KeyEsc= P2^0;                 //退出键

  53. bit K_ADD,K_DEC,K_SET,K_ESC;                //按键标志

  54. uchar data row;                                        //行扫描变量
  55. uchar data RD1[8];                                //数据缓存
  56. uchar data GD1[8];
  57. uchar data RD2[8];
  58. uchar data GD2[8];

  59. uchar miao1,miao2;           //秒数据,1十位,2个位
  60. uchar fen1,fen2        ;           //分数据
  61. uchar shi1,shi2        ;           //小时数据
  62. uchar ri1,ri2        ;           //日数据
  63. uchar yue1,yue2;           //月数据
  64. uchar nian1,nian2;           //年数据
  65. uchar week;                 //星期
  66. bit SHAN,SHAN2;                //闪烁标志
  67. uchar idata Set_S=0;

  68. uchar idata NL_yue;                //农历月 1~12
  69. uchar idata NL_ri;                //农历日 1~30
  70. uchar y1,y2,r1,r2;                //农历显示数据

  71. uchar  SJ[6],RQ[6];

  72. bit RX_over;   //GPS数据接收结束标志位
  73. bit DW_OK;           //GPS定位成功标志位

  74. uint ADC_L;                  //ADC亮度数据
  75. uint ADC_T;                  //ADC温度数据
  76. bit ADCL;                  //亮度ADC标志
  77. bit ADCT;                  //温度ADC标志
  78. uchar t1,t2;          //温度显示数据
  79. bit NTC;                //是否使用NTC测温标志
  80. bit Zhi_12,PM;        //12/24时制标示,0/24        1/12
  81. uchar idata XSMOD;        //显示模式
  82. char idata Liangdu;        //亮度
  83. char idata Min_Liangdu;                //最低亮度
  84. char idata Liangdu_G;                //绿亮度
  85. char idata Light_R,Light_L,Light_G;        //亮度控制用变量
  86. uchar idata Li;
  87. uchar idata NTC_buchang;                //NTC补偿

  88. uchar idata IR_date[7]={0,0,0,0,0,0,0};     //date数组为存放地址原码,反码,数据原码,反码,标志位,
  89.                                                                                         //连发标志,临时数据(执行数据
  90. uchar idata IR_Key[5];        //红外键值,用户码,SET,+,-.ESC                                         
  91. bit xuexi_OK ;                //红外学习成功标示  
  92.                                       
  93. #include "nongli.h"
  94. #include "DS3231+AT24C32.h"
  95. #include "18b20.h"
  96. #include "set.h"
  97. #include "eep.h"
  98. void Delayus(uint x);

  99. void Delay (uchar t)
  100. { uchar i,j;
  101.    for (i=0;i<t;i++)

  102.          for(j=0;j<10;j++);
  103. }

  104. void Delayus(uint x)
  105. {
  106.         while(x--);
  107. }

  108. void GPSdata()
  109. {

  110.         static uchar idata hour[2],min[2],sec[2],year[2],mon[2],day[2];        //临时时间数据 ,为了预防数据传输的误码,使用了2次数据比较
  111.         static uchar idata a;
  112.         uchar idata max;
  113.                                                                                                                                                                                   
  114.         RX_over=0;

  115.         for(max=0;max<6;max++)
  116.         {
  117.                  SJ[max]-=0x30;
  118.                 RQ[max]-=0x30;
  119.         }                                                                                                   //保存临时时间数据
  120.         hour[a]=SJ[0]*10        + SJ[1];                 //时
  121.         min [a]=SJ[2]*10        + SJ[3];                 //分
  122.         sec[a]=SJ[4]*10        + SJ[5];                 //秒
  123.         day [a]=RQ[0]*10 + RQ[1];                 //日
  124.         mon [a]=RQ[2]*10 + RQ[3];                 //月
  125.         year[a]=RQ[4]*10 + RQ[5];                 //年
  126.         a++;
  127.         if(a>1)
  128.         {
  129.                 a=0;
  130.                 //如果第二次秒比上次小1,并且分,时,日,月,年相同
  131.                 if(sec[1]-sec[0]==1&&min[1]==min[0]&&hour[1]==hour[0]&&day[1]==day[0]&&mon[1]==mon[0]&&year[1]==year[0])
  132.                 {
  133.                         sec[1]+=1;                  //GPS时间是包含毫秒的,加上1秒补偿传输和程序处理的延时
  134.                         if(sec[1]>59)
  135.                         {
  136.                                  sec[1]=0;
  137.                                 min[1]+=1;
  138.                                 if(min[1]>59)
  139.                                 {
  140.                                  min[1]=0;
  141.                                  hour[1]+=1;
  142.                                 }
  143.                         }
  144.                         hour[1]+=8;                        //转换为北京时间 ,东8区要+8
  145.                         if(hour[1]>23)                //如果超过23则到了第二天
  146.                         {   
  147.                                 hour[1]-=24;        //
  148.                                 day[1]+=1;                //日+1

  149.                                 switch(mon[1])                //获取每月最大天数
  150.                                 {
  151.                                          case 2:                         //2月
  152.                                                 if(year[1]%4==0)  //判断是否闰月,只取2000-2099年,因此简单的%4运算
  153.                                                         max=29;                  //闰月29天
  154.                                                 else
  155.                                                         max=28;                  //正常28天
  156.                                                 break;
  157.                                         case 4:        case 6:         
  158.                                         case 9: case 11:     //4,6,9,11月                                       
  159.                                                 max=30;                         //30天
  160.                                                 break;
  161.                                         default:
  162.                                                 max=31;                  //其他月份1,3,5,7,8,10,12月31天
  163.                                         break;               
  164.                                 }
  165.                                 if(day[1]>max)
  166.                                 {
  167.                                         mon[1]+=1;
  168.                                         day[1]=1;
  169.                                         if(mon[1]>12)
  170.                                         {
  171.                                                  year[1]+=1;
  172.                                                 mon[1]=1;
  173.                                         }
  174.                                 }
  175.                         }
  176.                           //                 写入时间数据到DS3231
  177.                         ModifyTime(DS3231_SECOND, sec[1]/10*16 + sec[1]%10 );          //秒
  178.                         ModifyTime(DS3231_MINUTE, min[1]/10*16 + min[1]%10 );          //分
  179.                         ModifyTime(DS3231_HOUR, hour[1]/10*16 + hour[1]%10 ); //时
  180.                         ModifyTime(DS3231_DAY, day[1]/10*16 + day[1]%10 );         //日
  181.                         ModifyTime(DS3231_MONTH, mon[1]/10*16 + mon[1]%10 );         //月
  182.                         ModifyTime(DS3231_YEAR, year[1]/10*16 + year[1]%10 ); //年

  183.                         GPS_POW=1;                         //关闭GPS电源
  184. //                        ES_OFF;
  185.                         GetAllTime();                 //读取全部时间
  186.                         GetNL_ri();                         //农历转换
  187.                 }
  188.         }
  189. }


  190. void ShowLogo()
  191. {
  192.         uchar i,j;       
  193.         uint x=300;
  194.         uchar code *p;
  195.                
  196.         while(x--)
  197.         {
  198.                 WDT_CONTR=0x34;       
  199.                 for(row=0;row<16;row++)                           //扫描16行
  200.                 {   
  201.                         GD1[0]=ZMlogo[20][row];        //GPSclock
  202.                         GD1[1]=ZMlogo[21][row];
  203.                         GD1[2]=ZMlogo[22][row];
  204.                         GD1[3]=ZMlogo[23][row];
  205.                         RD1[4]=GD1[4]=ZMlogo[24][row];
  206.                         RD1[5]=GD1[5]=ZMlogo[25][row];
  207.                         RD1[6]=GD1[6]=ZMlogo[26][row];
  208.                         RD1[7]=GD1[7]=ZMlogo[27][row];
  209.                          
  210.                         RD2[0]=ZMlogo[28][row];         //V
  211.                         RD2[1]=ZMlogo[29][row];
  212.                         RD2[2]=ZMlogo[30][row];        //2                       
  213.                         RD2[3]=ZMlogo[31][row];
  214.                         RD2[4]=ZMlogo[32][row];
  215.                         RD2[5]=ZMlogo[33][row];
  216.                         {
  217.                                 RD2[6]=ZMlogo[34][row];        //D
  218.                         }
  219.                
  220.                         {
  221.                                 RD2[7]=ZMlogo[35][row];        //S
  222.                         }



  223.                                
  224.                         for(i=0;i<8;i++)                                         //扫描1行
  225.                         {                                                               
  226.                                  for(j=0;j<8;j++)                         //发送1个数据
  227.                                 {                                        
  228.                                 #ifdef        DATAHI
  229.                                         RD1[i]<<=1;                                //数据左移1          如是逆向取模则改为右移>>                               
  230.                                         R1=CY;                //发送最高位,
  231.                                         RD2[i]<<=1;       
  232.                                         R2=CY;               
  233.                                         GD1[i]<<=1;
  234.                                         G1=CY;
  235.                                         GD2[i]<<=1;
  236.                                         G2=CY;
  237.                                         CK=0;                                        //时钟下降
  238.                                         NOP4;                               
  239.                                         CK=1;                                   //时钟上升
  240.                                 #else
  241.                                         RD1[i]<<=1;                                //数据左移1          如是逆向取模则改为右移>>                               
  242.                                         R1=!CY;                //发送最高位,
  243.                                         RD2[i]<<=1;       
  244.                                         R2=!CY;                //由于数据是低电平有效,所以进行取反
  245.                                         GD1[i]<<=1;
  246.                                         G1=!CY;
  247.                                         GD2[i]<<=1;
  248.                                         G2=!CY;
  249.                                         CK=0;                                        //时钟下降
  250.                                         NOP4;                               
  251.                                         CK=1;                                   //时钟上升
  252.                                 #endif
  253.                                 }
  254.                         }
  255.                         ABCD=row;                        //行选
  256.                          LS=0;
  257.                         NOP4;               
  258.                         LS=1;                                //锁存上升,显示输出
  259.                         EN_ON();                                //显示开
  260.                         Delay(40);
  261. //                        TH0=255-ADC_L;
  262. //                        TR0=1;
  263.                         EN_OFF();                            //显示关
  264.         //                Delay(1);       
  265.                 }                       
  266.         }
  267. }


  268. void Mode0123_RQ_G()                //  模式1234日期  绿数据
  269. {
  270.         uchar row1,row2;

  271.         row1=row+8;                //        上1/2屏行扫描
  272.         row2=row-8;                //        下1/2屏行扫描

  273.         if(row<8)                //上1/2屏                 
  274.         {
  275.                 GD1[0]=(Num5[2][row]<<3)|(Num5[0][row]>>3);
  276.                 GD1[1]=(Num5[0][row]<<5)|(Num5[nian1][row]>>1);
  277.                 GD1[2]=(Num5[nian1][row]<<7)|(Num5[nian2][row]<<1);
  278.                 GD1[3]=Num5[yue1][row];
  279.                 GD1[4]=Num5[yue2][row]<<2;
  280.                 GD1[5]=Num5[ri1][row]<<1;
  281.                 GD1[6]=Num5[ri2][row]<<3;
  282.                 GD1[7]=Num8[week][row];
  283.                 if(row==3)                //日期点
  284.                 {
  285.                         GD1[3]|=0xC0;
  286.                         GD1[4]|=0x01;
  287.                         GD1[5]|=0x80;
  288.                 }
  289.         }
  290.         else           //下1/2/屏
  291.         {

  292.                 GD2[0]=Num8[y1][row2];        //农历日期
  293.                 GD2[1]=Num8[y2][row2];
  294.                 GD2[2]=Num8[11][row2];
  295.                 GD2[3]=NL8  [r1][row2];
  296.                 GD2[4]=Num8[r2][row2]>>1;

  297.                 GD2[5]=Num8[r2][row2]<<7 | Num5[t1][row2-1]>>2;         //温度
  298.                 GD2[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;               
  299.                 GD2[7]=Num5[17][row2];

  300. //                GD2[0]=Num5[Zhi_12][row2];
  301. //                GD2[1]=Num5[PM][row2];
  302. //                GD2[0]=Num5[Li/10][row2];
  303. //                GD2[1]=Num5[Li%10][row2];
  304. //                GD2[2]=0;
  305. //                GD2[3]=Num5[XSMOD/10][row2];
  306. //                GD2[4]=Num5[XSMOD%10][row2]<<2;

  307.                 // GD2[5]=Num5[TH0/100][row2];
  308.                 // GD2[6]=Num5[TH0%100/10][row2];
  309.                 // GD2[7]=Num5[TH0%10][row2];
  310.         }
  311. }


  312. void Mode0123_RQ_R()          //模式1234日期 红数据
  313. {
  314.         uchar row1,row2;

  315.         row1=row+8;                //        上1/2屏行扫描
  316.         row2=row-8;                //        下1/2屏行扫描
  317.         if(row<8)
  318.                 RD1[7]=Num8[week][row];
  319.         else
  320.         {
  321.                 RD2[5]=Num5[t1][row2-1]>>2;         //温度
  322.                 RD2[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;               
  323. //                RD2[7]=Num5[17][row2];
  324.         }
  325. }

  326. void Mode0_SJ_G()
  327. {
  328.         uchar data row1,row2;

  329.         row1=row+8;                //        上1/2屏行扫描
  330.         row2=row-8;                //        下1/2屏行扫描

  331.         if(row<8)
  332.         {
  333.                 if(GPS_POW)
  334.                         NOP;
  335.                 else
  336.                 {
  337.                 GD2[2]|=maohao[0][row1];
  338.                 GD2[6]|=maohao[1][row1];
  339.                 }
  340.         }
  341.         else
  342.         {
  343.                 if(GPS_POW)
  344.                         NOP;
  345.                 else
  346.                 {
  347.                 GD1[2]|=maohao[0][row2];
  348.                 GD1[6]|=maohao[1][row2];
  349.                 }
  350.         }
  351. }


  352. void Mode0_SJ_R()           //三行有秒,粗体时间
  353. {
  354.         uchar row1,row2,row3;

  355.         if(row<8)
  356.         {
  357.                    row1=(row+8)*2;                //        上1/2屏行扫描
  358.                 row2=(row+8)*2+1;                //        下1/2屏行扫描
  359.                 row3=row+8;
  360.                
  361.                 if(shi1==0)
  362.                 {
  363.                         RD2[0]=0;
  364.                         RD2[1]=Num14B[shi2][row1]>>3;
  365.                 }
  366.                 else
  367.                 {                               
  368.                         RD2[0]=Num14B[shi1][row1];          //时
  369.                         RD2[1]=Num14B[shi1][row2] | Num14B[shi2][row1]>>3;
  370.                 }
  371.                 RD2[2]=Num14B[shi2][row1]<<5 | Num14B[shi2][row2]>>3;          
  372.                 RD2[3]=Num14B[fen1][row1]>>2;           // 分
  373.                 RD2[4]=Num14B[fen1][row1]<<6 | Num14B[fen1][row2]>>2 | Num14B[fen2][row1]>>5;         
  374.                 RD2[5]=Num14B[fen2][row1]<<3 | Num14B[fen2][row2]>>5;
  375.                 RD2[6]=Num12[miao1][row3]>>2;                   //秒
  376.                 RD2[7]=Num12[miao2][row3]>>1 | Num12[miao1][row3]<<6;


  377.                 if(GPS_POW)
  378.                 {
  379.                 RD2[2]|=maohao[0][row3];
  380.                 RD2[6]|=maohao[1][row3];
  381.                 }
  382.         }
  383.         else                                  //时间上半部
  384.         {
  385.                 row1=(row-8)*2;                //        上1/2屏行扫描
  386.                 row2=(row-8)*2+1;                //        下1/2屏行扫描
  387.                 row3=row-8;
  388.                
  389.                 if(shi1==0)
  390.                 {
  391.                         RD1[0]=0;
  392.                         RD1[1]=Num14B[shi2][row1]>>3;
  393.                 }
  394.                 else
  395.                 {                               
  396.                         RD1[0]=Num14B[shi1][row1];          //时
  397.                         RD1[1]=Num14B[shi1][row2] | Num14B[shi2][row1]>>3;
  398.                 }
  399.                 RD1[2]=Num14B[shi2][row1]<<5 | Num14B[shi2][row2]>>3;          
  400.                 RD1[3]=Num14B[fen1][row1]>>2;           // 分
  401.                 RD1[4]=Num14B[fen1][row1]<<6 | Num14B[fen1][row2]>>2 | Num14B[fen2][row1]>>5;         
  402.                 RD1[5]=Num14B[fen2][row1]<<3 | Num14B[fen2][row2]>>5;
  403.                 RD1[6]=Num12[miao1][row3]>>2;                   //秒
  404.                 RD1[7]=Num12[miao2][row3]>>1 | Num12[miao1][row3]<<6;

  405.                 if(PM)
  406.                         RD1[0]|=Num12[15][row3];
  407.                        
  408.                 if(GPS_POW)
  409.                 {
  410.                 RD1[2]|=maohao[0][row3];
  411.                 RD1[6]|=maohao[1][row3];
  412.                 }

  413.         }
  414. }



  415. void Mode1_SJ_R()
  416. {
  417.         uchar row1,row2;

  418.         row1=row+8;                //        上1/2屏行扫描
  419.         row2=row-8;                //        下1/2屏行扫描

  420.         if(row<8)
  421.         {
  422.                 if(shi1==0) RD1[0]=0; else                               
  423.                 RD2[0]=Num14[shi1][row1];          //时
  424.                 RD2[1]=Num14[shi2][row1]>>2;
  425.                 RD2[2]=Num14[shi2][row1]<<6;          
  426.                 RD2[3]=Num14[fen1][row1]>>2;           // 分
  427.                 RD2[4]=Num14[fen2][row1]>>4 | Num14[fen1][row1]<<6;         
  428.                 RD2[5]=Num14[fen2][row1]<<4 ;
  429.                 RD2[6]=Num12[miao1][row1]>>1;                   //秒
  430.                 RD2[7]=Num12[miao2][row1];


  431.                 if(row==3|row==4)
  432.                 {
  433.                         if(GPS_POW)
  434.                         {
  435.                                 RD2[2]|=0x06;
  436.                                 RD2[5]|=0x03;
  437.                         }
  438. //                        else
  439. //                        {
  440. //                                GD2[2]|=0x06;
  441. //                                GD2[5]|=0x03;
  442. //                        }
  443.                 }

  444.         }
  445.         else                                  //时间上半部
  446.         {
  447.                 if(shi1==0) RD1[0]=0; else
  448.                 RD1[0]=Num14[shi1][row2];          //时
  449.                 RD1[1]=Num14[shi2][row2]>>2;
  450.                 RD1[2]=Num14[shi2][row2]<<6;          
  451.                 RD1[3]=Num14[fen1][row2]>>2;           // 分
  452.                 RD1[4]=Num14[fen2][row2]>>4 | Num14[fen1][row2]<<6;         
  453.                 RD1[5]=Num14[fen2][row2]<<4 ;
  454.                 RD1[6]=Num12[miao1][row2]>>1;                   //秒
  455.                 RD1[7]=Num12[miao2][row2];
  456.                 if(PM)
  457.                         RD1[0]|=Num12[15][row2];
  458.                
  459.                 if(row==12|row==13)
  460.                 {
  461.                         if(GPS_POW)
  462.                         {
  463.                                 RD1[2]|=0x06;
  464.                                 RD1[5]|=0x03;
  465.                         }
  466.                 }

  467.         }
  468. }



  469. void Mode1_SJ_G()
  470. {
  471.         uchar row1,row2;

  472.         row1=row+8;                //        上1/2屏行扫描
  473.         row2=row-8;                //        下1/2屏行扫描

  474.         if(row<8)
  475.         {
  476.                 if(row==3|row==4)
  477.                 {
  478.                         if(GPS_POW)
  479.                         {
  480.                            ;
  481.                         }
  482.                         else
  483.                         {
  484.                                 GD2[2]|=0x06;
  485.                                 GD2[5]|=0x03;
  486.                         }
  487.                 }
  488.         }
  489.         else
  490.         {
  491.                 if(row==12|row==13)
  492.                 {
  493.                         if(GPS_POW)
  494.                         {
  495.                                 ;
  496.                         }
  497.                         else
  498.                         {
  499.                                 GD1[2]|=0x06;
  500.                                 GD1[5]|=0x03;
  501.                         }
  502.                 }
  503.         }
  504. }


  505. void Mode2_SJ_R()
  506. {
  507.         uchar row3,row4;

  508.         if(row<8)
  509.         {
  510.         ////时间
  511.                 row3=(row+8)*2;
  512.                 row4=(row+8)*2+1;
  513.                 if(shi1==0)          //
  514.                         RD2[0]=RD2[1]=0;
  515.                 else
  516.                 {                               
  517.                         RD2[0]=Num16B[shi1][row3];          //时
  518.                         RD2[1]=Num16B[shi1][row4];
  519.                 }
  520.                 RD2[2]=Num16B[shi2][row3]<<3 | Num16B[shi2][row4]>>5;          
  521.                 RD2[3]=Num16B[shi2][row4]<<3;           // 分
  522.                 RD2[4]=Num16B[fen1][row3]>>3;
  523.                 RD2[5]=Num16B[fen1][row4]>>3| Num16B[fen1][row3]<<5;
  524.                 RD2[6]=Num16B[fen2][row3];                   //秒
  525.                 RD2[7]=Num16B[fen2][row4];


  526.         //秒点
  527.                 if(SHAN)
  528.                 {
  529.                         if(GPS_POW)
  530.                         {
  531.                                 RD2[3]|=maohao[4][row+8];
  532.                                 RD2[4]|=maohao[3][row+8];
  533.                         }
  534.                 }
  535.                 else
  536.                 {
  537.                         if(GPS_POW)
  538.                         {
  539.                                 NOP4;
  540.                                 NOP4;
  541.                         }
  542.                 }        }
  543.         else                                  //时间上半部
  544.         {
  545. //                if(shi1==0) RD1[0]=0; else
  546.                 row3=(row-8)*2;
  547.                 row4=(row-8)*2+1;
  548.                 if(shi1==0)
  549.                         RD1[0]=RD1[1]=0;
  550.                 else
  551.                 {                               
  552.                         RD1[0]=Num16B[shi1][row3];          //时
  553.                         RD1[1]=Num16B[shi1][row4];
  554.                 }       
  555.                 RD1[2]=Num16B[shi2][row3]<<3 | Num16B[shi2][row4]>>5;          
  556.                 RD1[3]=Num16B[shi2][row4]<<3;           // 分
  557.                 RD1[4]=Num16B[fen1][row3]>>3;
  558.                 RD1[5]=Num16B[fen1][row4]>>3| Num16B[fen1][row3]<<5;
  559.                 RD1[6]=Num16B[fen2][row3];                   //秒
  560.                 RD1[7]=Num16B[fen2][row4];
  561.                 if(PM)
  562.                         RD1[0]|=Num12[15][row-8];
  563.                 if(SHAN)
  564.                 {
  565.                         if(GPS_POW)
  566.                         {
  567.                                 RD1[3]|=maohao[4][row-8];
  568.                                 RD1[4]|=maohao[3][row-8];
  569.                         }
  570.                 }
  571.                 else
  572.                 {
  573.                         if(GPS_POW)
  574.                         {
  575.                                 NOP4;
  576.                                 NOP4;
  577.                         }
  578.                 }
  579.         }               

  580. }


  581. void Mode2_SJ_G()
  582. {
  583.         if(row<8)
  584.         {
  585.         //秒点
  586.                 if(SHAN)
  587.                 {

  588.                                 if(GPS_POW)
  589.                                 {
  590.                                         NOP;
  591.                                 }
  592.                                 else
  593.                                 {
  594.                                         GD2[3]|=maohao[4][row+8];
  595.                                         GD2[4]|=maohao[3][row+8];
  596.                                 }
  597.                 }
  598.                 else
  599.                         Delayus(20);
  600.         }
  601.         else                                  //时间上半部
  602.         {
  603.                 if(SHAN)
  604.                 {

  605.                                 if(GPS_POW)
  606.                                 {
  607.                                         NOP;
  608.                                 }
  609.                                 else
  610.                                 {
  611.                                         GD1[3]|=maohao[4][row-8];
  612.                                         GD1[4]|=maohao[3][row-8];
  613.                                 }
  614.                 }
  615.                 else
  616.                         Delayus(20);
  617.         }               

  618. }


  619. void Mode3_SJ_R()
  620. {
  621.         uchar row3,row4;

  622.         if(row<8)
  623.         {
  624.         ////时间
  625.                 row3=(row+8)*2;
  626.                 row4=(row+8)*2+1;
  627.                 if(shi1==0)          //
  628.                         RD2[0]=RD2[1]=0;
  629.                 else
  630.                 {                               
  631.                         RD2[0]=Num16[shi1][row3];          //时
  632.                         RD2[1]=Num16[shi1][row4];
  633.                 }
  634.                 RD2[2]=Num16[shi2][row3]<<3 | Num16[shi2][row4]>>5;          
  635.                 RD2[3]=Num16[shi2][row4]<<3;           // 分
  636.                 RD2[4]=Num16[fen1][row3]>>3;
  637.                 RD2[5]=Num16[fen1][row4]>>3| Num16[fen1][row3]<<5;
  638.                 RD2[6]=Num16[fen2][row3];                   //秒
  639.                 RD2[7]=Num16[fen2][row4];


  640.         //秒点
  641.                 if(SHAN)
  642.                 {
  643.                         if(GPS_POW)
  644.                         {

  645.                                 RD2[3]|=maohao[4][row+8];
  646.                                 RD2[4]|=maohao[3][row+8];
  647.                         }
  648.                 }
  649.                 else
  650.                 {
  651.                         if(GPS_POW)
  652.                         {
  653.                                         NOP4;
  654.                                         NOP4;
  655.                         }
  656.                 }
  657.         }       
  658.         else                                  //时间上半部
  659.         {
  660. //                if(shi1==0) RD1[0]=0; else
  661.                 row3=(row-8)*2;
  662.                 row4=(row-8)*2+1;
  663.                 if(shi1==0)
  664.                         RD1[0]=RD1[1]=0;
  665.                 else
  666.                 {                               
  667.                         RD1[0]=Num16[shi1][row3];          //时
  668.                         RD1[1]=Num16[shi1][row4];
  669.                 }       
  670.                 RD1[2]=Num16[shi2][row3]<<3 | Num16[shi2][row4]>>5;          
  671.                 RD1[3]=Num16[shi2][row4]<<3;           // 分
  672.                 RD1[4]=Num16[fen1][row3]>>3;
  673.                 RD1[5]=Num16[fen1][row4]>>3| Num16[fen1][row3]<<5;
  674.                 RD1[6]=Num16[fen2][row3];                   //秒
  675.                 RD1[7]=Num16[fen2][row4];
  676.                 if(PM)
  677.                         RD1[0]|=Num12[15][row-8];
  678.                 if(SHAN)
  679.                 {
  680.                         if(GPS_POW)
  681.                         {
  682.                                 RD1[3]|=maohao[4][row-8];
  683.                                 RD1[4]|=maohao[3][row-8];
  684.                         }
  685.                 }
  686.                 else
  687.                 {
  688.                         if(GPS_POW)
  689.                         {
  690.                                         NOP4;
  691.                                         NOP4;
  692.                         }
  693.                 }
  694.         }               

  695. }


  696. void Mode3_SJ_G()
  697. {
  698.         if(row<8)
  699.         {
  700.         //秒点
  701.                 if(SHAN)
  702.                 {

  703.                                 if(GPS_POW)
  704.                                 {
  705.                                         NOP;
  706.                                 }
  707.                                 else
  708.                                 {
  709.                                         GD2[3]|=maohao[4][row+8];
  710.                                         GD2[4]|=maohao[3][row+8];
  711.                                 }
  712.                 }
  713.                 else
  714.                         Delayus(20);
  715.         }
  716.         else                                  //时间上半部
  717.         {
  718.                 if(SHAN)
  719.                 {

  720.                                 if(GPS_POW)
  721.                                 {
  722.                                         NOP;
  723.                                 }
  724.                                 else
  725.                                 {
  726.                                         GD1[3]|=maohao[4][row-8];
  727.                                         GD1[4]|=maohao[3][row-8];
  728.                                 }
  729.                 }
  730.                 else
  731.                         Delayus(20);
  732.         }               

  733. }



  734. void Mode4567_RQ_G()
  735. {
  736.         uchar row1,row2;

  737.         row1=row+8;                //        上1/2屏行扫描
  738.         row2=row-8;                //        下1/2屏行扫描

  739.         if(row<8)                //上1/2屏                 
  740.         {
  741. //                GD1[0]=(Num5[2][row]<<3)|(Num5[0][row]>>3);
  742. //                GD1[1]=(Num5[0][row]<<5)|(Num5[nian1][row]>>1);
  743. //                GD1[2]=(Num5[nian1][row]<<7)|(Num5[nian2][row]<<1);
  744. //                GD1[3]=Num5[yue1][row];
  745. //                GD1[4]=Num5[yue2][row]<<2;
  746. //                GD1[5]=Num5[ri1][row]<<1;
  747. //                GD1[6]=Num5[ri2][row]<<3;
  748.                 GD1[7]=Num8[week][row];
  749.                 if(row==3)                //日期点
  750.                 {
  751.                         GD1[3]|=0xC0;
  752.                         GD1[4]|=0x01;
  753.                         GD1[5]|=0x80;
  754.                 }
  755.         }
  756.         else           //下1/2/屏
  757.         {

  758.                 GD1[0]=Num8[y1][row2];        //农历日期
  759.                 GD1[1]=Num8[y2][row2];
  760.                 GD1[2]=Num8[11][row2];
  761.                 GD1[3]=NL8  [r1][row2];
  762.                 GD1[4]=Num8[r2][row2]>>1;

  763.                 GD1[5]=Num8[r2][row2]<<7 | Num5[t1][row2-1]>>2;         //温度
  764.                 GD1[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;               
  765.                 GD1[7]=Num5[17][row2];

  766.                 // GD1[0]=(Num5[Light_R/100][row2]<<3)|(Num5[Light_R%100/10][row2]>>3);
  767.                 // GD1[1]=(Num5[Light_R%100/10][row2]<<5)|(Num5[Light_R%10][row2]>>1);
  768.                 // GD1[2]=(Num5[Light_R%10][row2]<<7);

  769.                 // GD1[3]=Num5[XSMOD/10][row2];
  770.                 // GD1[4]=Num5[XSMOD%10][row2]<<2;

  771. //                GD1[5]=Num5[ADC_T/100][row2];
  772. //                GD1[6]=Num5[ADC_T%100/10][row2];
  773. //                GD1[7]=Num5[ADC_T%10][row2];

  774. //                GD1[5]=Num5[TH0/100][row2];
  775. //                GD1[6]=Num5[TH0%100/10][row2];
  776. //                GD1[7]=Num5[TH0%10][row2];
  777.         }       
  778. }


  779. void Mode4567_RQ_R()          //模式4567日期 红数据
  780. {
  781.         uchar row1,row2;

  782.         row1=row+8;                //        上1/2屏行扫描
  783.         row2=row-8;                //        下1/2屏行扫描
  784.         if(row<8)
  785.         {
  786.                 RD1[0]=(Num5[2][row]<<3)|(Num5[0][row]>>3);
  787.                 RD1[1]=(Num5[0][row]<<5)|(Num5[nian1][row]>>1);
  788.                 RD1[2]=(Num5[nian1][row]<<7)|(Num5[nian2][row]<<1);
  789.                 RD1[3]=Num5[yue1][row];
  790.                 RD1[4]=Num5[yue2][row]<<2;
  791.                 RD1[5]=Num5[ri1][row]<<1;
  792.                 RD1[6]=Num5[ri2][row]<<3;
  793.                 RD1[7]=Num8[week][row];
  794.         }
  795.         else
  796.         {
  797.                 RD1[5]=Num5[t1][row2-1]>>2;         //温度
  798.                 RD1[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;               
  799. //                RD1[7]=Num5[17][row2];
  800.         }
  801. }


  802. void Mode4_SJ_G()
  803. {
  804.         if(GPS_POW)
  805.         {
  806.            NOP;
  807.         }
  808.         else
  809.         {
  810.                 GD2[2]|=maohao[0][row];
  811.                 GD2[6]|=maohao[1][row];
  812.         }
  813. }


  814. void Mode4_SJ_R()
  815. {
  816.         uchar row1,row2;
  817. //        shi1=shi2=0;

  818.            row1=(row-1)*2;                //        上1/2屏行扫描
  819.         row2=(row-1)*2+1;                //        下1/2屏行扫描
  820.         if(row)
  821.         {
  822.                 if(shi1==0)
  823.                 {
  824.                         RD2[0]=0;
  825.                         RD2[1]=Num14B[shi2][row1]>>3;
  826.                 }
  827.                 else
  828.                 {                               
  829.                         RD2[0]=Num14B[shi1][row1];          //时
  830.                         RD2[1]=Num14B[shi1][row2] | Num14B[shi2][row1]>>3;
  831.                 }
  832.                 RD2[2]=Num14B[shi2][row1]<<5 | Num14B[shi2][row2]>>3;          
  833.                 RD2[3]=Num14B[fen1][row1]>>2;           // 分
  834.                 RD2[4]=Num14B[fen1][row1]<<6 | Num14B[fen1][row2]>>2 | Num14B[fen2][row1]>>5;         
  835.                 RD2[5]=Num14B[fen2][row1]<<3 | Num14B[fen2][row2]>>5;
  836.                 RD2[6]=Num12[miao1][row-1]>>2;                   //秒
  837.                 RD2[7]=Num12[miao2][row-1]>>1 | Num12[miao1][row-1]<<6;

  838.                 if(GPS_POW)
  839.                 {
  840.                 RD2[2]|=maohao[0][row];
  841.                 RD2[6]|=maohao[1][row];
  842.                 }
  843.         }
  844.         if(PM)
  845.                 RD2[0]|=Num12[15][row];
  846. }


  847. void Mode5_SJ_G()
  848. {
  849.         if(GPS_POW)
  850.         {
  851.            NOP;
  852.         }
  853.         else
  854.         {
  855.                 GD2[2]|=maohao[2][row];
  856.                 GD2[5]|=maohao[0][row];
  857.         }
  858. }


  859. void Mode5_SJ_R()
  860. {
  861.         uchar row1;

  862.         row1=row-1;                //        上1/2屏行扫描
  863. //        row2=row-8;                //        下1/2屏行扫描

  864.         if(row)
  865.         {
  866.                 if(shi1==0) RD2[0]=0; else                               
  867.                 RD2[0]=Num14[shi1][row1];          //时
  868.                 RD2[1]=Num14[shi2][row1]>>2;
  869.                 RD2[2]=Num14[shi2][row1]<<6;          
  870.                 RD2[3]=Num14[fen1][row1]>>2;           // 分
  871.                 RD2[4]=Num14[fen2][row1]>>4 | Num14[fen1][row1]<<6;         
  872.                 RD2[5]=Num14[fen2][row1]<<4 ;
  873.                 RD2[6]=Num12[miao1][row1]>>1;                   //秒
  874.                 RD2[7]=Num12[miao2][row1];

  875.                 if(GPS_POW)
  876.                 {
  877.                         RD2[2]|=maohao[2][row];
  878.                         RD2[5]|=maohao[0][row];
  879.                 }
  880.         }
  881.        
  882.         if(PM)
  883.                 RD2[0]|=Num12[15][row];
  884. }


  885. void Mode6_SJ_G()
  886. {

  887. //秒点
  888.         if(SHAN)
  889.         {

  890.                 if(GPS_POW)
  891.                 {
  892.                         NOP;
  893.                 }
  894.                 else
  895.                 {
  896.                         GD2[3]|=maohao[4][row];
  897.                         GD2[4]|=maohao[3][row];
  898.                 }

  899.         }
  900.         else
  901.                 Delayus(30);

  902. }

  903. void Mode6_SJ_R()
  904. {
  905.         uchar  row3,row4;

  906.         if(row)
  907.         {
  908.         ////时间
  909.                 row3=(row-1)*2;
  910.                 row4=(row-1)*2+1;
  911.                 if(shi1==0)          //
  912.                         RD2[0]=RD2[1]=0;
  913.                 else
  914.                 {                               
  915.                         RD2[0]=Num16B[shi1][row3];          //时
  916.                         RD2[1]=Num16B[shi1][row4];
  917.                 }
  918.                 RD2[2]=Num16B[shi2][row3]<<3 | Num16B[shi2][row4]>>5;          
  919.                 RD2[3]=Num16B[shi2][row4]<<3;           // 分
  920.                 RD2[4]=Num16B[fen1][row3]>>3;
  921.                 RD2[5]=Num16B[fen1][row4]>>3| Num16B[fen1][row3]<<5;
  922.                 RD2[6]=Num16B[fen2][row3];                   //秒
  923.                 RD2[7]=Num16B[fen2][row4];
  924.         //秒点
  925.                 if(SHAN)
  926.                 {
  927.                         if(GPS_POW)
  928.                         {
  929.                                 RD2[3]|=maohao[4][row];
  930.                                 RD2[4]|=maohao[3][row];
  931.                         }
  932.                 }
  933.                 else
  934.                 {

  935.                         if(GPS_POW)
  936.                         {
  937.                                 NOP4;
  938.                                 NOP4;
  939.                         }

  940.                 }
  941.         }
  942.         if(PM)
  943.                 RD2[0]|=Num12[15][row];
  944. }


  945. void Mode7_SJ_G()
  946. {

  947. //秒点
  948.         if(SHAN)
  949.         {

  950.                 if(GPS_POW)
  951.                 {
  952.                         NOP;
  953.                 }
  954.                 else
  955.                 {
  956.                         GD2[3]|=maohao[4][row];
  957.                         GD2[4]|=maohao[3][row];
  958.                 }

  959.         }
  960.         else
  961.                 Delayus(30);

  962. }

  963. void Mode7_SJ_R()
  964. {
  965.         uchar row3,row4;

  966.         if(row)
  967.         {
  968.         ////时间
  969.                 row3=(row-1)*2;
  970.                 row4=(row-1)*2+1;
  971.                 if(shi1==0)          //
  972.                         RD2[0]=RD2[1]=0;
  973.                 else
  974.                 {                               
  975.                         RD2[0]=Num16[shi1][row3];          //时
  976.                         RD2[1]=Num16[shi1][row4];
  977.                 }
  978.                 RD2[2]=Num16[shi2][row3]<<3 | Num16[shi2][row4]>>5;          
  979.                 RD2[3]=Num16[shi2][row4]<<3;           // 分
  980.                 RD2[4]=Num16[fen1][row3]>>3;
  981.                 RD2[5]=Num16[fen1][row4]>>3| Num16[fen1][row3]<<5;
  982.                 RD2[6]=Num16[fen2][row3];                   //秒
  983.                 RD2[7]=Num16[fen2][row4];
  984.         //秒点
  985.                 if(SHAN)
  986.                 {
  987.                         if(GPS_POW)
  988.                         {
  989.                                 RD2[3]|=maohao[4][row];
  990.                                 RD2[4]|=maohao[3][row];
  991.                         }
  992.                 }
  993.                 else
  994.                 {

  995.                         if(GPS_POW)
  996.                         {
  997.                                 NOP4;
  998.                                 NOP4;
  999.                         }

  1000.                 }
  1001.         }
  1002.         if(PM)
  1003.                 RD2[0]|=Num12[15][row];
  1004. }


  1005. void Mode8_SJ_G()
  1006. {
  1007.         if(GPS_POW)
  1008.         {
  1009.            NOP;
  1010.         }
  1011.         else
  1012.         {
  1013.                 GD1[2]|=maohao[0][row];
  1014.                 GD1[6]|=maohao[1][row];
  1015.         }
  1016. }

  1017. void Mode8_SJ_R()
  1018. {
  1019.         uchar  row1,row2;
  1020. //        shi1=shi2=0;

  1021.            row1=(row)*2;                //        上1/2屏行扫描
  1022.         row2=(row)*2+1;                //        下1/2屏行扫描

  1023.         if(shi1==0)
  1024.         {
  1025.                 RD1[0]=0;
  1026.                 RD1[1]=Num14B[shi2][row1]>>3;
  1027.         }
  1028.         else
  1029.         {                               
  1030.                 RD1[0]=Num14B[shi1][row1];          //时
  1031.                 RD1[1]=Num14B[shi1][row2] | Num14B[shi2][row1]>>3;
  1032.         }
  1033.         RD1[2]=Num14B[shi2][row1]<<5 | Num14B[shi2][row2]>>3;          
  1034.         RD1[3]=Num14B[fen1][row1]>>2;           // 分
  1035.         RD1[4]=Num14B[fen1][row1]<<6 | Num14B[fen1][row2]>>2 | Num14B[fen2][row1]>>5;         
  1036.         RD1[5]=Num14B[fen2][row1]<<3 | Num14B[fen2][row2]>>5;
  1037.         RD1[6]=Num12[miao1][row-1]>>2;                   //秒
  1038.         RD1[7]=Num12[miao2][row-1]>>1 | Num12[miao1][row-1]<<6;

  1039.         if(GPS_POW)
  1040.         {
  1041.         RD1[2]|=maohao[0][row];
  1042.         RD1[6]|=maohao[1][row];
  1043.         }

  1044.         if(PM)
  1045.                 RD1[0]|=Num12[15][row];
  1046. }

  1047. void Mode9_SJ_R()           //细体时间 有秒
  1048. {
  1049.         if(!shi1) RD1[0]=0; else
  1050.         RD1[0]=Num14[shi1][row];          //时
  1051.         RD1[1]=Num14[shi2][row]>>2;
  1052.         RD1[2]=Num14[shi2][row]<<6;          
  1053.         RD1[3]=Num14[fen1][row]>>2;           // 分
  1054.         RD1[4]=Num14[fen2][row]>>4 | Num14[fen1][row]<<6;         
  1055.         RD1[5]=Num14[fen2][row]<<4 ;
  1056.         RD1[6]=Num12[miao1][row]>>1;                   //秒
  1057.         RD1[7]=Num12[miao2][row]>>1;

  1058. //        RD1[6]=Num12[z/100][row]>>1;                   //秒
  1059. //        RD1[7]=Num12[z%100/10][row]>>1;
  1060.         if(PM)
  1061.                 RD1[0]|=Num12[15][row];
  1062.         if(GPS_POW)
  1063.         {
  1064.                 RD1[2]|=maohao[2][row];
  1065.                 RD1[5]|=maohao[0][row];
  1066.         }
  1067.                        
  1068. }


  1069. void Mode9_SJ_G()
  1070. {       
  1071.         if(GPS_POW)
  1072.                 NOP;
  1073.         else
  1074.         {
  1075.                 GD1[2]|=maohao[2][row];
  1076.                 GD1[5]|=maohao[0][row];
  1077.         }
  1078. }

  1079. void Mode10_SJ_G()
  1080. {

  1081. //秒点
  1082.         if(SHAN)
  1083.         {

  1084.                 if(GPS_POW)
  1085.                 {
  1086.                         NOP;
  1087.                 }
  1088.                 else
  1089.                 {
  1090.                         GD1[3]|=maohao[4][row];
  1091.                         GD1[4]|=maohao[3][row];
  1092.                 }

  1093.         }
  1094.         else
  1095.                 Delayus(30);

  1096. }

  1097. void Mode10_SJ_R()
  1098. {
  1099.         uchar row3,row4;

  1100.         ////时间
  1101.                 row3=row*2;
  1102.                 row4=row*2+1;
  1103.                 if(shi1==0)          //
  1104.                         RD1[0]=RD1[1]=0;
  1105.                 else
  1106.                 {                               
  1107.                         RD1[0]=Num16B[shi1][row3];          //时
  1108.                         RD1[1]=Num16B[shi1][row4];
  1109.                 }
  1110.                 RD1[2]=Num16B[shi2][row3]<<3 | Num16B[shi2][row4]>>5;          
  1111.                 RD1[3]=Num16B[shi2][row4]<<3;           // 分
  1112.                 RD1[4]=Num16B[fen1][row3]>>3;
  1113.                 RD1[5]=Num16B[fen1][row4]>>3| Num16B[fen1][row3]<<5;
  1114.                 RD1[6]=Num16B[fen2][row3];                   //秒
  1115.                 RD1[7]=Num16B[fen2][row4];
  1116.         //秒点
  1117.                 if(SHAN)
  1118.                 {
  1119.                         if(GPS_POW)
  1120.                         {
  1121.                                 RD1[3]|=maohao[4][row];
  1122.                                 RD1[4]|=maohao[3][row];
  1123.                         }
  1124.                 }
  1125.                 else
  1126.                 {

  1127.                         if(GPS_POW)
  1128.                         {
  1129.                                 NOP4;
  1130.                                 NOP4;
  1131.                         }

  1132.                 }

  1133.         if(PM)
  1134.                 RD1[0]|=Num12[15][row];
  1135. }

  1136. void Mode11_SJ_G()
  1137. {

  1138. //秒点
  1139.         if(SHAN)
  1140.         {

  1141.                 if(GPS_POW)
  1142.                 {
  1143.                         NOP;
  1144.                 }
  1145.                 else
  1146.                 {
  1147.                         GD1[3]|=maohao[4][row];
  1148.                         GD1[4]|=maohao[3][row];
  1149.                 }

  1150.         }
  1151.         else
  1152.                 Delayus(30);

  1153. }

  1154. void Mode11_SJ_R()
  1155. {
  1156.         uchar row3,row4;

  1157.         ////时间
  1158.                 row3=row*2;
  1159.                 row4=row*2+1;
  1160.                 if(shi1==0)          //
  1161.                         RD1[0]=RD1[1]=0;
  1162.                 else
  1163.                 {                               
  1164.                         RD1[0]=Num16[shi1][row3];          //时
  1165.                         RD1[1]=Num16[shi1][row4];
  1166.                 }
  1167.                 RD1[2]=Num16[shi2][row3]<<3 | Num16[shi2][row4]>>5;          
  1168.                 RD1[3]=Num16[shi2][row4]<<3;           // 分
  1169.                 RD1[4]=Num16[fen1][row3]>>3;
  1170.                 RD1[5]=Num16[fen1][row4]>>3| Num16[fen1][row3]<<5;
  1171.                 RD1[6]=Num16[fen2][row3];                   //秒
  1172.                 RD1[7]=Num16[fen2][row4];
  1173.         //秒点
  1174.                 if(SHAN)
  1175.                 {
  1176.                         if(GPS_POW)
  1177.                         {
  1178.                                 RD1[3]|=maohao[4][row];
  1179.                                 RD1[4]|=maohao[3][row];
  1180.                         }
  1181.                 }
  1182.                 else
  1183.                 {

  1184.                         if(GPS_POW)
  1185.                         {
  1186.                                 NOP4;
  1187.                                 NOP4;
  1188.                         }

  1189.                 }

  1190.         if(PM)
  1191.                 RD1[0]|=Num12[15][row];
  1192. }



  1193. void Mode8_RQ_G()
  1194. {
  1195.         uchar row1=row*2;
  1196.         uchar row2=row*2+1;
  1197.         if(!yue1) GD1[0]=0; else
  1198.         GD2[0]=Num13[yue1][row];         //月十位
  1199.         GD2[1]=Num13[yue2][row];         //月各位
  1200.         GD2[2]=HZ[19][row1];        //汉字月
  1201.         GD2[3]=HZ[19][row2] ;
  1202.         GD2[4]=Num13[ri1][row];         //日十位
  1203.         GD2[5]=Num13[ri2][row];         //日个位
  1204.         GD2[6]=HZ[20][row1];          //汉字日
  1205.         GD2[7]=HZ[20][row2];
  1206. }

  1207. void Mode8_NL_G()                //农历显示
  1208. {
  1209.         uchar row1=row*2;
  1210.         uchar row2=row*2+1;

  1211.         GD2[0]=HZ[NL_yue][row1];   //月十位
  1212.         GD2[1]=HZ[NL_yue][row2];
  1213.         GD2[2]=HZ[14][row1];        //月
  1214.         GD2[3]=HZ[14][row2];        //日个位
  1215.         GD2[4]=NLday[r1][row1];
  1216.         GD2[5]=NLday[r1][row2];        //日十位
  1217.         GD2[6]=HZ[r2][row1];
  1218.         GD2[7]=HZ[r2][row2];

  1219. }


  1220. void Mode8_XQ_G()
  1221. {
  1222.         uchar row1=row*2;
  1223.         uchar row2=row*2+1;         

  1224.         GD2[0]=HZ[13][row1];
  1225.         GD2[1]=HZ[13][row2];
  1226.         GD2[2]=HZ[week][row1];
  1227.         GD2[3]=HZ[week][row2];
  1228.         GD2[4]=Num13[t1][row]>>5;
  1229.         GD2[5]=Num13[t1][row]<<3 | Num13[t2][row]>>6;
  1230.         GD2[6]=Num13[t2][row]<<2 ;
  1231.         GD2[7]=Num12[10][row];  
  1232. }


  1233. void Mode8_XQ_R()
  1234. {

  1235.         RD2[4]=Num13[t1][row]>>5;
  1236.         RD2[5]=Num13[t1][row]<<3 | Num13[t2][row]>>6;
  1237.         RD2[6]=Num13[t2][row]<<2 ;   

  1238. }


  1239. void ModeSleep_R()
  1240. {
  1241.         if(PM)
  1242.                 RD1[1]|=Num12[15][row];
  1243.         if(shi1)
  1244.                 RD1[2]=Num9[shi1][row];
  1245.         RD1[3]=Num9[shi2][row];
  1246.         if(SHAN)
  1247.                 RD1[4]=Num9[10][row];
  1248.         RD1[5]=Num9[fen1][row];
  1249.         RD1[6]=Num9[fen2][row];

  1250.         RD2[3]=Num9[t1][row];
  1251.         RD2[4]=Num9[t2][row];
  1252.         RD2[5]=Num12[10][row]>>4;
  1253.         RD2[6]=Num12[10][row]<<4;
  1254.        
  1255. }

  1256. void UartInit(void)                //9600bps@24.576MHz
  1257. {
  1258.         PCON &= 0x7F;                //波特率不倍速
  1259.         SCON = 0x50;                //8位数据,可变波特率
  1260.         AUXR |= 0x04;                //独立波特率发生器时钟为Fosc,即1T
  1261.         BRT = BRT_INT;                //设定独立波特率发生器重装值
  1262.         AUXR |= 0x01;                //串口1选择独立波特率发生器为波特率发生器
  1263.         AUXR |= 0x10;                //启动独立波特率发生器

  1264. }


  1265. void LoadData_G()
  1266. {

  1267.         switch (Set_S)
  1268.         {
  1269.                 case 0:
  1270.                         if (POW_OK)
  1271.                         {
  1272.                                 switch (XSMOD)
  1273.                                 {
  1274.                                 case 0:
  1275.                                         Mode0123_RQ_G();
  1276.                                         Mode0_SJ_G();
  1277.                                         break;
  1278.                                 case 1:
  1279.                                         Mode0123_RQ_G();
  1280.                                         Mode1_SJ_G();
  1281.                                         break;
  1282.                                 case 2:
  1283.                                         Mode0123_RQ_G();
  1284.                                         Mode2_SJ_G();
  1285.                                         break;
  1286.                                 case 3:
  1287.                                         Mode0123_RQ_G();
  1288.                                         Mode3_SJ_G();
  1289.                                         break;
  1290.                                 case 4:
  1291.                                         Mode4567_RQ_G();
  1292.                                         Mode4_SJ_G();
  1293.                                         break;
  1294.                                 case 5:
  1295.                                         Mode4567_RQ_G();
  1296.                                         Mode5_SJ_G();
  1297.                                         break;
  1298.                                 case 6:
  1299.                                         Mode4567_RQ_G();
  1300.                                         Mode6_SJ_G();
  1301.                                         break;
  1302.                                 case 7:
  1303.                                         Mode4567_RQ_G();
  1304.                                         Mode7_SJ_G();
  1305.                                         break;
  1306.                                 case 8:
  1307.                                         Mode8_SJ_G();
  1308.                                         if (miao2<3)
  1309.                                                 Mode8_RQ_G();
  1310.                                         else
  1311.                                                 if (miao2<6)
  1312.                                                         Mode8_NL_G();
  1313.                                                 else
  1314.                                                         Mode8_XQ_G();
  1315.                                         break;
  1316.                                 case 9:
  1317.                                         Mode9_SJ_G();
  1318.                                         if (miao2<3)
  1319.                                                 Mode8_RQ_G();
  1320.                                         else
  1321.                                                 if (miao2<6)
  1322.                                                         Mode8_NL_G();
  1323.                                                 else
  1324.                                                         Mode8_XQ_G();
  1325.                                         break;
  1326.                                 case 10:
  1327.                                         Mode10_SJ_G();
  1328.                                         if (miao2<3)
  1329.                                                 Mode8_RQ_G();
  1330.                                         else
  1331.                                                 if (miao2<6)
  1332.                                                         Mode8_NL_G();
  1333.                                                 else
  1334.                                                         Mode8_XQ_G();
  1335.                                         break;
  1336.                                 case 11:
  1337.                                         Mode11_SJ_G();
  1338.                                         if (miao2<3)
  1339.                                                 Mode8_RQ_G();
  1340.                                         else
  1341.                                                 if (miao2<6)
  1342.                                                         Mode8_NL_G();
  1343.                                                 else
  1344.                                                         Mode8_XQ_G();
  1345.                                         break;                               
  1346.                                 }
  1347.                         }
  1348.                         else
  1349.                                 Delay(60);
  1350.                         break;
  1351.                 case 1:        SetNian_G();        break;
  1352.                 case 2:        SetYue_G();                break;
  1353.                 case 3:        SetRi_G();                break;
  1354.                 case 4:        SetShi_G();                break;
  1355.                 case 5:        SetFen_G();                break;
  1356.                 case 6:        SetMiao_G();        break;
  1357.                 case 7:        SetLiangdu_G();        break;;
  1358.                 case 8:        SetMinLiangdu_G();                break;
  1359.                 case 9: SetLiangduG_G();                break;
  1360.                 case 10: NTCbuchang_G();                break;
  1361.                 case 11: Yaokong_G();                break;
  1362.                 case 12:
  1363.                 case 13:
  1364.                 case 14:
  1365.                 case 15: Xuexi_G();                break;
  1366.         }
  1367. }


  1368. void LoadData_R()
  1369. {

  1370.         switch (Set_S)
  1371.         {
  1372.                 case 0:
  1373.                         if (POW_OK)
  1374.                         {
  1375.                                 switch (XSMOD)
  1376.                                 {
  1377.                                 case 0:
  1378.                                         Mode0123_RQ_R();
  1379.                                         Mode0_SJ_R();
  1380.                                         break;
  1381.                                 case 1:
  1382.                                         Mode0123_RQ_R();
  1383.                                         Mode1_SJ_R();
  1384.                                         break;
  1385.                                 case 2:
  1386.                                         Mode0123_RQ_R();
  1387.                                         Mode2_SJ_R();
  1388.                                         break;
  1389.                                 case 3:
  1390.                                         Mode0123_RQ_R();
  1391.                                         Mode3_SJ_R();
  1392.                                         break;
  1393.                                 case 4:
  1394.                                         Mode4567_RQ_R();
  1395.                                         Mode4_SJ_R();
  1396.                                         break;
  1397.                                 case 5:
  1398.                                         Mode4567_RQ_R();
  1399.                                         Mode5_SJ_R();
  1400.                                         break;
  1401.                                 case 6:
  1402.                                         Mode4567_RQ_R();
  1403.                                         Mode6_SJ_R();
  1404.                                         break;
  1405.                                 case 7:
  1406.                                         Mode4567_RQ_R();
  1407.                                         Mode7_SJ_R();
  1408.                                         break;
  1409.                                 case 8:
  1410.                                         Mode8_SJ_R();
  1411.                                         if (miao2>5)
  1412.                                                 Mode8_XQ_R();
  1413.                                         break;
  1414.                                 case 9:
  1415.                                         Mode9_SJ_R();
  1416.                                         if (miao2>5)
  1417.                                                 Mode8_XQ_R();
  1418.                                         break;
  1419.                                 case 10:
  1420.                                         Mode10_SJ_R();
  1421.                                         if (miao2>5)
  1422.                                                 Mode8_XQ_R();
  1423.                                         break;
  1424.                                 case 11:
  1425.                                         Mode11_SJ_R();
  1426.                                         if (miao2>5)
  1427.                                                 Mode8_XQ_R();
  1428.                                         break;
  1429.                                        
  1430.                                 }
  1431.                         }
  1432.                         else
  1433.                                 ModeSleep_R();
  1434.                         break;
  1435.                 case 1:        SetNian_R();        break;
  1436.                 case 2:        SetYue_R();                break;
  1437.                 case 3:        SetRi_R();                break;
  1438.                 case 4:        SetShi_R();                break;
  1439.                 case 5:        SetFen_R();                break;
  1440.                 case 6:        SetMiao_R();        break;
  1441.                 case 7:        SetLiangdu_R();        break;
  1442.                 case 8:        SetMinLiangdu_R();                break;
  1443.                 case 9: SetLiangduG_R();                break;
  1444.                 case 10: NTCbuchang_R();                break;
  1445.                 case 11: Yaokong_R();                break;
  1446.                 case 12:
  1447.                 case 13:
  1448.                 case 14:
  1449.                 case 15: Xuexi_R();                break;
  1450.         }
  1451. }

  1452. void SendData_G()
  1453. {
  1454.                 uchar i,j;       
  1455.                 for(i=0;i<8;i++)                                         //扫描1行
  1456.                 {       
  1457.                  #ifdef DATAHI
  1458.                          R1=0;
  1459.                         R2=0;                                                               
  1460.                          for(j=0;j<8;j++)                         //发送1个数据
  1461.                         {       
  1462.                        
  1463.                                 GD1[i]<<=1;        //数据左移1                                 
  1464.                                 G1=CY;                //发送最高位,
  1465.                                 GD2[i]<<=1;       
  1466.                                 G2=CY;                //由于数据是低电平有效,所以进行取反
  1467.                                 CK=0;                                        //时钟下降
  1468.                                 NOP4;                               
  1469.                                 CK=1;          //时钟上升
  1470.                         }
  1471.                 #else       
  1472.                         R1=1;
  1473.                         R2=1;
  1474.                         for(j=0;j<8;j++)          
  1475.                         {
  1476.                                 GD1[i]<<=1;        //数据左移1                                 
  1477.                                 G1=!CY;                //发送最高位,
  1478.                                 GD2[i]<<=1;       
  1479.                                 G2=!CY;                //由于数据是低电平有效,所以进行取反
  1480.                                 CK=0;                //时钟下降
  1481.                                 NOP4;                               
  1482.                                 CK=1;        //时钟上升
  1483.                         }
  1484.                         #endif
  1485.                        
  1486.                 }
  1487.                 ABCD=row;                        //行选
  1488.                  LS=0;
  1489.                 NOP4;               
  1490.                 LS=1;                                //锁存上升,显示输出
  1491.                 EN_ON();                                //显示开
  1492.                 TH0=Light_G;
  1493.                 TL0=Light_L;
  1494.                 TR0=1;
  1495. }


  1496. void SendData_R()
  1497. {
  1498.                 uchar i,j;       
  1499.                
  1500.                 for(i=0;i<8;i++)                                         //扫描1行
  1501.                 {                                                               
  1502.                  #ifdef DATAHI
  1503.                          G1=0;
  1504.                         G2=0;                                                               
  1505.                          for(j=0;j<8;j++)                         //发送1个数据
  1506.                         {       
  1507.                        
  1508.                                 RD1[i]<<=1;        //数据左移1                                 
  1509.                                 R1=CY;                //发送最高位,
  1510.                                 RD2[i]<<=1;       
  1511.                                 R2=CY;                //由于数据是低电平有效,所以进行取反
  1512.                                 CK=0;                //时钟下降
  1513.                                 NOP4;                               
  1514.                                 CK=1;          //时钟上升
  1515.                         }
  1516.                 #else       
  1517.                         G1=1;
  1518.                         G2=1;
  1519.                         for(j=0;j<8;j++)          
  1520.                         {
  1521.                                 RD1[i]<<=1;        //数据左移1                                 
  1522.                                 R1=!CY;                //发送最高位,
  1523.                                 RD2[i]<<=1;       
  1524.                                 R2=!CY;                //由于数据是低电平有效,所以进行取反
  1525.                                 CK=0;                //时钟下降
  1526.                                 NOP4;                               
  1527.                                 CK=1;        //时钟上升
  1528.                         }
  1529.                         #endif
  1530.                 }
  1531.                 ABCD=row;                        //行选
  1532.                  LS=0;
  1533.                 NOP4;               
  1534.                 LS=1;                                //锁存上升,显示输出
  1535.                 EN_ON();                                //显示开
  1536. //                Delay(80);
  1537.                 TH0=Light_R;
  1538.                 TL0=Light_L;
  1539.                 TR0=1;
  1540. //                EN_OFF();                            //显示关
  1541. //                Delay(1);       
  1542. }



  1543. void Err3231()
  1544. {
  1545.        
  1546.         for(row=0;row<16;row++)
  1547.         {
  1548.                 RD1[0]=ZMlogo[10][row];
  1549.                 RD1[1]=ZMlogo[2][row];
  1550.                 RD1[2]=Num12[3][row];
  1551.                 RD1[3]=Num12[2][row];
  1552.                 RD1[4]=Num12[3][row];
  1553.                 RD1[5]=Num12[1][row];
  1554. //                RD1[6]=Num12[1][row];
  1555.                
  1556.                 RD2[0]=HZ[44][row*2];
  1557.                 RD2[1]=HZ[44][row*2+1];
  1558.                 RD2[2]=HZ[45][row*2];
  1559.                 RD2[3]=HZ[45][row*2+1];
  1560.                 RD2[4]=HZ[46][row*2];
  1561.                 RD2[5]=HZ[46][row*2+1];
  1562.                 RD2[6]=HZ[47][row*2];
  1563.                 RD2[7]=HZ[47][row*2+1];
  1564.                
  1565.                 SendData_G();
  1566.                 SendData_R();
  1567.         }
  1568.                
  1569. }

  1570. void xianshi()
  1571. {
  1572. //        uchar i,j;         

  1573.         for(row=0;row<16;row++)                           //扫描16行
  1574.         {   
  1575.                 LoadData_G();
  1576.                 SendData_G();

  1577.                 LoadData_R();
  1578.                 SendData_R();               
  1579.         }
  1580. }


  1581. void TIM0() interrupt 1
  1582. {
  1583. //        z++;
  1584.         EN_OFF();
  1585.         TR0=0;
  1586.         TL0=60;
  1587. }

  1588. void SetTime(uchar address, char min, char max)
  1589. {
  1590.         char item;
  1591.        
  1592.         item=read_random(address);
  1593.         item=item/16*10+item%16;
  1594.         if (K_ADD)
  1595.                 item++;
  1596.         else
  1597.                 item--;
  1598.         if (item>max)
  1599.                 item=min;
  1600.         if (item<min)
  1601.                 item=max;
  1602.         ModifyTime(address,item/10*16+item%10);// 写入DS3231
  1603.         GetAllTime();
  1604. }


  1605. void IR_ICON()
  1606. {
  1607.         if(IR_date[6])
  1608.         {
  1609.                 if(Set_S<12)
  1610.                 {
  1611.                         if(IR_date[0]==IR_Key[0])
  1612.                         {
  1613.                                 if(IR_date[6]==IR_Key[1])
  1614.                                 {
  1615.                                         K_SET=1;  
  1616.                                         IR_date[4]=0;
  1617.                                 }
  1618.                                 if(IR_date[6]==IR_Key[2])
  1619.                                 {
  1620.                                         K_ADD=1;  
  1621.                                         IR_date[4]=3;
  1622.                                 }
  1623.                                 if(IR_date[6]==IR_Key[3])
  1624.                                 {
  1625.                                         K_DEC=1;  
  1626.                                         IR_date[4]=3;
  1627.                                 }
  1628.                                 if(IR_date[6]==IR_Key[4])
  1629.                                 {
  1630.                                         K_ESC=1;  
  1631.                                         IR_date[4]=0;
  1632.                                 }
  1633.                         }
  1634.                        
  1635.                        
  1636. //                        switch(IR_date[6])
  1637. //                        {
  1638. //                                case IR_Key[1]:        K_SET=1;  IR_date[4]=0;        break;
  1639. //                                case IR_Key[2]:        K_ADD=1;  IR_date[4]=3;        break;
  1640. //                                case IR_Key[3]:        K_DEC=1;  IR_date[4]=3;        break;
  1641. //                                case IR_Key[4]:        K_ESC=1;  IR_date[4]=0;        break;
  1642. //                               
  1643. //                                default : break;
  1644. //                        }
  1645.                 }
  1646.                 else
  1647.                 {
  1648.                         if(!xuexi_OK)
  1649.                         {
  1650.                                 switch(Set_S)
  1651.                                 {
  1652.                                         case 12:       
  1653.                                                 IR_Key[0]=IR_date[0];       
  1654.                                                 IR_Key[1]=IR_date[6];
  1655.                                         //        IR_date[4]=0;
  1656.                                                 Write_EEP();       
  1657.                                                 xuexi_OK=1;       
  1658.                                                 break;
  1659.                                         case 13:       
  1660.                                                 IR_Key[2]=IR_date[6];       
  1661.                                         //        IR_date[4]=0;
  1662.                                                 Write_EEP();       
  1663.                                                 xuexi_OK=1;       
  1664.                                                 break;
  1665.                                         case 14:       
  1666.                                                 IR_Key[3]=IR_date[6];
  1667.                                         //        IR_date[4]=0;
  1668.                                                 Write_EEP();       
  1669.                                                 xuexi_OK=1;       
  1670.                                                 break;
  1671.                                         case 15:       
  1672.                                                 IR_Key[4]=IR_date[6];
  1673.                                         //        IR_date[4]=0;
  1674.                                                 Write_EEP();       
  1675.                                                 xuexi_OK=1;       
  1676.                                                 break;
  1677.                                                
  1678.                                         default:        break;
  1679.                                        
  1680.                                 }
  1681.                         }
  1682.                 }
  1683.                 IR_date[6]=0;
  1684.         }
  1685. }

  1686. void KeyScan()           //*按键扫描 */
  1687. {
  1688.         static bit KeySet_S,KeyAdd_S,KeyDec_S,KeyEsc_S;           //相应按键按下状态指示
  1689.         static uint idata Keyout;       

  1690.         if(KeySet)
  1691.                  KeySet_S=1;  //
  1692.         if(!KeySet&&KeySet_S)  
  1693.         {
  1694.                 xianshi();
  1695.                 if(!KeySet)
  1696.                 {
  1697.                         K_SET=1;
  1698.                         KeySet_S=0;
  1699.                         Keyout=0;
  1700.                 }
  1701.         }  
  1702.                
  1703.         if(KeyAdd)                    //+按键,
  1704.                 KeyAdd_S=1;
  1705.         if(!KeyAdd&&KeyAdd_S)
  1706.         {
  1707.                 xianshi();
  1708.                 if(!KeyAdd)
  1709.                 {
  1710.                         K_ADD=1;                 //加键按下后,+=1
  1711.                         KeyAdd_S=0;
  1712.                         Keyout=0;
  1713.                 }
  1714.         }
  1715.        
  1716.         if(KeyEsc)                    //Esc按键,
  1717.                 KeyEsc_S=1;
  1718.         if(!KeyEsc&&KeyEsc_S)
  1719.         {
  1720.                 xianshi();
  1721.                 if(!KeyEsc)
  1722.                 {
  1723.                         K_ESC=1;                 //加键按下后,+=1
  1724.                         KeyEsc_S=0;
  1725.                         Keyout=0;
  1726.                 }
  1727.         }
  1728.        
  1729.         if(KeyDec)   
  1730.                 KeyDec_S=1;  //-按键,
  1731.         if(!KeyDec&&KeyDec_S)  
  1732.         {
  1733.                 xianshi();
  1734.                 if(!KeyDec)
  1735.                 {
  1736.                         K_DEC=1;                  //减键按下后,-键=1
  1737.                         KeyDec_S=0;
  1738.                         Keyout=0;

  1739.                 }
  1740.         }
  1741.        
  1742.         IR_ICON();       
  1743.        
  1744.         if(K_SET)
  1745.         {
  1746.                 Set_S++;                        //S键按下后,
  1747.                 if(Set_S>Set_Max)
  1748.                         Set_S=0;
  1749.                 K_SET=0;                       
  1750.                 xuexi_OK=0;
  1751.         }
  1752.                
  1753.         if(Set_S)         
  1754.         {
  1755.                 Keyout++;
  1756.                 if(Keyout>10000)                  //1分后退出调整状态
  1757.                         Keyout=0,Set_S=0;
  1758.         }
  1759.        
  1760.         if(K_ADD&&K_DEC)
  1761.         {
  1762.                 NOP;
  1763.         }
  1764.         if(K_ADD | K_DEC)
  1765.         {
  1766.                 switch(Set_S)
  1767.                 {
  1768.                         case 0:
  1769.                                 if(K_ADD)
  1770.                                 {
  1771.                                         XSMOD++;
  1772.                                         if(XSMOD>XSMOD_Max)
  1773.                                                 XSMOD=0;
  1774.                                         EEprom_WritePara(0x0000,XSMOD);        //显示模式写入EEROM的0x0000单元
  1775.                                 }
  1776.                                 else
  1777.                                 {
  1778.                                         Zhi_12=!Zhi_12;
  1779.                                                 EEprom_WritePara(0x0001,Zhi_12);//上下午标志写入EEROM 0x0001单元
  1780.                                         GetAllTime();
  1781.                                 }
  1782.                                 break;
  1783.                         case 1:        SetTime(DS3231_YEAR, 15, 79);        break;        //年
  1784.                         case 2:        SetTime(DS3231_MONTH, 1, 12);        break;        //月
  1785.                         case 3:        SetTime(DS3231_DAY, 1, 31);        break;          //日
  1786.                         case 4:        SetTime(DS3231_HOUR, 0, 23);        break;        //时       
  1787.                         case 5:        SetTime(DS3231_MINUTE, 0, 59);        break;        //分
  1788.                         case 6:        SetTime(DS3231_SECOND, 0, 59);        break;        //秒
  1789.                         case 7:       
  1790.                                 if(K_ADD) Liangdu++; else Liangdu--;
  1791.                                 if(Liangdu>Liangdu_Max) Liangdu=0;
  1792.                                 if(Liangdu<0) Liangdu=Liangdu_Max;
  1793.                                 EEprom_WritePara(0x0002,Liangdu); //亮度写入 EEROM的0x02
  1794.                                 break;
  1795.                         case 8:
  1796.                                 if(K_ADD) Min_Liangdu++; else Min_Liangdu--;
  1797.                                 if(Min_Liangdu>Min_Liangdu_Max) Min_Liangdu=0;
  1798.                                 if(Min_Liangdu<0) Min_Liangdu=Min_Liangdu_Max;
  1799.                                 EEprom_WritePara(0x0003,Min_Liangdu); //最小亮度写入0x03
  1800.                                 break;
  1801.                         case 9:
  1802.                                 if(K_ADD) Liangdu_G++; else Liangdu_G--;
  1803.                                 if(Liangdu_G>Liangdu_G_Max) Liangdu_G=0;
  1804.                                 if(Liangdu_G<0) Liangdu_G=Liangdu_G_Max;
  1805.                                 EEprom_WritePara(0x0004,Liangdu_G); //绿补写入0x04
  1806.                                 break;
  1807.                         case 10:
  1808.                                 if(K_ADD) NTC_buchang++; else NTC_buchang--;
  1809.                                 if(NTC_buchang>19) NTC_buchang=19;
  1810.                                 if(NTC_buchang<1) NTC_buchang=1;
  1811.                                 EEprom_WritePara(0x0005,NTC_buchang);         //NTC补偿写入0x05
  1812.                                 break;
  1813.                         case 11:
  1814.                                 IR_POW=!IR_POW;
  1815.                                 EEprom_WritePara(0x0006,IR_POW); //        红外开关写入0x05
  1816.                                
  1817.                         default :        break;
  1818.                         }
  1819.                 K_ADD=0;
  1820.                 K_DEC=0;               
  1821.         }
  1822.         if(K_ESC)
  1823.         {
  1824.                 Set_S=0;
  1825.                 K_ESC=0;
  1826.         }
  1827.        
  1828. }       

  1829. void main()
  1830. {
  1831.         uchar idata count;
  1832.         uchar idata a,b;
  1833.        
  1834.         P0M1=0x00;           //以下为接LED点阵屏设为强推,适应有下拉或上拉电阻输入的屏,改引脚连接要先设引脚输出模式
  1835.         P0M0=0xff;          
  1836.         P2M1=0x00;
  1837.         P2M0=0xe0;

  1838.        
  1839.         P3M0=0x10;                          //0001 0000 P34推挽做红外接收电源
  1840.         P1M1=0x18;                          //P13,P14高阻模式        ,0001 1000
  1841.         P1ASF=0x18;                          //P13,P14做ADC输入
  1842.         ADC_CONTR=0x80;        //开启ADC电源       
  1843.         UartInit();                         //串口初始化
  1844.         TMOD=0x11;                         //16bit
  1845.         AUXR |= 0x80;                //        T0/ 1T
  1846.         EA=1;         
  1847.         ES=1;          PS=1;
  1848.         ET0=1;
  1849.         EADC=1;        //开启ADC中断
  1850.         IT1=1;        //int1下降沿触发
  1851.         EX1=1;
  1852.         ET1=1;
  1853.         TR1=1;
  1854.        
  1855.         if(DS18B20_TEST())
  1856.         {
  1857.                 Delay(10);
  1858.                 if(DS18B20_TEST())
  1859.                         NTC=1;
  1860.                   else
  1861.                         NTC=0;
  1862.         }
  1863.           else
  1864.                 NTC=0;

  1865.         ADCL=1;
  1866.         ADC_CONTR=0xcb;                 //进行亮度AD转换
  1867.         if(NTC)
  1868.         {
  1869.                 while(ADCL);
  1870.                 ADCT=1;
  1871.                 ADC_CONTR=0xcc;                 //进行温度               
  1872.         }
  1873.         else
  1874.                 Read18B20();       
  1875.         GPS_POW=0;
  1876.         WDT_CONTR=0x34;                  //启动看门狗,16分频,约1s多       
  1877.     DS3231_Initial();                //根据DS3231状态是否进行初始化
  1878.        
  1879.         ShowLogo();

  1880.         ADCL=1;
  1881.         ADC_CONTR=0xcb;                 //进行亮度AD转换
  1882.         if(NTC)
  1883.         {
  1884.                 while(ADCL);
  1885.                 ADCT=1;
  1886.                 ADC_CONTR=0xcc;                 //进行温度               
  1887.         }
  1888.         else
  1889.                 Read18B20();
  1890.         while(read_random(DS3231_A2D) !=1)   //如DS3231闹铃2的日期位标志不是原来的1,初始化。
  1891.         {
  1892.                 Err3231();
  1893.                 WDT_CONTR=0x34;       
  1894.         }
  1895.         POW_OK=1;
  1896.         XSMOD=EEprom_ReadPara(0x0000);//从EEROM中读显示模式
  1897.         Zhi_12=EEprom_ReadPara(0x0001);//读AM ,PM标志
  1898.         Liangdu=EEprom_ReadPara(0x0002);//读亮度数据
  1899.         Min_Liangdu=EEprom_ReadPara(0x0003);//读最低亮度数据
  1900.         Liangdu_G=EEprom_ReadPara(0x0004);//读绿补数据
  1901.         NTC_buchang=EEprom_ReadPara(0x0005);//读NTC温度补偿数据。
  1902.         IR_POW=EEprom_ReadPara(0x0006);//读红外开关数据
  1903.         if(XSMOD>XSMOD_Max)                XSMOD=0;
  1904.        
  1905.         Read_EEP();                         //从单片机EEROM中读红外键位数据
  1906.         GetAllTime();                //读取全部时间,并进行农历运算
  1907.                
  1908.         while(1)
  1909.         {                          
  1910.                  count++;
  1911.                  if(count>25)                                //这个常数值根据晶振频率调整,使秒点闪1HZ
  1912.                  {
  1913.                           count=0;
  1914.                         a++;               
  1915.                         ADCL=1;
  1916.                         ADC_CONTR=0xcb;                         //进行亮度AD转换
  1917.                         WDT_CONTR|=0x10;                   //喂狗
  1918.                         GetTime();                                   //读取时间
  1919.                         if(a>1)
  1920.                         {
  1921.                                  a=0;
  1922.                                 b++;
  1923.                                 SHAN2=!SHAN2;
  1924.                                 if(b>1)
  1925.                                 {
  1926.                                         b=0;
  1927.                                         SHAN=!SHAN;                               
  1928.                                         if(NTC)
  1929.                                         {
  1930.                                                 while(ADCL);
  1931.                                                 ADCT=1;
  1932.                                                 ADC_CONTR=0xcc;                 //进行温度               
  1933.                                         }
  1934.                                         else
  1935.                                                 Read18B20();
  1936.                                 }
  1937.                         }
  1938.                  }
  1939.                  
  1940. //                 if(RX_over&&DW_OK)           //接收完一帧数据并且收到定位成功信息后进行数据处理,定位后的时间肯定是准确的
  1941.                  if(RX_over && (RQ[4]>0x30 & RQ[4]<0x39) )        //如果信号较差能收到时间却没有定位可以用这句降低处理条件
  1942.                          GPSdata();

  1943. //                 if(shi1==0&&shi2==1&&fen1==0&&fen2==0)         //1点同步时间
  1944. //                 {
  1945. //                          ES_ON;                                //打开独立波特率发生器 ]
  1946. //                        GPS_POW=0;                        //打开GPS电源
  1947. //                 }

  1948.                  KeyScan();       
  1949.                  xianshi();
  1950.         }
  1951. }


  1952. void int1() interrupt 2 using 3
  1953. {
  1954.         static uchar a,b;
  1955.         uchar temp;
  1956. ……………………

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

所有资料51hei提供下载:
3264_DS3231_摇控_GPS时钟-12-1.rar (354.96 KB, 下载次数: 318)

评分

参与人数 2黑币 +108 收起 理由
ljhn431 + 8 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:386381 发表于 2019-5-8 23:24 来自手机 | 只看该作者
谢谢楼主分享,很实用的东西。
回复

使用道具 举报

板凳
ID:572090 发表于 2019-7-13 21:49 来自手机 | 只看该作者
单双色点阵都可以用吗
回复

使用道具 举报

地板
ID:50092 发表于 2019-7-20 18:51 | 只看该作者
其他的图纸都没有啊
回复

使用道具 举报

5#
ID:583712 发表于 2019-8-15 19:14 | 只看该作者
我做了一个 GPS怎么也对不了时?
回复

使用道具 举报

6#
ID:191243 发表于 2019-9-19 17:00 | 只看该作者
点阵 是用什么软件生成的
回复

使用道具 举报

7#
ID:69536 发表于 2019-9-21 09:29 | 只看该作者
请问     如何改为单色显示呢?
回复

使用道具 举报

8#
ID:615152 发表于 2019-9-23 15:51 | 只看该作者
shuma520 发表于 2019-9-21 09:29
请问     如何改为单色显示呢?

能把下的资料传我一分吗,我是闲手,没有币。
万分感谢!530339237@qq.com
回复

使用道具 举报

9#
ID:505627 发表于 2019-9-25 14:21 来自手机 | 只看该作者
schsq123 发表于 2019-7-13 21:49
单双色点阵都可以用吗

我也是仿制的,没试用过单色点阵
回复

使用道具 举报

10#
ID:505627 发表于 2019-9-25 14:22 来自手机 | 只看该作者
迵忆那段程序 发表于 2019-7-20 18:51
其他的图纸都没有啊

上面有主板图纸呀
回复

使用道具 举报

11#
ID:505627 发表于 2019-9-25 14:26 来自手机 | 只看该作者
人生如梦你独醒 发表于 2019-8-15 19:14
我做了一个 GPS怎么也对不了时?

Gps要放在窗外或阳台上,对卫星接收的。我的在楼顶自动对时要50秒,而在阳台上对时要等五分钟左右才对好。在烧录芯片的时候波特率要选9600选错了也对不了时的。
回复

使用道具 举报

12#
ID:505627 发表于 2019-9-25 14:32 来自手机 | 只看该作者
user_china 发表于 2019-9-19 17:00
点阵 是用什么软件生成的

用KILL,下载用串囗及软件可参考http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=155886&mobile=2
也可以买下面图片的usb转串口下载

IMG_20190925_143045.jpg (305.8 KB, 下载次数: 96)

IMG_20190925_143045.jpg
回复

使用道具 举报

13#
ID:505627 发表于 2019-9-25 14:34 来自手机 | 只看该作者
shuma520 发表于 2019-9-21 09:29
请问     如何改为单色显示呢?

我也是小白,防制的
回复

使用道具 举报

14#
ID:505627 发表于 2019-9-25 14:51 来自手机 | 只看该作者
重新做了一块,如下图。
做好后发现温度显示为0度调不了。后面改了18B20的那个H文件好了,改过后的程序文件如下附件。

IMG_20190925_114429.jpg (1.41 MB, 下载次数: 98)

IMG_20190925_114429.jpg

IMG_20190925_114531.jpg (902.31 KB, 下载次数: 103)

IMG_20190925_114531.jpg
回复

使用道具 举报

15#
ID:505627 发表于 2019-9-25 23:11 来自手机 | 只看该作者
435543646 发表于 2019-9-25 14:32
用KILL,下载用串囗及软件可参考http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=155886&mobile=2 ...

写错了KILL,应是KEIL软件
回复

使用道具 举报

16#
ID:34298 发表于 2019-9-27 16:05 | 只看该作者
用P10单色LED屏程序怎么改?
回复

使用道具 举报

17#
ID:505627 发表于 2019-10-3 23:17 | 只看该作者
435543646 发表于 2019-9-25 14:51
重新做了一块,如下图。
做好后发现温度显示为0度调不了。后面改了18B20的那个H文件好了,改过后的程序文 ...

      放假了又重新做了一块。这次做了一些改动如下:
          1.为了用上购买点阵屏时赠送的那根排线,将接点阵屏的P0口改到了P2口上,程序上是在H头文件上改了这两端口.
          2.为了在洞洞板上更好的走线焊接,缩小板面积,将光敏电阻、温敏电阻、温度IC和按键引脚更改了位置。
      更改后的电路如下图:                          
   更改后的程序: 3264GPS时钟-12.rar (303.86 KB, 下载次数: 84)



   GPS在这板上做了接口,但做成品时没接上GPS,因为这DS3231时间误差很小了,不用老是调时间,而且接上的GPS还要放在阳台上或放在窗外,再接一条线到外面去有点影响外观,所以没去接GPS了。

评分

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

查看全部评分

回复

使用道具 举报

18#
ID:484435 发表于 2019-10-11 09:58 | 只看该作者
谢谢分享
回复

使用道具 举报

19#
ID:601774 发表于 2019-10-14 18:46 | 只看该作者
谢谢,学习了,正想做一个gps校时时钟,不过信号问题好像不好处理,室内用的,看你这个用成品gps都这么久,自己调天线可能更麻烦了
回复

使用道具 举报

20#
ID:505627 发表于 2019-10-24 22:51 | 只看该作者
ygsasd 发表于 2019-10-14 18:46
谢谢,学习了,正想做一个gps校时时钟,不过信号问题好像不好处理,室内用的,看你这个用成品gps都这么久, ...

      在原先的板上加上做的另一块板,更改下程序就可实现WIFI对时和语音报时了。(WIFI对时就不用接线放到外面去了)如下图:



    开机画面改了些字,如下图:



    另外将秒钟显示小字的和不显示小字的图片也发上来看看:

   下面附件有程序和电路图(下面4个附件选1个就可以了):
针对1楼的电路增加 WIFI对时 - 语音报时后的程序和电路图.rar (441.96 KB, 下载次数: 56) 针对1楼的电路增加 WIFI对时 - 语音报时-秒钟小字后的程序和电路图.rar (489.48 KB, 下载次数: 45) 针对17楼的电路增加 WIFI对时 - 语音报时后的程序和电路图.rar (437.88 KB, 下载次数: 47) 针对17楼的电路增加 WIFI对时 - 语音报时-秒钟小字后的程序和电路图.rar (438.08 KB, 下载次数: 56)

   
       另外再附上WIFI和语音文件:
ESP8266模块网络授时固件和WT588D一线控制语音文件.rar (804.39 KB, 下载次数: 79)






回复

使用道具 举报

21#
ID:505627 发表于 2019-11-9 18:35 来自手机 | 只看该作者
435543646 发表于 2019-10-24 22:51
在原先的板上加上做的另一块板,更改下程序就可实现WIFI对时和语音报时了。(WIFI对时就不用接线放 ...

用电池供电进入省电模式后只显示时间和温度。我做的这个去掉省电模式后电池供电11个小时后就没电了,用上省电模式后能持续46个小时供电,省电模式显示的画面如下图

IMG_20191109_182514.jpg (1.13 MB, 下载次数: 101)

IMG_20191109_182514.jpg
回复

使用道具 举报

22#
ID:638805 发表于 2019-11-9 19:41 | 只看该作者
佩服,学习一下
回复

使用道具 举报

23#
ID:135809 发表于 2019-11-18 09:51 | 只看该作者
好详细的资料,我也做做看,谢谢分享
回复

使用道具 举报

24#
ID:135809 发表于 2019-11-18 16:41 | 只看该作者
很好的时钟学习资料,感谢楼主的分享
回复

使用道具 举报

25#
ID:92733 发表于 2019-11-20 23:09 | 只看该作者
来晚了感谢分享
回复

使用道具 举报

26#
ID:92733 发表于 2019-11-22 23:09 | 只看该作者
路过路过感谢分享
回复

使用道具 举报

27#
ID:135809 发表于 2019-12-13 15:44 | 只看该作者
手头有 STC8A8K64S4A12 ,不知能否直接代用?
回复

使用道具 举报

28#
ID:646541 发表于 2019-12-20 18:51 | 只看该作者
大佬,能不能做一个32*64的仿真图和程序了
回复

使用道具 举报

29#
ID:353831 发表于 2019-12-20 21:34 来自手机 | 只看该作者
435543646 发表于 2019-11-9 18:35
用电池供电进入省电模式后只显示时间和温度。我做的这个去掉省电模式后电池供电11个小时后就没电了,用上 ...

楼主你好:我照你的程序仿制了个,发现在暗光线的时候点阵屏的上部和中部红色区域除正常显字边缘还有几个红色的LED在闪亮,高亮度的时候不明显,不知是屏的问题还是程序的问题,另外温度不显示18b20的温度,触摸NTC的时候温度有变化。
回复

使用道具 举报

30#
ID:468209 发表于 2019-12-21 11:06 来自手机 | 只看该作者
利害 收藏了
回复

使用道具 举报

31#
ID:353831 发表于 2020-2-1 18:54 来自手机 | 只看该作者
楼主你好,时钟农历程序有问题,昨天1月31号农历1月初七正常,今天2月1号农历就是1月初九了
回复

使用道具 举报

32#
ID:386381 发表于 2020-2-4 16:39 来自手机 | 只看该作者
师傅新年好,过年这几天有时间仿制了一个很成功,先谢谢楼主的分享,然后就是怎么把小时和分钟和秒中间的隔点改为红色呢,谢谢您能指点一下。
回复

使用道具 举报

33#
ID:614068 发表于 2020-2-5 18:28 | 只看该作者
带GPS对时的,很不错了,收藏一下
回复

使用道具 举报

34#
ID:689636 发表于 2020-2-5 18:28 来自手机 | 只看该作者
是标准08接口的双色屏就行吗?
回复

使用道具 举报

35#
ID:689636 发表于 2020-2-5 18:53 来自手机 | 只看该作者
gps模块起什么作用,能自动对时吗?
回复

使用道具 举报

36#
ID:634466 发表于 2020-2-10 11:48 | 只看该作者
刚做个电路,要是早看到就好了,原来的没有加接收头和18B20电路
回复

使用道具 举报

37#
ID:353831 发表于 2020-2-26 18:48 | 只看该作者
chenghai7288 发表于 2020-2-5 18:28
是标准08接口的双色屏就行吗?

对的,32x64的双色屏
回复

使用道具 举报

38#
ID:495514 发表于 2020-3-3 23:20 来自手机 | 只看该作者
shuma520 发表于 2019-9-21 09:29
请问     如何改为单色显示呢?

同问…同样的问题,我的是P10红色LED单元板
回复

使用道具 举报

39#
ID:386381 发表于 2020-3-4 13:00 来自手机 | 只看该作者
请问怎么屏蔽掉刚通电一瞬间显示的那八个字呢?因为停电来后再来电时显示八个大字对用手机充电器供电压力很大呀,总是触发过流然后屏就一闪一闪的了,谢谢您指点一下。
回复

使用道具 举报

40#
ID:99987 发表于 2020-3-7 17:42 | 只看该作者
问一下,字显示正常,背景也都是亮的,不是黑底。是什么原因?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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