切换到宽版
  • 9883阅读
  • 28回复

[C51]ds1302+1602大字符红外时钟(闹钟 日期)(第一次发帖啊~) [复制链接]

上一主题 下一主题
离线a2633063
 

发帖
613
M币
2648
专家
14
粉丝
33059
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2013-01-15
朋友生日,所以就做了个 简单的ds1302的时钟,使用1602显示,大字符+普通字符切换显示+背光灯开关+红外控制+闹钟
红外所用到的键值:45 46 43 40 09 15 47 16 0c 18 5e 08 1c 5a 42 52 4a
各个功能大家自己研究吧






大字符显示模式:

普通字符显示模式:


闹钟设置模式:


闹钟:




开机:
生日快乐~




卸掉1602:




电路图:




以下为代码:
  1. /* beep=P1^0     //蜂鸣器    
  2. 按键:sbit K1=P2^4; sbit K2=P2^5;    sbit K3=P2^6; sbit K4=P2^7;
  3. sbit io=P0^2;         //ds1302的数据线
  4. sbit sck=P0^1;         //ds1302的时钟线
  5. sbit rst=P0^3;         //ds1302的复位线
  6. IRIN = P2^0;         //红外接收器数据线
  7. sbit Light=P1^2;
  8. sbit rs=P2^1;                //1602RS控制位
  9. sbit rw=P2^2;                //1602RW控制位
  10. sbit e =P2^3;                //1602E 控制位
  11. P3                         1602
  12. */
  13. #include<reg52.h>
  14. #include<intrins.h>
  15. #include"ds1302.h"
  16. #include"1602.h"
  17. #include"display.h"
  18. sbit K1=P2^4; sbit K2=P2^5;    sbit K3=P2^6; sbit K4=P2^7;
  19. sbit Light=P1^2;
  20. sbit IRIN = P2^0;         //红外接收器数据线
  21. uchar IRCOM[7];
  22. uchar mode=0,mode1,A0,A=8;            //0调年 1调月 2调日 3调时 4调分 5调秒 6调闹钟时 7调闹钟分 8显示时间 9闹钟启动
  23. uint w;
  24. void InitTimer0(void)                       //中断
  25. {
  26.     TMOD = 0x01;
  27.     TH0 = 0x0FF;
  28.     TL0 = 0x38;
  29.     EA = 1;
  30.     ET0 = 1;
  31.     TR0 = 1;
  32. }
  33. void DISlcd()                               //ASCII字符转换
  34. {
  35.     lcd_time[0]=LCD[disp[6]];
  36.     lcd_time[1]=LCD[disp[7]];
  37.     lcd_time[2]=':';
  38.     lcd_time[3]=LCD[disp[8]];
  39.     lcd_time[4]=LCD[disp[9]];
  40.     lcd_time[5]=':';
  41.     lcd_time[6]=LCD[disp[10]];
  42.     lcd_time[7]=LCD[disp[11]];
  43.     lcd_data[0]=LCD[disp[0]];
  44.     lcd_data[1]=LCD[disp[1]];
  45.     lcd_data[2]='-';
  46.     lcd_data[3]=LCD[disp[2]];
  47.     lcd_data[4]=LCD[disp[3]];
  48.     lcd_data[5]='-';
  49.     lcd_data[6]=LCD[disp[4]];
  50.     lcd_data[7]=LCD[disp[5]];
  51.     lcd_alarm[0]=LCD[alarm_time_disp[0]];
  52.     lcd_alarm[1]=LCD[alarm_time_disp[1]];
  53.     lcd_alarm[2]=':';
  54.     lcd_alarm[3]=LCD[alarm_time_disp[2]];
  55.     lcd_alarm[4]=LCD[alarm_time_disp[3]];
  56. }
  57. void W(int a)
  58. {    if(w==0)
  59.     time[A]=a*10+time[A]%10;
  60.     if(w==1)
  61.     time[A]=(time[A]/10)*10+a;
  62. }
  63. void key_scan()
  64. {
  65.     if(!K1)    {delay(10);    if(!K1)    {Beep_key();if(A==9) A=8; else  alarm_switch=~alarm_switch;}}
  66.     if(!K2)    {delay(10);    if(!K2)    {Beep_key();w=0;
  67.                         switch(A)
  68.                         {
  69.                                case 0:case 1:case 6:case 7:case 3:case 4:{A++;break;}
  70.                             case 8:{A=3;break;}
  71.                             case 5:{A=0;break;}
  72.                             case 2:{A=6;break;}
  73.                             case 9:{A=8;break;}
  74.                            }}}
  75.     if(!K3)    {delay(10);    if(!K3)    {Beep_key();if(A==9) A=8; else{time[A]++;}}}
  76.     if(!K4)    {delay(10);    if(!K4)    {Beep_key();if(A==9) A=8; else{time[A]--;}}}
  77. }
  78. main()
  79. {    int x;    
  80.     init1602();
  81.     lcd_wrzf();
  82.     if(!K1) {set();INIT_ds1302();write_com(0x01);}
  83.     begin();
  84.      delay(2000);
  85.     InitTimer0();
  86.     mode1=mode;
  87.     A0=A;
  88.      init1602();
  89.     while(1)
  90.     {    
  91.     beep=1;
  92.     read();
  93.     time_pros();
  94.     DISlcd();
  95.     if(alarm_switch!=1&&time[3]==time[6]&&time[4]==time[7]&&time[5]==0&&A==8) A=9;  //闹钟启动前提:闹钟开关打开 当前时间为闹钟时间 秒为0 当前为时间显示模式
  96.     if(A0!=A|mode1!=mode) {write_com(0x01);mode1=mode;A0=A;}
  97.     switch(A)
  98.     {
  99.         case 8:if(mode) display1();else display2(); break;
  100.          case 3: set_hour();    break;
  101.         case 4: set_min();    break;
  102.         case 5: set_second();    break;
  103.         case 0: set_year();    break;
  104.         case 1: set_month();    break;
  105.         case 2: set_day();    break;
  106.         case 6: set_alarm_hour(); break;
  107.         case 7: set_alarm_min(); break;
  108.     }
  109.     if(A==9)
  110.     {
  111.         x=25;
  112.         while(x--)
  113.         {
  114.             alarm_disp();
  115.             Beep_alarm();
  116.             if(A!=9) break;
  117.         }
  118.         A=8;
  119.     }
  120.     }
  121. }
  122. void Timer0Interrupt(void) interrupt 1
  123. {            
  124.     uchar j,k,N=0,month_max;
  125.     TH0 = 0x0FF;
  126.     TL0 = 0x38;
  127.     if(IRIN==0|(K1&K2&K3&K4)==0)
  128.     {
  129.          if(IRIN==1);      
  130.          else
  131.          {                    //确认IR信号出现
  132.           while (!IRIN) ;           //等IR变为高电平,跳过9ms的前导低电平信号。    
  133.           for (j=0;j<4;j++)         //收集四组数据
  134.           {
  135.           for (k=0;k<8;k++)        //每组数据有8位
  136.           {
  137.                while (IRIN);           //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  138.             while (!IRIN);          //等 IR 变为高电平      
  139.             while (IRIN)           //计算IR高电平时长
  140.             {
  141.             delayms(1);
  142.             N++;          
  143.             if (N>=30)     return;                  //0.14ms计数过长自动离开。
  144.             }                        //高电平计数完毕                
  145.              IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
  146.              if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
  147.              N=0;
  148.           }
  149.          }
  150.           
  151.            if (IRCOM[2]!=~IRCOM[3])  return;
  152.         
  153.            IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
  154.            IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
  155.         
  156.            if(IRCOM[5]>9)
  157.             { IRCOM[5]=IRCOM[5]+0x37;}
  158.            else
  159.               IRCOM[5]=IRCOM[5]+0x30;
  160.         
  161.            if(IRCOM[6]>9)
  162.             { IRCOM[6]=IRCOM[6]+0x37;}
  163.            else
  164.               IRCOM[6]=IRCOM[6]+0x30;
  165.         
  166.         
  167.              switch(IRCOM[2])
  168.              {
  169.                case 0x45: {Beep_key();if(A==9) A=8; else {Light=~Light;A=8;} break;}
  170.                case 0x46: {Beep_key(); if(A==8)mode=~mode; else A=8;break;}
  171.                case 0x43: {Beep_key();w=0;
  172.                             switch(A)
  173.                             {
  174.                                    case 0:case 1:case 6:case 7:case 3:case 4:{A++;break;}
  175.                                 case 8:{A=3;break;}
  176.                                 case 5:{A=0;break;}
  177.                                 case 2:{A=6;break;}
  178.                                 case 9:{A=8;break;}
  179.                                }
  180.                            break;
  181.                            }
  182.                case 0x40:{    Beep_key();w=0;
  183.                              switch(A)
  184.                                {
  185.                                    case 2:case 1:case 5:case 4:case 7:case 8:{A--;break;}
  186.                                 case 0:{A=5;break;}
  187.                                 case 6:{A=2;break;}
  188.                                 case 3:case 9:{A=8;break;}
  189.                                }
  190.                             break;
  191.                          }
  192.                case 0x09: {Beep_key();if(A==9) A=8; else{time[A]++;}break;}
  193.                case 0x15: {Beep_key();if(A==9) A=8; else{time[A]--;}break;}    
  194.                case 0x47: {Beep_key();if(A==9) A=8; else  alarm_switch=~alarm_switch; break;}
  195.     
  196.                case 0x16: {Beep_key();if(A==9) A=8; else{W(0);w++;if(w>1)w=0;}break;}  //0
  197.                case 0x0c: {Beep_key();if(A==9) A=8; else{W(1);w++;if(w>1)w=0;}break;}  //1
  198.                case 0x18: {Beep_key();if(A==9) A=8; else{W(2);w++;if(w>1)w=0;}break;}  //2
  199.                case 0x5e: {Beep_key();if(A==9) A=8; else{W(3);w++;if(w>1)w=0;}break;}  //3
  200.                case 0x08: {Beep_key();if(A==9) A=8; else{W(4);w++;if(w>1)w=0;}break;}  //4
  201.                case 0x1c: {Beep_key();if(A==9) A=8; else{W(5);w++;if(w>1)w=0;}break;}  //5
  202.                case 0x5a: {Beep_key();if(A==9) A=8; else{W(6);w++;if(w>1)w=0;}break;}  //6
  203.                case 0x42: {Beep_key();if(A==9) A=8; else{W(7);w++;if(w>1)w=0;}break;}  //7
  204.                case 0x52: {Beep_key();if(A==9) A=8; else{W(8);w++;if(w>1)w=0;}break;}  //8
  205.                case 0x4a: {Beep_key();if(A==9) A=8; else{W(9);w++;if(w>1)w=0;}break;}  //9
  206.     
  207.              }
  208.         }    
  209.         if(!(K1&K2&K3&K4)){key_scan();}
  210.              if(time[0]<0) {time[0]=99;w=0;} if(time[0]>99) {time[0]=0;w=0;}           //以下为范围设置
  211.              if(time[1]<1) {time[1]=12;w=0;} if(time[1]>12) {time[1]=1;w=0;}
  212.              if(time[3]<0) {time[3]=23;w=0;} if(time[3]>23) {time[3]=0;w=0;}
  213.              if(time[4]<0) {time[4]=59;w=0;} if(time[4]>59) {time[4]=0;w=0;}
  214.              if(time[5]<0) {time[5]=59;w=0;} if(time[5]>59) {time[5]=0;w=0;}
  215.              if(time[6]<0) {time[6]=23;w=0;} if(time[6]>23) {time[6]=0;w=0;}
  216.              if(time[7]<0) {time[7]=59;w=0;} if(time[7]>59) {time[7]=0;w=0;}
  217.              if(time[2]<1)
  218.              {     w=0;
  219.                  switch(time[1])
  220.                  {
  221.                      case 1:case 3:case 5:case 7:case 8:case 10:case 12: time[2]=31;break;
  222.                      case 4:case 6:case 9:case 11: time[2]=30;break;
  223.                     case 2:time[2]=28;break;
  224.                  }
  225.              }
  226.                  switch(time[1])
  227.              {
  228.                      case 1:case 3:case 5:case 7:case 8:case 10:case 12:month_max=31;break;
  229.                      case 4:case 6:case 9:case 11: month_max=30;break;
  230.                     case 2:month_max=31;break;
  231.              }
  232.               
  233.              if(time[2]>month_max) {time[2]=1;w=0;}
  234.              if(A<6&&A>=0) set();
  235.              while(!(K1&K2&K3&K4));
  236.         
  237.     }
  238. }
ds1302.h:
  1. #define uchar unsigned char
  2. #define uint unsigned int
  3. sbit io=P0^2;         //ds1302的数据线
  4. sbit sck=P0^1;         //ds1302的时钟线
  5. sbit rst=P0^3;         //ds1302的复位线
  6. char time[8]={13,1,1,12,0,0,6,0};                     //时间10进制 年月日时分秒 闹钟时 闹钟分
  7. uchar alarm_time_disp[4];
  8. uchar time16[6];                                       //时间16进制
  9. uchar disp[12];                                       //时间各位分解以便显示
  10. uchar write_add[6]={0x8c,0x88,0x86,0x84,0x82,0x80};//写地址
  11. uchar read_add[6]={0x8d,0x89,0x87,0x85,0x83,0x81};    //读地址
  12. void time_pros();
  13. void write_ds1302_byte(uchar dat);                        //写一个字节
  14. void write_ds1302(uchar add,uchar dat);                    //写
  15. uchar read_ds1302(uchar add);                            //读
  16. void read();                                            //将时间从1302中读出于time[]
  17. void delay(int x)
  18. {    int y;
  19. for(x;x>0;x--)
  20. for(y=125;y>0;y--);    
  21. }
  22. void delayms(int x)
  23. {    int y;
  24. for(x;x>0;x--)
  25. for(y=13;y>0;y--);    
  26. }
  27. void write_ds1302_byte(uchar dat)
  28. { uchar i;
  29.     for(i=0;i<8;i++)
  30.     {
  31.         sck=0;
  32.         io=dat&0x01;
  33.         dat=dat>>1;
  34.         sck=1;    
  35.     }
  36. }
  37. void write_ds1302(uchar add,uchar dat)                //写
  38. {
  39.     rst=0;    _nop_();
  40.     sck=0;    _nop_();
  41.     rst=1;    _nop_();
  42.     write_ds1302_byte(add);
  43.     write_ds1302_byte(dat);
  44.     rst=0;    _nop_();
  45.     io=1;
  46.     sck=1;
  47. }
  48. uchar read_ds1302(uchar add)
  49. {    uchar i,value;
  50.     rst=0;    _nop_();
  51.     sck=0;    _nop_();
  52.     rst=1;    _nop_();
  53.     write_ds1302_byte(add);
  54.     for(i=0;i<8;i++)
  55.     {
  56.         value=value>>1;
  57.         sck=0;
  58.         if(io)
  59.         value=value|0x80;
  60.         sck=1;
  61.     }
  62.     rst=0;    
  63.     sck=1;
  64.     io=1;
  65.     return value;
  66. }
  67. void read()
  68. {
  69.     uchar i;
  70.     for(i=0;i<6;i++)
  71.     {
  72.         time16[i]=read_ds1302(read_add[i]);
  73.     }
  74. }
  75. void time_pros()
  76. { int i;
  77.     disp[0]=time16[0]/16;         //年十位
  78.     disp[1]=time16[0]%16;         //年个位
  79.     disp[2]=time16[1]/16;         //月十位
  80.     disp[3]=time16[1]%16;         //月各位
  81.     disp[4]=time16[2]/16;         //日十位
  82.     disp[5]=time16[2]%16;           //日个位
  83.     
  84.     disp[6]=time16[3]/16;         //时十位
  85.     disp[7]=time16[3]%16;         //时个位
  86.     disp[8]=time16[4]/16;         //分十位
  87.     disp[9]=time16[4]%16;         //分个位
  88.     disp[10]=time16[5]/16;         //秒十位
  89.     disp[11]=time16[5]%16;         //秒个位
  90.     
  91.     alarm_time_disp[0]=time[6]/10;  //闹钟时十位
  92.     alarm_time_disp[1]=time[6]%10;  //闹钟时个位
  93.     alarm_time_disp[2]=time[7]/10;  //闹钟时十位
  94.     alarm_time_disp[3]=time[7]%10;  //闹钟分个位
  95.     
  96.     for(i=0;i<6;i++) time[i]=disp[2*i]*10+disp[2*i+1];
  97. }
  98. void set()                                  //设置ds1302
  99. {    uchar i;
  100.     for(i=0;i<6;i++)
  101.         time16[i]=time[i]%10+time[i]/10*16;
  102.     
  103.     write_ds1302(0x8e,0x00);                    //去除写保护
  104.     for(i=0;i<6;i++)
  105.     {
  106.          write_ds1302(write_add[i],time16[i]);
  107.     }
  108.     write_ds1302(0x8e,0x80);                    //加写保护
  109. }

1602.h:
  1. sbit rs=P2^1;                //1602RS控制位
  2. sbit rw=P2^2;                //1602RW控制位
  3. sbit e =P2^3;                //1602E 控制位
  4. uchar code LCD[10]="0123456789";
  5. //液晶自定义字符编码表
  6. uchar code ziku0[]={
  7. 0x1f,0x1f,0x00,0x00,0x00,0x00,0x00,0x00 //     100
  8. };
  9. uchar code ziku1[]={
  10. 0x1f,0x1f,0x00,0x1f,0x1f,0x00,0x1f,0x1f //    111
  11. };
  12. uchar code ziku2[]={
  13. 0x1f,0x1f,0x00,0x00,0x00,0x00,0x1f,0x1f         //101
  14. };
  15. uchar code ziku3[]={
  16. 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x1f         //001
  17. };
  18. uchar code ziku4[]={
  19. 0x00,0x00,0x07,0x07,0x07,0x07,0x00,0x00
  20. };
  21. uchar code ziku5[]={
  22. 0x00,0x04,0x0e,0x0e,0x0e,0x1f,0x00,0x00
  23. };
  24. uchar code ziku6[]={
  25. 0x04,0x0a,0x11,0x10,0x08,0x04,0x02,0x01
  26. };
  27. uchar code ziku7[]={
  28. 0x04,0x0A,0x11,0x01,0x02,0x04,0x08,0x10
  29. };
  30. void  write_com(uchar com);       //函数功能:写指令
  31. void write_data(uchar dat);       //函数功能:写数据        0x80+0x40
  32. void init1602(void);               //函数功能:初始化1602
  33. /**************************************************************************/
  34. /************                  各延时程序                    **************/
  35. /**************************************************************************/
  36. void delay_50us(uint t)
  37. {
  38.     uchar j;
  39.     for(;t>0;t--)
  40.     for(j=1;j>0;j--);
  41. }
  42. uchar Dat(uchar com)
  43. {  uchar a,b=0,i,temp;
  44.     a=com;  
  45.    for(i=0;i<8;i++)
  46.    {  
  47.        temp=a&0x01;  
  48.        a=a>>1;  
  49.        b=b+temp;  
  50.        if(i != 7)  
  51.        b=b<<1;  
  52.    }
  53.    return b;    
  54. }
  55. /************************************************************************/
  56. /**************                  1602显示部分           *****************/
  57. /************************************************************************/
  58. void  write_com(uchar com)       //函数功能:写指令
  59. {    uchar a;
  60.     a=Dat(com);
  61.     e=0;
  62.     rs=0;
  63.     rw=0;
  64.     P3=a;
  65.     delay_50us(10);
  66.     e=1;
  67.     delay_50us(20);
  68.     e=0;
  69. }
  70. void write_data(uchar dat)       //函数功能:写数据
  71. {    uchar a;
  72.     a=Dat(dat);
  73.     e=0;
  74.     rs=1;
  75.     rw=0;
  76.     P3=a;
  77.     delay_50us(10);
  78.     e=1;
  79.     delay_50us(20);
  80.     e=0;
  81. }
  82. void init1602(void)               //函数功能:初始化1602
  83. {
  84.     delay_50us(300);
  85.     write_com(0x38);
  86.     delay_50us(100);
  87.     write_com(0x38);
  88.     delay_50us(100);
  89.     write_com(0x38);
  90.     write_com(0x38);
  91.     write_com(0x01);
  92.     write_com(0x01);
  93.     write_com(0x06);
  94.     write_com(0x0c);
  95. }
  96. /***********************向液晶写入自定义字符****************************/
  97. void lcd_wrzf()
  98. {
  99. uchar i;
  100. write_com(0x40);//字符00
  101. for(i=0;i<8;i++)
  102. {
  103. write_data(ziku0[i]);
  104. }
  105. write_com(0x48);//字符01
  106. for(i=0;i<8;i++)
  107. {
  108. write_data(ziku1[i]);
  109. }
  110. write_com(0x50);//字符02
  111. for(i=0;i<8;i++)
  112. {
  113. write_data(ziku2[i]);
  114. }
  115. write_com(0x58);//字符03
  116. for(i=0;i<8;i++)
  117. {
  118. write_data(ziku3[i]);
  119. }
  120. write_com(0x60);//字符04
  121. for(i=0;i<8;i++)
  122. {
  123. write_data(ziku4[i]);
  124. }
  125. write_com(0x68);//字符05
  126. for(i=0;i<8;i++)
  127. {
  128. write_data(ziku5[i]);
  129. }
  130. write_com(0x70);//字符06
  131. for(i=0;i<8;i++)
  132. {
  133. write_data(ziku6[i]);
  134. }
  135. write_com(0x78);//字符07
  136. for(i=0;i<8;i++)
  137. {
  138. write_data(ziku7[i]);
  139. }
  140. }
  141. /*---------------------大字符显示部分---------------------*/
  142. void display_big(uchar add,char date) //大字显示模式 i是显示的数据,j是显示的地址
  143. {
  144. switch(date)
  145. {
  146. case '0':
  147. write_com(0x80+add);
  148. write_data(0x01);
  149. write_com(0x81+add);
  150. write_data(0x00);
  151. write_com(0x82+add);
  152. write_data(0x01);
  153. write_com(0x80+0x40+add);
  154. write_data(0x01);
  155. write_com(0x80+0x41+add);
  156. write_data(0x03);
  157. write_com(0x80+0x42+add);
  158. write_data(0x01);
  159. break;
  160. case '1':
  161. write_com(0x80+add);
  162. write_data(' ');
  163. write_com(0x81+add);
  164. write_data(0x01);
  165. write_com(0x82+add);
  166. write_data(' ');
  167. write_com(0x80+0x40+add);
  168. write_data(' ');
  169. write_com(0x80+0x41+add);
  170. write_data(0x01);
  171. write_com(0x80+0x42+add);
  172. write_data(' ');
  173. break;
  174. case '2':
  175. write_com(0x80+add);
  176. write_data(0x00);
  177. write_com(0x81+add);
  178. write_data(0x00);
  179. write_com(0x82+add);
  180. write_data(0x01);
  181. write_com(0x80+0x40+add);
  182. write_data(0x01);
  183. write_com(0x80+0x41+add);
  184. write_data(0x02);
  185. write_com(0x80+0x42+add);
  186. write_data(0x02);
  187. break;
  188. case '3':
  189. write_com(0x80+add);
  190. write_data(0x00);
  191. write_com(0x81+add);
  192. write_data(0x00);
  193. write_com(0x82+add);
  194. write_data(0x01);
  195. write_com(0x80+0x40+add);
  196. write_data(0x02);
  197. write_com(0x80+0x41+add);
  198. write_data(0x02);
  199. write_com(0x80+0x42+add);
  200. write_data(0x01);
  201. break;
  202. case '4':
  203. write_com(0x80+add);
  204. write_data(0x01);
  205. write_com(0x81+add);
  206. write_data(0x03);
  207. write_com(0x82+add);
  208. write_data(0x01);
  209. write_com(0x80+0x40+add);
  210. write_data(0x00);
  211. write_com(0x80+0x41+add);
  212. write_data(0x00);
  213. write_com(0x80+0x42+add);
  214. write_data(0x01);
  215. break;
  216. case '5':
  217. write_com(0x80+add);
  218. write_data(0x01);
  219. write_com(0x81+add);
  220. write_data(0x00);
  221. write_com(0x82+add);
  222. write_data(0x00);
  223. write_com(0x80+0x40+add);
  224. write_data(0x02);
  225. write_com(0x80+0x41+add);
  226. write_data(0x02);
  227. write_com(0x80+0x42+add);
  228. write_data(0x01);
  229. break;
  230. case '6':
  231. write_com(0x80+add);
  232. write_data(0x01);
  233. write_com(0x81+add);
  234. write_data(0x00);
  235. write_com(0x82+add);
  236. write_data(0x00);
  237. write_com(0x80+0x40+add);
  238. write_data(0x01);
  239. write_com(0x80+0x41+add);
  240. write_data(0x02);
  241. write_com(0x80+0x42+add);
  242. write_data(0x01);
  243. break;
  244. case '7':
  245. write_com(0x80+add);
  246. write_data(0x00);
  247. write_com(0x81+add);
  248. write_data(0x00);
  249. write_com(0x82+add);
  250. write_data(0x01);
  251. write_com(0x80+0x40+add);
  252. write_data(' ');
  253. write_com(0x80+0x41+add);
  254. write_data(' ');
  255. write_com(0x80+0x42+add);
  256. write_data(0x01);
  257. break;
  258. case '8':
  259. write_com(0x80+add);
  260. write_data(0x01);
  261. write_com(0x81+add);
  262. write_data(0x00);
  263. write_com(0x82+add);
  264. write_data(0x01);
  265. write_com(0x80+0x40+add);
  266. write_data(0x01);
  267. write_com(0x80+0x41+add);
  268. write_data(0x02);
  269. write_com(0x80+0x42+add);
  270. write_data(0x01);
  271. break;
  272. case '9':
  273. write_com(0x80+add);
  274. write_data(0x01);
  275. write_com(0x81+add);
  276. write_data(0x00);
  277. write_com(0x82+add);
  278. write_data(0x01);
  279. write_com(0x80+0x40+add);
  280. write_data(0x02);
  281. write_com(0x80+0x41+add);
  282. write_data(0x02);
  283. write_com(0x80+0x42+add);
  284. write_data(0x01);
  285. break;
  286. }
  287. }

display.h:
  1. sbit beep=P1^0;
  2. uchar lcd_time[8];
  3. uchar lcd_data[8];
  4. uchar lcd_alarm[5];
  5. uchar lcd_alarm_switch[5]="ONOFF";
  6. uchar table0[12]="DS1302 INIT!";
  7. uchar table1[16]="Time:";
  8. uchar table2[16]="Date:20";
  9. uchar table3[16]="Set Alarm:";
  10. uchar table4[]="Alarm switch:";
  11. uchar table5[]="!!ALARM!!";
  12. uchar table6[16]="Happy Birthday! ";
  13. #define wait 8
  14. uchar table7[16]="made by ZYC";
  15. uchar other1[10]={0,1};
  16. uchar other2[2]={0x04,0x20};
  17. uchar other3[2]={0x05,0x20};
  18. uchar alarm_switch=1;
  19. void display1_1()                        //显示Time: 及Data:20
  20. {   int i;
  21.     write_com(0x80);
  22.     for(i=0;i<5;i++)
  23.     {
  24.     write_data(table1[i]);
  25.     delay_50us(wait);
  26.     }
  27.     write_com(0x80+0x40);
  28.     for(i=0;i<7;i++)
  29.     {
  30.     write_data(table2[i]);
  31.     delay_50us(wait);
  32.     }
  33.     write_com(0x80+15);
  34.     write_data(other3[(alarm_switch==1)]);
  35.     delay_50us(wait);
  36. }
  37. void display2_1()                        //设置闹钟 显示Set Alarm:
  38. {   int i;
  39.     write_com(0x80);
  40.     for(i=0;i<10;i++)
  41.     {
  42.     write_data(table3[i]);
  43.     delay_50us(wait);
  44.     }
  45. }
  46. void alarm_switch_Disp()                //设置闹钟界面显示闹钟开关状态
  47. {
  48.     
  49.     write_com(0x80+0x40+12);
  50.     if(alarm_switch!=1)
  51.     {write_data(lcd_alarm_switch[0]);
  52.     delay_50us(wait);
  53.     write_data(lcd_alarm_switch[1]);
  54.     delay_50us(wait);
  55.     write_data(0x20);
  56.     delay_50us(wait);}
  57.     else
  58.     {write_data(lcd_alarm_switch[2]);
  59.     delay_50us(wait);
  60.     write_data(lcd_alarm_switch[3]);
  61.     delay_50us(wait);
  62.     write_data(lcd_alarm_switch[4]);
  63.     delay_50us(wait);}
  64.         
  65.     
  66.     
  67. }
  68. void display1()
  69. {    int i;display1_1();
  70.     write_com(0x80+5);
  71.     for(i=0;i<8;i++)
  72.     {
  73.     write_data(lcd_time[i]);
  74.     delay_50us(wait);
  75.     }
  76.     write_com(0x80+0x40+7);
  77.     for(i=0;i<8;i++)
  78.     {
  79.     write_data(lcd_data[i]);
  80.     delay_50us(wait);
  81.     }
  82. }
  83. void display2()
  84. {    if(lcd_time[0]=='1') {write_com(0x80);write_data(0x20);write_com(0x80+0x40);write_data(0x20);}
  85.     if(lcd_time[1]=='1') {write_com(0x86);write_data(0x20);write_com(0x86+0x40);write_data(0x20);}
  86.     if(lcd_time[3]=='1') {write_com(0x89);write_data(0x20);write_com(0x89+0x40);write_data(0x20);}
  87.     if(lcd_time[4]=='1') {write_com(0x8f);write_data(0x20);write_com(0x8f+0x40);write_data(0x20);}
  88.     display_big(other1[lcd_time[0]=='1'],lcd_time[0]);
  89.     display_big(4-other1[lcd_time[1]=='1'],lcd_time[1]);
  90.     display_big(9+other1[lcd_time[3]=='1'],lcd_time[3]);
  91.     display_big(13-other1[lcd_time[4]=='1'],lcd_time[4]);
  92.      write_com(0x87);
  93.     write_data(other2[lcd_time[7]%2]);
  94.     write_com(0x87+0x40);
  95.     write_data(other2[lcd_time[7]%2]);
  96. }
  97. void set_hour()               //调时
  98. {    int i,t;
  99.     display1_1();
  100.     for(t=0;t<5;t++)
  101.     {
  102.         write_com(0x80+5);
  103.         for(i=0;i<8;i++)
  104.         {if(i==0|i==1) write_data(0x20);
  105.         else write_data(lcd_time[i]);
  106.         delay_50us(wait);
  107.         }
  108.         write_com(0x80+0x40+7);
  109.         for(i=0;i<8;i++)
  110.         {
  111.         write_data(lcd_data[i]);
  112.         delay_50us(wait);
  113.         }    
  114.     }
  115.         for(t=0;t<8;t++)
  116.     {
  117.         write_com(0x80+5);
  118.         for(i=0;i<8;i++)
  119.         { write_data(lcd_time[i]);
  120.         delay_50us(wait);
  121.         }
  122.         write_com(0x80+0x40+7);
  123.         for(i=0;i<8;i++)
  124.         {
  125.         write_data(lcd_data[i]);
  126.         delay_50us(wait);
  127.         }    
  128.     }
  129. }
  130. void set_min()               //调分
  131. {    int i,t;
  132.     display1_1();
  133.     for(t=0;t<5;t++)
  134.     {
  135.         write_com(0x80+5);
  136.         for(i=0;i<8;i++)
  137.         {if(i==4|i==3) write_data(0x20);
  138.         else write_data(lcd_time[i]);
  139.         delay_50us(wait);
  140.         }
  141.         write_com(0x80+0x40+7);
  142.         for(i=0;i<8;i++)
  143.         {
  144.         write_data(lcd_data[i]);
  145.         delay_50us(wait);
  146.         }    
  147.     }
  148.         for(t=0;t<8;t++)
  149.     {
  150.         write_com(0x80+5);
  151.         for(i=0;i<8;i++)
  152.         { write_data(lcd_time[i]);
  153.         delay_50us(wait);
  154.         }
  155.         write_com(0x80+0x40+7);
  156.         for(i=0;i<8;i++)
  157.         {
  158.         write_data(lcd_data[i]);
  159.         delay_50us(wait);
  160.         }    
  161.     }
  162. }
  163. void set_second()               //调秒
  164. {    int i,t;
  165.     display1_1();
  166.     for(t=0;t<5;t++)
  167.     {
  168.         write_com(0x80+5);
  169.         for(i=0;i<8;i++)
  170.         {if(i==6|i==7) write_data(0x20);
  171.         else write_data(lcd_time[i]);
  172.         delay_50us(wait);
  173.         }
  174.         write_com(0x80+0x40+7);
  175.         for(i=0;i<8;i++)
  176.         {
  177.         write_data(lcd_data[i]);
  178.         delay_50us(wait);
  179.         }    
  180.     }
  181.         for(t=0;t<8;t++)
  182.     {
  183.         write_com(0x80+5);
  184.         for(i=0;i<8;i++)
  185.         { write_data(lcd_time[i]);
  186.         delay_50us(wait);
  187.         }
  188.         write_com(0x80+0x40+7);
  189.         for(i=0;i<8;i++)
  190.         {
  191.         write_data(lcd_data[i]);
  192.         delay_50us(wait);
  193.         }    
  194.     }
  195. }
  196. void set_year()               //调年
  197. {    int i,t;
  198.     display1_1();
  199.     for(t=0;t<5;t++)
  200.     {
  201.         write_com(0x80+5);
  202.         for(i=0;i<8;i++)
  203.         { write_data(lcd_time[i]);
  204.         delay_50us(wait);
  205.         }
  206.         write_com(0x80+0x40+7);
  207.         for(i=0;i<8;i++)
  208.         {if(i==0|i==1) write_data(0x20);
  209.         else
  210.         write_data(lcd_data[i]);
  211.         delay_50us(wait);
  212.         }    
  213.     }
  214.         for(t=0;t<8;t++)
  215.     {
  216.         write_com(0x80+5);
  217.         for(i=0;i<8;i++)
  218.         { write_data(lcd_time[i]);
  219.         delay_50us(wait);
  220.         }
  221.         write_com(0x80+0x40+7);
  222.         for(i=0;i<8;i++)
  223.         {
  224.         write_data(lcd_data[i]);
  225.         delay_50us(wait);
  226.         }    
  227.     }
  228. }
  229. void set_month()               //调月
  230. {    int i,t;
  231.     display1_1();
  232.     for(t=0;t<5;t++)
  233.     {
  234.         write_com(0x80+5);
  235.         for(i=0;i<8;i++)
  236.         { write_data(lcd_time[i]);
  237.         delay_50us(wait);
  238.         }
  239.         write_com(0x80+0x40+7);
  240.         for(i=0;i<8;i++)
  241.         {if(i==3|i==4) write_data(0x20);
  242.         else
  243.         write_data(lcd_data[i]);
  244.         delay_50us(wait);
  245.         }    
  246.     }
  247.         for(t=0;t<8;t++)
  248.     {
  249.         write_com(0x80+5);
  250.         for(i=0;i<8;i++)
  251.         { write_data(lcd_time[i]);
  252.         delay_50us(wait);
  253.         }
  254.         write_com(0x80+0x40+7);
  255.         for(i=0;i<8;i++)
  256.         {
  257.         write_data(lcd_data[i]);
  258.         delay_50us(wait);
  259.         }    
  260.     }
  261. }
  262. void set_day()               //调日
  263. {    int i,t;
  264.     display1_1();
  265.     for(t=0;t<5;t++)
  266.     {
  267.         write_com(0x80+5);
  268.         for(i=0;i<8;i++)
  269.         { write_data(lcd_time[i]);
  270.         delay_50us(wait);
  271.         }
  272.         write_com(0x80+0x40+7);
  273.         for(i=0;i<8;i++)
  274.         {if(i==6|i==7) write_data(0x20);
  275.         else
  276.         write_data(lcd_data[i]);
  277.         delay_50us(wait);
  278.         }    
  279.     }
  280.         for(t=0;t<8;t++)
  281.     {
  282.         write_com(0x80+5);
  283.         for(i=0;i<8;i++)
  284.         { write_data(lcd_time[i]);
  285.         delay_50us(wait);
  286.         }
  287.         write_com(0x80+0x40+7);
  288.         for(i=0;i<8;i++)
  289.         {
  290.         write_data(lcd_data[i]);
  291.         delay_50us(wait);
  292.         }    
  293.     }
  294. }
  295. void set_alarm_hour()         //调闹钟时
  296. {    int i,t;
  297.     alarm_switch_Disp();
  298.     display2_1();
  299.         for(t=0;t<28;t++)
  300.     {
  301.         write_com(0x80+0x40+4);
  302.         for(i=0;i<5;i++)
  303.         {if(i==0|i==1) write_data(0x20);
  304.         else write_data(lcd_alarm[i]);
  305.         delay_50us(wait);
  306.         }    
  307.     }
  308.         for(t=0;t<35;t++)
  309.     {
  310.         write_com(0x80+0x40+4);
  311.         for(i=0;i<5;i++)
  312.         {
  313.         write_data(lcd_alarm[i]);
  314.         delay_50us(wait);
  315.         }    
  316.     }
  317. }
  318. void set_alarm_min()         //调闹钟分
  319. {    int i,t;
  320.     alarm_switch_Disp();
  321.     display2_1();
  322.         for(t=0;t<28;t++)
  323.     {
  324.         write_com(0x80+0x40+4);
  325.         for(i=0;i<5;i++)
  326.         {if(i==3|i==4) write_data(0x20);
  327.         else write_data(lcd_alarm[i]);
  328.         delay_50us(wait);
  329.         }    
  330.     }
  331.         for(t=0;t<30;t++)
  332.     {
  333.         write_com(0x80+0x40+4);
  334.         for(i=0;i<5;i++)
  335.         {
  336.         write_data(lcd_alarm[i]);
  337.         delay_50us(wait);
  338.         }    
  339.     }
  340. }
  341. void alarm_disp()                     //闹钟开启显示 !!ALARM!!及闹钟时间
  342. {    int i;
  343.     write_com(0x80+3);
  344.     for(i=0;i<9;i++)
  345.     {
  346.     write_data(table5[i]);
  347.     delay_50us(wait);
  348.     }
  349.     write_com(0x80+0x40+5);
  350.     for(i=0;i<5;i++)
  351.     {
  352.     write_data(lcd_alarm[i]);
  353.     delay_50us(wait);
  354.     }
  355.     
  356. }
  357. void INIT_ds1302()
  358. {     int i;
  359.     write_com(0x80+2);
  360.     for(i=0;i<12;i++)
  361.     {write_data(table0[i]);
  362.     delayms(20);}
  363.     delay(1000);
  364. }
  365. void begin()
  366. {     int i;
  367.     write_com(0x80);
  368.     for(i=0;i<16;i++)
  369.     {write_data(table6[i]);
  370.     delay(100);}
  371.     write_com(0x80+0X40+5);
  372.     for(i=0;i<11;i++)
  373.     {write_data(table7[i]);
  374.     delay(100);}
  375.     
  376. }
  377. void Beep_alarm()                     //闹钟开启蜂鸣器启动
  378. {
  379.     beep=0;
  380.     delay(200);
  381.     beep=1;
  382.     delay(200);
  383.     beep=0;
  384.     delay(200);
  385.     beep=1;
  386.     delay(500);
  387. }
  388. void Beep_key()                         //按键按下
  389. {    
  390.     beep=0;
  391.     delay(100);
  392.     beep=1;
  393.     
  394. }

第一次发帖。程序感觉也写得很乱,应该有跟好的写法,高手就勿拍了`

keil工程及hex文件:
[ 此帖被a2633063在2013-01-15 18:02重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共12条打赏 ,M币+66 ,专家+1
12
离线aardvark911

发帖
300
M币
5181
专家
5
粉丝
34
只看该作者 1楼 发表于: 2013-01-15
回 楼主(a2633063) 的帖子
请登录后查看
离线nono鎶

发帖
619
M币
90
专家
2
粉丝
10
只看该作者 2楼 发表于: 2013-01-15
请登录后查看
离线robter

发帖
168
M币
4559
专家
-1
粉丝
9
只看该作者 3楼 发表于: 2013-01-20
请登录后查看
离线shifalao

发帖
1467
M币
5065
专家
0
粉丝
16
只看该作者 4楼 发表于: 2013-01-20
请登录后查看
离线a2633063

发帖
613
M币
2648
专家
14
粉丝
33059
只看该作者 5楼 发表于: 2013-01-20
回 3楼(robter) 的帖子
请登录后查看
离线a2633063

发帖
613
M币
2648
专家
14
粉丝
33059
只看该作者 6楼 发表于: 2013-01-20
回 4楼(shifalao) 的帖子
请登录后查看
离线a2633063

发帖
613
M币
2648
专家
14
粉丝
33059
只看该作者 7楼 发表于: 2013-01-20
回 3楼(robter) 的帖子
请登录后查看
离线wckwok99
发帖
464
M币
3167
专家
2
粉丝
28
只看该作者 8楼 发表于: 2013-01-21
请登录后查看
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线hzsanchun

发帖
91
M币
724
专家
-1
粉丝
14
只看该作者 9楼 发表于: 2013-01-23
请登录后查看
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个