找回密码
 立即注册

QQ登录

只需一步,快速开始

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

点阵时钟单片机仿真+程序+pcb文件

[复制链接]
跳转到指定楼层
楼主




51单片机仿真+程序+pcb文件下载: 点阵时钟.rar (590.57 KB, 下载次数: 139)

  1. // A B C D 对应P2.0; P2.1 ; P2.2; P2.3
  2. //------------------------------------
  3. #include <reg52.h>

  4. #include <def.h>

  5. #include <word_s.h>

  6. #include <ds1302.h>

  7. #include <ds18b20.h>

  8. void Put_Wdispram(uchar code *WORDS[][8])                   //,uchar first_word
  9. {
  10.         uchar i;
  11.         disword[0] = &NO_WORDS[12];
  12.         for(i=1;i<25;i++)
  13.         {
  14.                 disword[i] = &WORDS[i-1];        //first_word+
  15.         }
  16. }       

  17. void  Put_Hdispram()
  18. {
  19.         uchar i;
  20.         for(i=0;i<10;i++)
  21.         {
  22.                 h_dispram[i] = *(disword[i+start_word]+hang);        //
  23.         }
  24. }

  25. void Move_Left()
  26. {
  27.         uchar i;
  28.         for(i=0;i<9;i++)
  29.         {
  30.         h_dispram[i] = (h_dispram[i] << (move_times)) | (h_dispram[i+1] >> (8-move_times));
  31.         }
  32. }

  33. void Move_Right()
  34. {
  35.         uchar i;
  36.         for(i=9;i>0;i--)
  37.         {
  38.         h_dispram[i] = (h_dispram[i] >> (move_times)) | (h_dispram[i-1] << (8-move_times));
  39.         }
  40. }

  41. void RL_Move(){
  42.         //
  43.         switch(MSG_MV){
  44.                 case MSG_MV_L:        //左移
  45.                         Move_Left();
  46.                         break;
  47.                 case MSG_MV_R:        //右移
  48.                         Move_Right();
  49.                         break;
  50.                 case MSG_NONE:
  51.                         break;
  52.                 default:
  53.                         break;
  54.                 }
  55. }

  56. void Move_Up(){
  57.         //                                  
  58.         uchar i,j,m,n;
  59.         for(m=0;m<16;m++)                   //m  屏数
  60.         {
  61.                 for(n=0;n<8;n++)
  62.                 {
  63.                         for(j=0;j<16-m;j++)                //上移
  64.                         {
  65.                                 for(i=0;i<10;i++)           //i 行 字节
  66.                                 {
  67.                                         h_dispram[i] = *(disword[i]+m+j);                // m+j
  68.                                 }
  69.                                 Show_Line();
  70.                         //        delay();        //看需要
  71.                         }
  72.                         for(j=16-m;j<16;j++)
  73.                         {
  74.                                 for(i=0;i<10;i++)
  75.                                 {
  76.                                         h_dispram[i] = *(disword[i+8]+m+j-16);                //m+j-16
  77.                                 }
  78.                                 Show_Line();
  79.                         //        delay();        //看需要
  80.                         }
  81.                 }
  82.         }
  83. }

  84. void Move_Down()
  85. {
  86.   uchar i,j,m,n;
  87.         for(m=0;m<16;m++)
  88.         {
  89.                 for(n=0;n<8;n++)
  90.                 {
  91.                         for(j=0;j<m;j++)
  92.                         {
  93.                                 for(i=0;i<10;i++)
  94.                                 {
  95.                                         h_dispram[i] = *(disword[i+8]+15-m+j);                //
  96.                                 }
  97.                                 Show_Line();
  98.                             //delay();        //看需要
  99.                         }
  100.                         for(j=m;j<16;j++)
  101.                         {
  102.                                 for(i=0;i<10;i++)
  103.                                 {
  104.                                         h_dispram[i] = *(disword[i]-m+j);                //0x00
  105.                                 }
  106.                                 Show_Line();
  107.                             //delay();        //看需要
  108.                         }
  109.                 }
  110.         }
  111. }

  112. void UD_Move(){
  113.         //
  114.         switch(MSG_MV){
  115.                 case MSG_MV_U:        //上移
  116.                         Move_Up();
  117.                         break;
  118.                 case MSG_MV_D:        //下移
  119.                         Move_Down();
  120.                         break;
  121.                 case MSG_NONE:
  122.                         break;
  123.                 default:
  124.                         break;
  125.                 }
  126. }

  127. void Show_Line(){
  128.         uchar m;
  129.         OE=1;
  130.         for(m =0;m<8;m++)  
  131.         {       
  132.                 SendData = h_dispram[m+1];
  133.                 SendByte();
  134.         }
  135.         delay();        //
  136.         RowsCan();                //行扫描
  137.         STB = 0;
  138.         STB = 1;                 //上升沿数据锁存
  139.          
  140.         OE = 0;
  141.        
  142. }

  143. void Show_sWord(){
  144.         int m,i;//
  145.         hang = 0;
  146.         for(m=0;m<14;m++){
  147.                 for(i=0;i<16;i++){
  148.                         Put_Hdispram();        //把第i行放入行缓冲
  149.                         Show_Line();
  150.                         //delay();        //看需要
  151.                 }
  152.                
  153.         }
  154. }
  155. void Show_Move_Word(uchar code *WORDS[][8]){
  156.         int m,i;
  157.         while(1){
  158.         for(m=0;m<6;m++){        //若要上下移动 m=16
  159.                 //hang = 0;
  160.                 for(i=0;i<16;i++){
  161.                         Put_Hdispram();        //把第i行放入行缓冲
  162.                         RL_Move();        //是否要左右移动
  163.                         Show_Line();
  164.                         //delay();        //看需要
  165.                 }
  166.         //UD_Move();        //是否要上下移动
  167.         }
  168.         //========================================
  169.         //测试左移右移        切换时有跳变!!
  170. //        if(MSG_MV){
  171.                 move_times++;
  172.                 if((move_times == 9) && (MSG_MV == MSG_MV_L)){
  173.                         move_times = 1;
  174.                         Put_Wdispram(WORDS);
  175.                         start_word++;
  176.                         switch(STATE){
  177.                                 case STA_gTEMP:
  178.                                         Read_Temperature();
  179.                                         Disp_Temperature();                                   //
  180.                                         Put_gTEMP();          //
  181.                                         if(start_word > (sizeof(TMP_WORDS)/16 - 8))
  182.                                                 MSG_MV = MSG_MV_R;
  183.                                         break;
  184.                                 case STA_gWORD:
  185.                                         if(start_word > (sizeof(MY_WORDS)/16 - 8))
  186.                                                 MSG_MV = MSG_MV_R;
  187.                                 default:
  188.                                         break;
  189.                         }
  190.                 if(start_word > (sizeof(TMP_WORDS)/16 - 4))
  191.                                 MSG_MV = MSG_MV_R;
  192.                 }
  193.                 else if((move_times == 9) && (MSG_MV == MSG_MV_R)){
  194.                         move_times = 1;
  195.                         Put_Wdispram(WORDS);  //
  196.                         start_word-- ;
  197.                         switch(STATE){
  198.                                 case STA_gTEMP:
  199.                                         Disp_Temperature();                                   //
  200.                                         Put_gTEMP();
  201.                                                 break;
  202.                                 default:
  203.                                         break;
  204.                         }
  205.                         if(start_word < 1){
  206.                                 MSG_MV = MSG_MV_L;
  207.                                 return;
  208.                         }
  209.                 }
  210. //        }
  211.                 }
  212. }
  213. void Show_All_Word(){
  214.         int m,i;
  215.         //MSG_MV = MSG_MV_L;
  216.         for(start_word = 0;start_word < 8;start_word++){
  217.                 for(move_times = 0; move_times < 8;move_times++){
  218.                         for(m=0;m<4;m++){        //若要上下移动 m=16
  219.                                 for(i=0;i<16;i++){
  220.                                         Put_Hdispram();        //把第i行放入行缓冲
  221.                                         RL_Move();        //是否要左右移动
  222.                                         Show_Line();
  223.                                 }
  224.                         }
  225.                 }
  226.         }
  227. }

  228.                          
  229.        
  230. //------------------------------------
  231. //----------字发送子程序-----------
  232.         void SendByte(void)
  233.                 {
  234.                    uchar m;
  235.                    for(m=0;m<8;m++)
  236.                    {
  237.                                    CLK = 0;
  238.                                 Red = (SendData & 0x80);                  //红屏显示
  239.                     //        Greed =  (SendData & 0x80);                  //绿屏显示
  240.                                   SendData =SendData<<1;                       
  241.                                 CLK = 1;          //移位时钟上升沿
  242.                    }
  243.                 }
  244. //-----------------------------------
  245. //----------行扫描子程序-------------
  246.            void RowsCan(void)
  247.            {
  248.                         P3 = P3 & 0xf0;
  249.                         P3 = (P3 | hang)<<1;
  250.                     hang++;
  251.                         if (hang>=16)
  252.                         {
  253.                                 hang =0x00;
  254.                         }
  255.                 }

  256.                 void initial(void)
  257.                    {
  258.                           OE = 1;
  259.                         Red = 1;
  260.                         Greed = 1;
  261.                         SendData = 0x00;
  262.                         hang = 0x00;
  263.                                                        
  264.                  }



  265. void Put_Adispram(uchar a){
  266.         uchar i;
  267.         //第一屏"今天是:"
  268.         disword[a+1] = &NO_WORDS[12][0];        //空格
  269.         for(i=0;i<6;i++)
  270.                 disword[a+i+2] = &TIME_WORDS[i][0];
  271.         disword[a+8] = &NO_WORDS[11][0];        //":"
  272.         //第二屏
  273.         //disword[4] = &TIME_WORDS[];
  274.                
  275. }
  276.        
  277. //将年份放入到显示缓存
  278. //需要参数:缓冲区首地址下标
  279. void Put_Ydispram(uchar i){
  280.         disword[i+1] = &NO_WORDS[12][0];
  281.         if(Time.Year < 30 && !HIDE){
  282.                 disword[i+2] = &NO_WORDS[2][0];
  283.                 disword[i+3] = &NO_WORDS[0][0];
  284.                 }
  285.         else if(!HIDE){
  286.                 disword[i+2] = &NO_WORDS[1][0];
  287.                 disword[i+3] = &NO_WORDS[9][0];
  288.                 }
  289.         disword[i+4] = &NO_WORDS[Time.Year>>4][0];
  290.         disword[i+5] = &NO_WORDS[Time.Year&0x0f][0];
  291.         disword[i+6] = &TIME_WORDS[6][0];
  292.         disword[i+7] = &TIME_WORDS[7][0];        //年
  293.         disword[i+8] = &NO_WORDS[12][0];
  294. }       
  295. //将星期放入到显示缓存
  296. //参数:缓冲区首地址下标
  297. void Put_Kdispram(uchar i){
  298.         disword[i+1] = &NO_WORDS[12][0];                
  299.         disword[i+2] = &TIME_WORDS[12][0];               
  300.         disword[i+3] = &TIME_WORDS[13][0];        //星期               
  301.         disword[i+4] = &TIME_WORDS[14][0];                
  302.         disword[i+5] = &TIME_WORDS[15][0];
  303.         if(STATE== STA_CHG &&HIDE){
  304.                 disword[i+6] = &NO_WORDS[12][0];                //
  305.                 disword[i+7] = &NO_WORDS[12][0];                  //
  306.                 }
  307.         else{
  308.                 disword[i+6] = &WEEK_WORDS[Time.Week*2-2][0];                //
  309.                 disword[i+7] = &WEEK_WORDS[Time.Week*2-1][0];                  //
  310.                 }
  311.         disword[i+8] = &NO_WORDS[12][0];                
  312. }

  313. //将日期放入到显示缓存
  314. //参数:缓冲区首地址下标
  315. void Put_Ddispram(uchar i){
  316.         disword[i+1] = &NO_WORDS[Time.Month>>4][0];                 //小时高位
  317.         disword[i+2] = &NO_WORDS[ Time.Month&0x0f][0];                //小时地位
  318.         disword[i+3] = &TIME_WORDS[8][0];                //-
  319.         disword[i+4] = &TIME_WORDS[9][0];                 //分钟高位
  320.         disword[i+5] = &NO_WORDS[ Time.Day>>4][0];                //分钟地位
  321.         disword[i+6] = &NO_WORDS[Time.Day&0x0f][0];                //-
  322.         disword[i+7] = &TIME_WORDS[10][0];                  //秒高位
  323.         disword[i+8] = &TIME_WORDS[11][0];                 //秒地位
  324. }

  325. //将时间放入到显示缓存
  326. //参数:缓冲区首地址下标
  327. void Put_Tdispram(uchar i){
  328.         disword[i+1] = &NO_WORDS[Time.Hour>>4][0];                 //小时高位
  329.         disword[i+2] = &NO_WORDS[ Time.Hour&0x0f][0];                //小时低位
  330.         disword[i+3] = &NO_WORDS[ 11 ];                //-
  331.         disword[i+4] = &NO_WORDS[Time.Minute>>4][0];                 //分钟高位
  332.         disword[i+5] = &NO_WORDS[ Time.Minute&0x0f][0];                //分钟低位
  333.         disword[i+6] = &NO_WORDS[ 11 ];                //-
  334.         disword[i+7] = &NO_WORDS[Time.Second>>4][0];                 //秒高位
  335.         disword[i+8] = &NO_WORDS[ Time.Second&0x0f][0];                //秒低位
  336. }
  337. //===================================
  338. //*****关于温度检测部分*****
  339. void Put_gTEMP(){
  340. //        uchar i;
  341. //        Put_Wdispram(TMP_WORDS,0);
  342.         disword[6] = &NO_WORDS[temp_ram[3]];                 //百位
  343.         disword[7] = &NO_WORDS[temp_ram[2]];                //十位
  344.         disword[8] = &NO_WORDS[temp_ram[1]];                //个位
  345.         disword[10]=&NO_WORDS[temp_ram[0]];                //小数
  346.         disword[12]        = &NO_WORDS[12];                //空格
  347.         disword[13]        = &NO_WORDS[12];                //空格
  348.         //
  349. }

  350. void Put_sTEMP(uchar i){
  351.         disword[i+0] = &NO_WORDS[12];                //空格
  352.         disword[i+1] = &NO_WORDS[12];//&NO_WORDS[temp_ram[3]][0];                 //百位
  353.         disword[i+2] = &NO_WORDS[temp_ram[2]];                //十位
  354.         disword[i+3] = &NO_WORDS[temp_ram[1]];                //个位
  355.         disword[i+4] = &TMP_WORDS[8][0];        //小数点
  356.         disword[i+5] = &NO_WORDS[temp_ram[0]];                //小数
  357.         disword[i+6] = &NO_WORDS[12];                //空格
  358.         disword[i+7] = &TMP_WORDS[10];
  359.         disword[i+8] = &NO_WORDS[12];                //空格
  360. }
  361. void Put_Cpyrt(uchar i){
  362.         uchar m;
  363.         for(m=0;m<8;m++)
  364.                 disword[i+1+m] = &CPYRT_WORDS[m];
  365. }
  366. void Show_Cpyrt()
  367. {
  368.         uchar i;
  369.         for(i=1;i<9;i++)
  370.                 disword[i] = &NO_WORDS[12];
  371.         Put_Cpyrt(8);
  372.         Move_Up();
  373.         Put_Cpyrt(0);
  374.         Put_Tdispram(8);
  375.         Move_Down();
  376. }
  377.        
  378. //========================
  379. //参数i:放入第几屏缓存
  380. //参数j:诗歌第几页
  381. //========================
  382. void Put_Song(uchar i,uchar j){
  383.         uchar m;
  384.         for(m=0;m<8;m++)
  385.                 disword[i+1+m] = &SONG_WORDS[j+m];
  386. }
  387. //显示诗歌
  388. void Show_Song(){
  389.         uchar i;
  390.         Put_Song(8,0);
  391.         Move_Up();
  392.         for(i=0;i<3;i++){
  393.                 Put_Song(0,i*8);
  394.                 Put_Song(8, (i+1)*8);
  395.                 Move_Up();
  396.                 }
  397.         Put_Song(0, 3*8);
  398.         Put_Tdispram(8);
  399.         Move_Up();
  400. }

  401.        
  402. //======================
  403. //*滚动显示所有信息*
  404. //======================
  405. void Show_All_Info(){
  406.         Put_Adispram(8);
  407.         Move_Down();        //切换效果
  408.        
  409.         Put_Adispram(0);
  410.         Put_Ydispram(8);        //XXXX年
  411.         Show_All_Word();
  412.        
  413.         Put_Ydispram(0);        //XXXX年
  414.         Put_Ddispram(8);
  415.         Show_All_Word();

  416.         Put_Ddispram(0);
  417.         Put_Kdispram(8);
  418.         Show_All_Word();

  419.        
  420.         Read_Temperature();
  421.         Disp_Temperature();
  422.         Put_Kdispram(0);
  423.         Put_Tdispram(8);
  424.         Show_All_Word();

  425.         Read_Temperature();
  426.         Disp_Temperature();
  427.         Put_Tdispram(0);
  428.         Put_sTEMP(8);
  429.         Show_All_Word();

  430.         Read_TIME();
  431.         Put_sTEMP(0);
  432.         Put_Tdispram(8);
  433.         Move_Up();
  434.        
  435. }

  436.        




  437. //=================
  438. //****校时函数****
  439. //=================
  440. void Change_Time(){
  441.         //
  442.         MSG_MV = MSG_MV_L;
  443.         move_times = 0;
  444.         start_word=0;
  445.         TMP_TIME = Time.Hour;
  446.         TR1 = 1;                //开启定时器1闪烁
  447.         do{
  448.                 switch(CHANGE){
  449.                                 case CHG_HOUR:
  450.                                 case CHG_MIN:
  451.                                 case CHG_SEC:
  452.                                         Put_Tdispram(0);
  453.                                         break;
  454.                                 case CHG_MON:
  455.                                 case CHG_DAY:
  456.                                         Put_Ddispram(0);
  457.                                         break;
  458.                                 case CHG_WEEK:
  459.                                         Put_Kdispram(0);
  460.                                         break;
  461.                                 case CHG_YEAR:
  462.                                         Put_Ydispram(0);
  463.                                         break;
  464.                                 default:
  465.                                         break;
  466.                                 }       
  467.                 Show_sWord();
  468.                 //if(!key_done)
  469.                 //        ReadKey1();
  470.                 }while(ReadKey1() != KEY3_S && exit < 10);                //MSG_KEY
  471.         Change_obj();        //保证退出校时无隐身
  472.         HIDE = 0;
  473.         key_done = 0;
  474.         //key_done = 1;        //按键事件处理完成
  475.         TR1 = 0;                //关闭定时器1闪烁                                       
  476.        
  477. }
  478. //==================
  479. //****对象切换****
  480. //==================
  481. void Change_obj(){
  482.         switch(CHANGE){
  483.                                 case CHG_HOUR:
  484.                                         if(Time.Hour == 0xcc)
  485.                                                 Time.Hour = TMP_TIME;
  486.                                         TMP_TIME = Time.Minute;
  487.                                         break;
  488.                                 case CHG_MIN:
  489.                                         if(Time.Minute == 0xcc)
  490.                                                 Time.Minute = TMP_TIME;
  491.                                         TMP_TIME = Time.Second;
  492.                                         break;
  493.                                 case CHG_SEC:
  494.                                         if(Time.Second == 0xcc)
  495.                                                 Time.Second = TMP_TIME;
  496.                                         TMP_TIME = Time.Month;
  497.                                         break;
  498.                                 case CHG_MON:
  499.                                         if(Time.Month == 0xcc)
  500.                                                 Time.Month = TMP_TIME;
  501.                                         TMP_TIME = Time.Day;
  502.                                         break;
  503.                                 case CHG_DAY:
  504.                                         if(Time.Day == 0xcc)
  505.                                                 Time.Day = TMP_TIME;
  506.                                         TMP_TIME = Time.Week;
  507.                                         break;
  508.                                 case CHG_WEEK:
  509.                                         if(Time.Week == 0xcc)
  510.                                                 Time.Week = TMP_TIME;
  511.                                         TMP_TIME = Time.Year;
  512.                                         break;
  513.                                 case CHG_YEAR:
  514.                                         if(Time.Year == 0xcc)
  515.                                                 Time.Year = TMP_TIME;
  516.                                         TMP_TIME = Time.Hour;
  517.                                         break;
  518.                                 default:
  519.                                         break;
  520.                                 }
  521. }
  522. //==================
  523. //****加加函数****
  524. //功能: 0x19 ++  =0x20
  525. //==================
  526. uchar Add_num(char *num){
  527.         ++(*num);
  528.         if(((*num) & 0x0f) == 0x0a){
  529.                 *num += 0x10;
  530.                 *num &= 0xf0;
  531.                 }
  532.         return *num;
  533. }
  534. //==================
  535. //****校时加加****
  536. //==================
  537. void Add_Time(){
  538.         switch(CHANGE){
  539.                                 case CHG_HOUR:
  540.                                         if(HIDE){
  541.                                                 if(Add_num(&TMP_TIME) == 0x24)
  542.                                                         TMP_TIME= 0;
  543.                                                 }
  544.                                         else{
  545.                                                 if(Add_num(&Time.Hour) == 0x24)
  546.                                                         Time.Hour = 0;
  547.                                                 }
  548.                                         break;
  549.                                 case CHG_MIN:
  550.                                         if(HIDE){
  551.                                                 if(Add_num(&TMP_TIME) == 0x60)
  552.                                                         TMP_TIME= 0;
  553.                                                 }
  554.                                         else{
  555.                                                 if(Add_num(&Time.Minute) == 0x60)
  556.                                                         Time.Minute= 0;
  557.                                                 }
  558.                                         break;
  559.                                 case CHG_SEC:
  560.                                         if(HIDE){
  561.                                                 if(Add_num(&TMP_TIME) == 0x60)
  562.                                                         TMP_TIME= 0;
  563.                                                 }
  564.                                         else{
  565.                                                 if(Add_num(&Time.Second) == 0x60)
  566.                                                         Time.Second = 0;
  567.                                                 }
  568.                                         break;
  569.                                 case CHG_MON:
  570.                                         if(HIDE){
  571.                                                 if(Add_num(&TMP_TIME) == 0x13)
  572.                                                         TMP_TIME= 0;
  573.                                                 }
  574.                                         else{
  575.                                                 if(Add_num(&Time.Month) == 0x13)
  576.                                                         Time.Month= 1;
  577.                                                 }
  578.                                         break;
  579.                                 case CHG_DAY:
  580.                                         if(HIDE){
  581.                                                 if(Add_num(&TMP_TIME) == 0x32)
  582.                                                         TMP_TIME= 0;
  583.                                                 }
  584.                                         else{
  585.                                                 if(Add_num(&Time.Day) == 0x32)
  586.                                                         Time.Day= 0;
  587.                                                 }
  588.                                         break;
  589.                                 case CHG_WEEK:
  590.                                         if(HIDE){
  591.                                                 if(Add_num(&TMP_TIME) == 0x08)
  592.                                                         TMP_TIME= 1;
  593.                                                 }
  594.                                         else{
  595.                                                 if(Add_num(&Time.Week) == 0x08)
  596.                                                         Time.Week= 1;
  597.                                                 }
  598.                                         break;
  599.                                 case CHG_YEAR:
  600.                                         if(HIDE){
  601.                                                 if(Add_num(&TMP_TIME) == 0xa0)
  602.                                                         TMP_TIME = 0;
  603.                                                 }
  604.                                         else{
  605.                                                 if(Add_num(&Time.Year) == 0xa0)
  606.                                                         Time.Year = 0;
  607.                                                 }
  608.                                         //if(Add_num(&Time.Year) == 0x24)
  609.                                         //        Time.Year= 0;
  610.                                         break;
  611.                                 default:
  612.                                         break;
  613.                                 }
  614. }
  615. //==================
  616. //****减减函数****
  617. //功能: 0x20 --  =0x19
  618. //==================
  619. uchar Cut_num(char *num){
  620.         --(*num);
  621.         if(((*num)&0x0f) == 0x0f){
  622.                 //*num -= 0x10;
  623.                 *num &= 0xf9;
  624.         }
  625.         //if((*num == 0xf9)
  626.                 //*num = 0x99;
  627.         return *num;
  628. }
  629. //==================
  630. //****校时减减****
  631. //==================
  632. void Cut_Time(){
  633.         switch(CHANGE){
  634.                                 case CHG_HOUR:
  635.                                         if(HIDE){
  636.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  637.                                                         TMP_TIME= 0x23;
  638.                                                 }
  639.                                         else{
  640.                                                 if(Cut_num(&Time.Hour) == 0xf9)
  641.                                                         Time.Hour = 0x23;
  642.                                                 }
  643.                                         break;
  644.                                 case CHG_MIN:
  645.                                         if(HIDE){
  646.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  647.                                                         TMP_TIME= 0x59;
  648.                                                 }
  649.                                         else{
  650.                                                 if(Cut_num(&Time.Minute) == 0xf9)
  651.                                                         Time.Minute= 0x59;
  652.                                                 }
  653.                                         break;
  654.                                 case CHG_SEC:
  655.                                         if(HIDE){
  656.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  657.                                                         TMP_TIME= 0x59;
  658.                                                 }
  659.                                         else{
  660.                                                 if(Cut_num(&Time.Second) == 0xf9)
  661.                                                         Time.Second = 0x59;
  662.                                                 }
  663.                                         break;
  664.                                 case CHG_MON:
  665.                                         if(HIDE){
  666.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  667.                                                         TMP_TIME= 0x12;
  668.                                                 }
  669.                                         else{
  670.                                                 if(Cut_num(&Time.Month) == 0xf9)
  671.                                                         Time.Month= 0x12;
  672.                                                 }
  673.                                         break;
  674.                                 case CHG_DAY:
  675.                                         if(HIDE){
  676.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  677.                                                         TMP_TIME= 0x31;
  678.                                                 }
  679.                                         else{
  680.                                                 if(Cut_num(&Time.Day) == 0xf9)
  681.                                                         Time.Day= 0x31;
  682.                                                 }
  683.                                         break;
  684.                                 case CHG_WEEK:
  685.                                         if(HIDE){
  686.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  687.                                                         TMP_TIME= 0x7;
  688.                                                 }
  689.                                         else{
  690.                                                 if(Cut_num(&Time.Week) == 0xf9)
  691.                                                         Time.Week= 0x7;
  692.                                                 }
  693.                                         break;
  694.                                 case CHG_YEAR:
  695.                                         if(HIDE){
  696.                                                 if(Cut_num(&TMP_TIME) == 0xf9)
  697.                                                         TMP_TIME= 0x99;
  698.                                                 }
  699.                                         else{
  700.                                                 if(Cut_num(&Time.Year) == 0xf9)
  701.                                                         Time.Year = 0x99;
  702.                                                 }
  703.                                         //if(Cut_num(&Time.Year) == 0x99)
  704.                                         //        Time.Year= 0;
  705.                                         break;
  706.                                 default:
  707.                                         break;
  708.                                 }
  709. }

  710. //======按键======
  711. uchar ReadKey(){
  712.         //
  713.         if(!key_done){
  714.         switch(MSG_KEY){
  715.                 case KEY0_S:STATE = STA_sTIME;
  716.                                         break;
  717.                 case KEY1_S:STATE = STA_gWORD;        //STA_sWEEK
  718.                                         break;
  719.                 case KEY2_S:STATE = STA_gTEMP;
  720.                                         break;
  721.                 case KEY3_S:STATE = STA_gTIME;
  722.                                         break;
  723.                 case KEY0_L:STATE = STA_CHG;
  724.                                         break;
  725.                 case KEY1_L:STATE = STA_SONG;
  726.                                         break;
  727.                 case KEY2_L:STATE = STA_gTEMP;
  728.                                         break;
  729.                 case KEY3_L:STATE = STA_gWORD;        //STA_sTIME
  730.                                         break;
  731.                 default:        break;
  732.                 }
  733.                 }
  734.         key_done = 1;        //按键事件处理完成
  735.         return MSG_KEY;       
  736. }
  737. //=======================
  738. //****校时按键处理****
  739. //=======================
  740. uchar ReadKey1(){
  741.         //
  742.         if(!key_done){
  743.         switch(MSG_KEY){
  744.                 case KEY0_S:                //切换校时对象
  745.                 case KEY0_L:
  746.                                         exit = 0;
  747.                                         TR1 = 0;                //关闭定时器1闪烁
  748.                                         Change_obj();
  749.                                         if(CHANGE++ >= CHG_YEAR)
  750.                                                 CHANGE = CHG_HOUR;
  751.                                         TR1 = 1;                //开启定时器1闪烁
  752.                                         break;
  753.                 case KEY1_S:                //加加
  754.                 case KEY1_L:
  755.                                         exit = 0;
  756.                                         TR1 = 0;                //关闭定时器1闪烁
  757.                                         Add_Time();
  758.                                         TR1 = 1;                //开启定时器1闪烁
  759.                                         break;
  760.                 case KEY2_S:                //减减
  761.                 case KEY2_L:
  762.                                         exit = 0;
  763.                                         TR1 = 0;                //关闭定时器1闪烁
  764.                                         Cut_Time();
  765.                                         TR1 = 1;                //开启定时器1闪烁
  766.                                         break;
  767.                 case KEY3_L:
  768.                 case KEY3_S:
  769.                                         return KEY3_S;
  770.                 default:        break;
  771.                 }
  772.                 }
  773.         key_done = 1;        //按键事件处理完成
  774.         return 0;
  775. }
  776. //===========================
  777. void Tinit(){
  778.         TMOD = 0x11;
  779.         TH0 = 0xD8;
  780.         TL0 = 0xF0;
  781.         TH1 = 0x42;
  782.         TL1 = 0xCA;
  783.         TR0 = 1;
  784.         //TR1 = 1;
  785.         ET0 = 1;
  786.         ET1 = 1;
  787.         EA = 1;
  788. }

  789. timer0() interrupt 1{
  790.         TH0 = 0xb1;
  791.         TL0 = 0xe0;

  792.         if(P1 != 0xff) {//若有键按下
  793.                 cur_key_val = P1&0x0f;        //记录按键值
  794.                 if(key_times < 150)
  795.                         key_times++;  
  796.                 else{
  797.                         key_keep_times++;         //长按连击
  798.                         if(key_keep_times >= 10){  //10 1秒连击10次
  799.                                 key_keep_times = 0;
  800.                                 MSG_KEY = 0x10 | cur_key_val;
  801.                                 key_done = 0;        //按键事件复位
  802.                                 }
  803.                         }         
  804.         }else{
  805.                 if(key_times > 2 && key_times < 100 && key_done){        //短按键
  806.                         MSG_KEY = cur_key_val;
  807.                         key_done = 0;         //按键事件复位
  808.                         }
  809.                 else if(key_times >= 100 && key_done){        //长按键
  810.                         MSG_KEY = 0x10 | cur_key_val;
  811.                         key_done = 0;         //按键事件复位
  812.                         }
  813.                 key_times = 0;       
  814.                 key_keep_times = 0;
  815.                 }
  816. }

  817. timer1() interrupt 3{
  818.         if(STATE == STA_CHG){
  819.                 TH1 = 0x42;
  820.                 TL1 = 0xCA;
  821.                 if(hide_times++ == 8){
  822.                         HIDE = 0;        //显示
  823.                         switch(CHANGE){
  824.                                 case CHG_HOUR:
  825.                                         Time.Hour =TMP_TIME;
  826.                                         break;
  827.                                 case CHG_MIN:
  828.                                         Time.Minute = TMP_TIME;
  829.                                         break;
  830.                                 case CHG_SEC:
  831.                                         Time.Second = TMP_TIME;
  832.                                         break;
  833.                                 case CHG_MON:
  834.                                         Time.Month = TMP_TIME;
  835.                                         break;
  836.                                 case CHG_DAY:
  837.                                         Time.Day = TMP_TIME;
  838.                                         break;
  839.                                 case CHG_WEEK:
  840.                                         Time.Week = TMP_TIME;
  841.                                         break;
  842.                                 case CHG_YEAR:
  843.                                         Time.Year = TMP_TIME;
  844.                                         break;
  845.                                 default:
  846.                                         break;
  847.                                 }
  848.                  }
  849.                  if(hide_times > 17){
  850.                          hide_times = 0;
  851.                         HIDE = 1;        //隐藏
  852.                         exit++;
  853.                         switch(CHANGE){
  854.                                 case CHG_HOUR:
  855.                                         TMP_TIME = Time.Hour;
  856.                                         Time.Hour = 0xcc;
  857.                                         break;
  858.                                 case CHG_MIN:
  859.                                         TMP_TIME = Time.Minute;
  860.                                         Time.Minute = 0xcc;
  861.                                         break;
  862.                                 case CHG_SEC:
  863.                                         TMP_TIME = Time.Second;
  864.                                         Time.Second = 0xcc;
  865.                                         break;
  866.                                 case CHG_MON:
  867.                                         TMP_TIME = Time.Month;
  868.                                         Time.Month = 0xcc;
  869.                                         break;
  870.                                 case CHG_DAY:
  871.                                         TMP_TIME = Time.Day;
  872.                                         Time.Day = 0xcc;
  873.                                         break;
  874.                                 case CHG_WEEK:
  875.                                         TMP_TIME = Time.Week;
  876.                                         Time.Week = 0xcc;
  877.                                         break;
  878.                                 case CHG_YEAR:
  879.                                         TMP_TIME = Time.Year;
  880.                                         Time.Year = 0xcc;
  881.                                         break;
  882.                                 default:
  883.                                         break;
  884.                                 }
  885.                 }
  886.         }
  887. }

  888. void Compute_State()
  889. {
  890.         switch(Time.Second)
  891.         {
  892.                 case 0x1:
  893.                         //STATE = STA_gTIME;
  894.                         break;
  895.                 case 0x2:
  896.                         STATE = STA_sYEAR;
  897.                         break;
  898.                 case 0x15:
  899.                         STATE = STA_sTEMP;
  900.                         break;
  901.                 case 0x31:
  902.                         STATE = STA_sDATE;
  903.                         break;
  904.                 case 0x40:
  905.                         STATE = STA_sWEEK;
  906.                         break;
  907.                 case 0x50:
  908.                         STATE = STA_sTEMP;
  909.                         break;
  910.                 default:
  911.                         break;
  912.         }
  913.         if(Time.Minute%2 == 0 && Time.Second == 0)
  914.                 STATE = STA_gTIME;
  915.         if((Time.Minute&0x0f)%5 == 0 && Time.Second == 30)
  916.                 STATE = STA_gTEMP;
  917.         if((Time.Minute&0x0f) == 7 && Time.Second == 0)
  918.                 STATE = STA_gWORD;
  919.         if((Time.Minute&0x0f) == 3 && Time.Second == 0)
  920.                 STATE = STA_SONG;
  921. }

  922. //**********************************
  923. //;---------主程序循环--------------
  924. //**********************************


  925.                    void main()
  926.                 {
  927.                         int i;
  928.                         initial();
  929.                         Tinit();
  930.                         Init_DS1302();
  931.                         Read_TIME();        //读取时间
  932.                         Read_Temperature();
  933.                         Show_Cpyrt();
  934.                         //start_time();
  935.                         //write_time1302();
  936.                         //MSG_MV = MSG_MV_L;
  937.                         //STATE=STA_sTIME;
  938.                         STATE=STA_SONG;
  939.                         while(1)
  940.                         {
  941.                            ReadKey();
  942.                                 switch(STATE){
  943.                                         case STA_gTIME:
  944.                                                 //添加代码
  945.                                                 MSG_MV = MSG_MV_L;
  946.                                                 move_times = 0;
  947.                                                 start_word=0;
  948.                                                 Read_TIME();        //读取时间
  949.                                                 Show_All_Info();
  950.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  951.                                                 key_done = 0;
  952.                                                 break;
  953.                                         case STA_gTEMP:
  954.                                                 Put_Wdispram(TMP_WORDS); //,start_word++
  955.                                                 Read_Temperature();
  956.                                                   Disp_Temperature();
  957.                                                   Put_gTEMP();
  958.                                                 Move_Down();
  959.                                                   Show_Move_Word(TMP_WORDS);
  960.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  961.                                                 key_done = 0;
  962.                                                 break;
  963.                                         case STA_gWORD:
  964.                                                 //添加代码
  965.                                                 Put_Wdispram(MY_WORDS); //,start_word++        
  966.                                                 Move_Down();
  967.                                                   Show_Move_Word(MY_WORDS);
  968.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  969.                                                 key_done = 0;
  970.                                                 break;
  971.                                         case STA_sTIME:
  972.                                                 //添加代码
  973.                                                 MSG_MV = MSG_MV_L;
  974.                                                 move_times = 0;
  975.                                                 start_word=0;
  976.                                                 Read_TIME();        //读取时间
  977.                                                 Put_Tdispram(0);       
  978.                                                 Show_sWord();
  979.                                                 Compute_State();
  980.                                                 break;
  981.                                         case STA_sDATE:
  982.                                                 //添加代码
  983.                                                 MSG_MV = MSG_MV_L;
  984.                                                 move_times = 0;
  985.                                                 start_word=0;
  986.                                                 Read_TIME();        //读取时间
  987.                                                 Put_Ddispram(8);
  988.                                                 Move_Down();
  989.                                                 Put_Ddispram(0);
  990.                                                 for(i=0;i<8;i++)
  991.                                                         Show_sWord();
  992.                                                 Read_TIME();
  993.                                                 Put_Tdispram(8);
  994.                                                 Move_Up();
  995.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  996.                                                 key_done = 0;
  997.                                                 break;
  998.                                         case STA_sWEEK:
  999.                                                 //添加代码
  1000.                                                 MSG_MV = MSG_MV_L;
  1001.                                                 move_times = 0;
  1002.                                                 start_word=0;
  1003.                                                 Read_TIME();        //读取时间
  1004.                                                 Put_Kdispram(8);
  1005.                                                 Move_Up();        //Move_Down();
  1006.                                                 for(i=0;i<8;i++){       
  1007.                                                         Read_TIME();        //读取时间
  1008.                                                         Put_Kdispram(0);
  1009.                                                         Show_sWord();
  1010.                                                         }
  1011.                                                 Read_TIME();
  1012.                                                 Put_Tdispram(8);
  1013.                                                 Move_Down();        //Move_Up();
  1014.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1015.                                                 key_done = 0;
  1016.                                                 break;
  1017.                                         case STA_sYEAR:
  1018.                                                 MSG_MV = MSG_MV_L;
  1019.                                                 move_times = 0;
  1020.                                                 start_word=0;
  1021.                                                 Read_TIME();        //读取时间
  1022.                                                 Put_Ydispram(8);
  1023.                                                 Move_Down();
  1024.                                                 for(i=0;i<8;i++){       
  1025.                                                         Read_TIME();        //读取时间
  1026.                                                         Put_Ydispram(0);
  1027.                                                         Show_sWord();
  1028.                                                         }
  1029.                                                 Read_TIME();
  1030.                                                 Put_Tdispram(8);
  1031.                                                 Move_Up();
  1032.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1033.                                                 key_done = 0;
  1034.                                                 break;
  1035.                                         case STA_sTEMP:
  1036.                                                 //添加代码
  1037.                                                 MSG_MV = MSG_MV_L;
  1038.                                                 move_times = 0;
  1039.                                                 start_word=0;
  1040.                                                 Read_Temperature();
  1041.                                                   Disp_Temperature();
  1042.                                                 Put_sTEMP(8);
  1043.                                                 Move_Up();        //Move_Down();
  1044.                                                 for(i=0;i<8;i++)        {
  1045.                                                         Read_Temperature();
  1046.                                                           Disp_Temperature();
  1047.                                                         Put_sTEMP(0);
  1048.                                                         Show_sWord();
  1049.                                                         }
  1050.                                                 Read_TIME();
  1051.                                                 Put_Tdispram(8);
  1052.                                                 Move_Down();        //Move_Up();
  1053.                                                 MSG_KEY = KEY0_S;        //回到时间画面
  1054.                                                 key_done = 0;
  1055.                                                 break;
  1056.                                         case STA_sWORD:
  1057.                                                 //添加代码
  1058.                                                 break;
  1059.                                         case STA_CHG:
  1060.                                                 //校时模式
  1061.                                                 Change_Time();
  1062.                                                 write_time1302();
  1063.                                                 Read_TIME();
  1064.                                                 Put_Tdispram(8);
  1065.                                                 Move_Up();
  1066.                                                 MSG_KEY = KEY0_S;
  1067.                                                 break;
  1068.                                         case STA_SONG:
  1069.                                                 MSG_MV = MSG_MV_L;
  1070.                                                 move_times = 0;
  1071.                                                 start_word=0;
  1072.                                                 Show_Song();
  1073.                                                 MSG_KEY = KEY0_S;
  1074.                                                 key_done = 0;
  1075.                                                 break;
  1076.                                         default:
  1077.                                                 break;
  1078.                                          }
  1079.                         }
  1080.                  }
复制代码



评分

参与人数 1黑币 +1 收起 理由
瓜子虫 + 1 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:167884 发表于 2018-1-7 01:17 | 只看该作者
DIY有意,做个来玩玩
回复

使用道具 举报

板凳
ID:140183 发表于 2018-1-20 06:04 | 只看该作者
很好!我有一个屏,又不会写程序,一直没有合适的程序。
回复

使用道具 举报

地板
ID:140489 发表于 2018-1-22 09:56 | 只看该作者
仿真温度怎么显示55.9不变,仿真里面调18B20,显示不变
回复

使用道具 举报

5#
ID:341120 发表于 2018-6-4 22:27 | 只看该作者
有没有效果图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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