找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外遥控器+DS1320+89C52+1602的电子时钟程序 95%是自己写的

  [复制链接]
跳转到指定楼层
楼主
ID:75005 发表于 2015-3-22 02:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 daxiao 于 2015-3-22 02:36 编辑

功能
1.时间显示(完成)             RAM2.5KB
2.整点报时  (完成)           RAM2.5KB
3.量程为24小时的秒表(完成)RMA3.5KB
4.时间调整  (完成)RMA 4.5KB
5.闹钟       (完成)RAM4.8K
6.防盗警戒(未完成)
7.计算机 (未完成)
8.逻辑分析仪(未完成)



                  
                  



  1.   #include<reg52.h>          //头文件
  2.       #define uchar unsigned char     //宏定义
  3.       #define uint unsigned int    //宏定义
  4.    volatile char ws;      

  5. uchar lcd6;
  6. uchar jm;
  7. uchar n,y,r,s,f,m,z;
  8. uchar ns,nf,nm;
  9. uchar we;
  10. uchar bla,blb,blc;
  11.     sbit ACC_7=ACC^7;    //位寄存器
  12. sbit SCLK=P1^3;       //时钟引脚定义
  13. sbit DIO=P1^4;        //IO引脚定义  
  14. sbit CE=P1^5;     //读、写数据期间,必须为高
  15. sbit LCD_RS=P1^0;         //寄存器选择位                                               
  16.     sbit LCD_RW=P1^1;          //读写控制位                                             
  17.     sbit LCD_EN=P1^2;           //开关   
  18. sbit FMQ=P3^7;              //定义蜂鸣引脚

  19.        uchar code LCD[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};   //LCD的数字整形码
  20.    uchar code LCDDZ[13]={0x02,0x03,0x05,0x06,0x08,0x09,0x43,0x48,0x49,0x4b,0x4c,0x4e,0x4f};
  21.          uchar code LCD7_1[16]={"1.clock shows   "};     //界面1入口,“时钟显示”
  22.          uchar code LCD7_2[16]={"2.second clock  "};     //界面2入口,“秒的时钟”
  23.          uchar code LCD7_3[16]={"3.alarm clock   "};     //界面3入口,“闹钟”
  24.          uchar code LCD7_4[16]={"4.onguard       "};     //界面4入口,“值班警戒”
  25.          uchar code LCD7_5[16]={"5.news          "};     //界面5人口,"信息"
  26.    uchar code LCD7_6[16]={"6.time alter    "};         //界面6修改时间
  27.    uchar code LCD8_0[16]={"      09 DZ1B   "};
  28.          uchar code  LCD1_0[16]={"20  .  .        "};     //界面1,时间显示
  29.          uchar code  LCD1_1[16]={"WEEK      :  :  "};     //界面1,时间显示
  30.          uchar code  LCD2_0[16]={"    00:00:00    "};      //界面2,秒表
  31.          uchar code  LCD3_0[16]={"alarm 00:00:00  "};       //界面3,时间设置
  32.          uchar code  LCD4_0[16]={"00:00   -  00:00"};       //界面4,警戒时间设置
  33.          uchar code  LCD5_0[16];    //界面5,信息栏记录陌生人进人情况
  34.          uchar code  LCD5_1[16];    //界面5,信息栏记录陌生人进人情况
  35.          uchar code  LCD5_2[16];    //界面5,信息栏记录陌生人进人情况
  36.          uchar code  LCD5_3[16];    //界面5,信息栏记录陌生人进人情况
  37.          uchar code  LCD5_4[16];    //界面5,信息栏记录陌生人进人情况
  38.    uchar code LCD6_0[16]={"20  .  .        "};
  39.    uchar code LCD6_1[16]={"WEEK      :  :  "};
  40.   uchar code LCDY[5];
  41.         uchar code LCDR[5];
  42.      uchar code LCDS[5];
  43.      uchar code LCDF[5];
  44.      uchar code LCDM[5];


  45.    //-------------------延时子函数 ---//
  46.    void delay(uint ms)
  47.    {
  48.     uchar ii,jj;
  49.     for(ii=0;ii<ms;ii++)
  50.     {
  51.     for(jj=0;jj<121;jj++)
  52.     {;}
  53.     }
  54.    }
  55.    //------------------X1302------//
  56.    void X1302(uchar add,uchar dat) //地址,数据   
  57.    {
  58.    uchar aa;
  59. CE=0;    //关闭读写使能,读、写数据期间,必须为高
  60. SCLK=0;  //拉低时钟线
  61. CE=1;  //开启读写使能
  62. for(aa=0;aa<8;aa++)   //写入地址
  63. {
  64.   DIO=add&0x01;     //把add的最低位送给数据线
  65.   SCLK=1;       //时钟拉高
  66.   add>>=1;    //累加器右移1位
  67.   SCLK=0;     //时钟拉
  68.    
  69. }
  70. for(aa=0;aa<8;aa++)   //写入数据
  71. {
  72.   DIO=dat&0x01;   //把要写入1302的数据地位送到数据线
  73.   SCLK=1;      //时钟拉高,把数据发送出去
  74.   dat>>=1;      //数据右移1位,把最低位去掉
  75.   SCLK=0;       //把时钟拉低,准备下一次发数据
  76. }
  77. SCLK=1;        //写完数据要把时钟线拉高,要是读完数据的话就要拉低时钟线
  78. CE=0;         //关闭读写使能
  79.     return;
  80.     }
  81. //-------------------D1302-------------//
  82. uchar D1302(uchar addr)  //读数据子函数    输入地址,返回数据
  83.    {
  84.     uchar  ab,temp,dat1,dat2;   //定义变量
  85.     CE=0;       //关闭读写数据使能
  86.     SCLK=0;       //时钟拉低,准备要接收数据
  87.     CE=1;        //开读写数据使能
  88.   for(ab=8;ab>0;ab--)   //发地址
  89.   {
  90.    SCLK=0;     //时钟拉低,准备接收数据
  91.    temp=addr;   //把地址送给变量temp
  92.    DIO=(bit)(temp&0x01);  //传送低字节
  93.    addr>>=1;    //地址addr右移1位
  94.    SCLK=1;    //时钟拉高 ,让1302读入地址
  95.   }
  96.   for(ab=8;ab>0;ab--)  //读数据
  97.   {
  98.     ACC_7=DIO; // ACC-7=接收新的一位数据
  99.     SCLK=1;   //时钟拉高,告诉1302我接收到数据了!!
  100.     ACC>>=1;   //ACC右移1位,把刚接到的数据移到低位去
  101.     SCLK=0;   //时钟拉低,告诉1302,请为我准备下一个数据
  102.   }
  103.   CE=0;     //关闭读写数据使能
  104.   dat1=ACC;  //把ACC的数据送给dat1
  105.   dat2=dat1/16;    //数据转换  dat2=数据的 "十六位"
  106.   dat1=dat1%16;  //数据转换   dat1=数据的 "个位"
  107.   dat1=dat1+dat2*10;  //再一次数据转换(把接收到的BCD码转换成十进制码)
  108.   return(dat1);   //反回读到的数据
  109.    }
  110.    //-----------检查LCD忙状态  --//                                                                             
  111.       void lcd_busy()                                                            
  112.    {                                                                        
  113. P0=0xff;                                         
  114.     LCD_RS=0;              //选择指令寄存器                                             
  115.     LCD_RW=1;              //进行读操作                                             
  116.     LCD_EN=1;               //使能                                             
  117.     while((P0&0x80)==0x80);                                 
  118.   LCD_EN=0;                       //关使能                                                            
  119.     }   
  120. //-----------------------------读LCD显示的数字--//
  121. uchar lcd_sz(uchar sxs)                                                            
  122.    {
  123.    uchar xx;
  124.      delay(2);                                      
  125.     LCD_RS=0;                   //选择指令                                       
  126.     LCD_RW=0;                    //选择写操作                           
  127.     LCD_EN=0;                    //关使能 ,让P0数据线上数据                                                                          
  128.     P0=(sxs|0x80);                      //DDRAM数据指针=80+地址变量                                       
  129.     delay(2);                              
  130.     LCD_EN=1;                   //开使能 ,让LCD读单片机的指令                                       
  131.     delay(5);  
  132. LCD_EN=0;                   //关使能                                                                 
  133. P0=0xff;                    //置高电平                     
  134.     LCD_RS=1;              //选择指令寄存器                                             
  135.     LCD_RW=1;              //进行读操作
  136. LCD_EN=1;              //开使能                                   
  137. delay(2);                                      
  138.      xx=P0;                 //记录数据                 
  139.   LCD_EN=0;             //关使能   
  140.   return xx;                                                      
  141.     }   
  142. //----------------------写指令数据到LCD  --//
  143. void lcd_wcmd(uchar cmd)                                                  
  144. {                                                                        
  145.     lcd_busy();                                      
  146.     LCD_RS=0;                   //选择写操作                                       
  147.     LCD_RW=0;                    //进行写操作                           
  148.     LCD_EN=0;                    //关使能 ,让数据线上数据                                                                          
  149.     P0=cmd;                       //送指令代码                                       
  150.     delay(2);                              
  151.     LCD_EN=1;                   //开使能 ,让单片机读指令                                       
  152.     delay(5);                                       
  153.     LCD_EN=0;                   //关使能     
  154.   return;                                    
  155. }   
  156. //-------------------------写显示数据到LCD --//
  157. void lcd_wdat(uchar dat)                                                  
  158. {                                                                        
  159.     lcd_busy();     //读忙                                                   
  160.     LCD_RS=1;     //选择数据寄存器                                                      
  161.     LCD_RW=0;     //进行读操作                                                      
  162.     LCD_EN=0;     //关使能                                                      
  163.     P0=dat;  //写入要显示的字符                                                                                                                     
  164.     LCD_EN=1;    //开使能 ,让LCD读进数据                                                      
  165.     delay(2);                                                            
  166.     LCD_EN=0;    //关使能   ,不让LCD操作                 
  167.   return;                                    
  168. }
  169. //----------------------设定显示位置  pos是屏幕的地址 --//
  170.                                                                           
  171. void lcd_pos(uchar pos)                                                   
  172. {                                                                        
  173.    lcd_busy();                                      
  174.     LCD_RS=0;                   //选择写操作                                       
  175.     LCD_RW=0;                    //进行写操作                           
  176.     LCD_EN=0;                    //关使能 ,让数据线上数据                                                                          
  177.     P0=(pos|0x80);                      //DDRAM数据指针=80+地址变量                                       
  178.     delay(2);                              
  179.     LCD_EN=1;                   //开使能 ,让单片机读指令                                       
  180.     delay(5);                                       
  181.     LCD_EN=0;                   //关使能   
  182.   return;               
  183. }
  184. //-----------------------LCD初始化设定   --//                                                                        
  185. void lcd_init()                                                           
  186. {                                                                        
  187.      lcd_busy();     //读忙                 
  188.     lcd_wcmd(0x3c);           //工作方式设置8位长,两行,5*7
  189.     delay(5);                //延时5ms                                            
  190.     lcd_wcmd(0x02);                                                   
  191.     delay(5);                //延时5ms                                          
  192.     lcd_wcmd(0x06);          //设置输入方式为AC是加1计数器,画面禁止滚动                                             
  193.     delay(5);                //延时5ms                                                                                       
  194.     lcd_wcmd(0x0c);          //显示开,关光标                             
  195.     delay(5);                //延时5mS   
  196.   return;                                                                                                                                               
  197. }   
  198. //---------------闪动子程序   //
  199. void fengming(uchar fm)                                                              
  200. {                                                                        
  201.    for(;fm<0;fm--)
  202.    {              
  203.     FMQ=0;  
  204.     lcd_wcmd(0x08);            //关闭显示                                 
  205.     delay(200);
  206.     FMQ=1;                    //延时                                 
  207.     lcd_wcmd(0x0c);            //开显示                                   
  208.     delay(200);
  209. }   
  210.   return;                                                                                            
  211. }
  212. //----------------------- 红外--//
  213. void int_init(void)      //初始化
  214. {
  215. EX0=1;        //开外部中断0
  216. EX1=1;                   //INT1开   
  217. IT1=1;                     //负跳变触发
  218. EA=1;      //开总开关
  219.   return;
  220. }
  221. //------------------------------------------------//
  222. void interrupt0()interrupt 0    //总断子函数
  223. {
  224. uchar i=0,j=0,k=0,us=0;     //定义字符变量i j k us
  225. uchar addr[4]={0};    //定义字符型数组

  226. EX0=0;         //关中断总开关

  227. for(i=0;i<255;i++)  //9ms内有高电平认为是干扰
  228. {
  229.   if(P3&0x04)     //255的值实际时间为800us
  230.   {
  231.    EX0=1;
  232.    return;
  233.   }
  234. }
  235. while(!(P3&0x04)); //等待9ms低电平过去
  236.     for(i=0;i<4;i++)
  237. {
  238.   for(j=0;j<8;j++)
  239.   {
  240.    while(P3&0x04); //等待4.5ms高电平过去
  241.    while(!(P3&0x04)); //等待0.56ms低电平后面的高电平
  242.    while(P3&0x04)  //计算这个高电平的时间
  243.    {
  244.     for(us=0;us<=32;us++); //100us的延时语句
  245.     if((k++)>=30)  //高电平时间过长退出程序
  246.     {
  247.      EX0=1;
  248.      return;
  249.     }
  250.    }
  251.    addr[i]=addr[i]>>1; //接收一位数据
  252.    if(k>=8)
  253.     addr[i]=addr[i]|0x80; //高电平大于0.56ms,则为1
  254.    k=0;
  255.   }
  256. }
  257. ws=addr[2];
  258. FMQ=0;
  259. for(j=5;j>0;j++)
  260. {
  261. for(i=0;i<121;i++)
  262. {;}
  263. }
  264. FMQ=1;
  265. EX0=1;  
  266. }
  267. //------------------------------------------//
  268. void interrupt2()interrupt 2  //总断子函数
  269. {
  270.     uchar d,e;
  271. EX0=0;
  272. FMQ=0;
  273. for(bla=0;bla<3;bla++)
  274. {
  275.   for(blb=0;blb<121;blb++)
  276.   {for(d=0;d<1000;d++)
  277.   {
  278.    for(e=0;e<40;e++)
  279.    {
  280.    ;
  281.    }
  282.       FMQ=~FMQ;
  283.       }
  284.     for(d=0;d<350;d++)
  285.   {
  286.    for(e=0;e<140;e++)
  287.    {
  288.    ;
  289.    }
  290.       FMQ=~FMQ;
  291.       }
  292.          }
  293. }
  294. FMQ=1;
  295. EX0=1;  
  296. }     
  297. //---------------------------------主菜单  JM7---------/
  298. void JM7CD()
  299. {
  300.   uchar K7=1;
  301.   uchar i;
  302.   if(jm==0x70)
  303.   {
  304.   jm=0x71;
  305.   }
  306.   lcd_wcmd(0x0f);
  307.   delay(2);
  308.   ws=0x01;
  309.   while(K7)
  310.   {
  311.    while(ws==0x00);
  312.   {
  313.      switch(ws)
  314.   {
  315.    case 0x43:    //确认
  316.              jm%=16;
  317.     jm*=16;
  318.     K7=0;
  319.              break;
  320.     case 0x47:    //确认
  321.              jm%=16;
  322.     jm*=16;
  323.     K7=0;
  324.              break;
  325.    case 0x44:   //上一条
  326.              if(jm>0x71)
  327.     {
  328.              jm-=0x01;
  329.     }
  330.              break;
  331.     case 0x07:   //上一条
  332.              if(jm>0x71)
  333.     {
  334.              jm-=0x01;
  335.     }
  336.              break;
  337.      case 0x19:   //上一条
  338.              if(jm>0x71)
  339.     {
  340.              jm-=0x01;
  341.     }
  342.              break;

  343.    case  0x40:     //下一条
  344.              if(jm<0x76)
  345.     {
  346.      jm+=0x01;
  347.     }
  348.              break;
  349.     case  0x15:     //下一条
  350.              if(jm<0x76)
  351.     {
  352.      jm+=0x01;
  353.     }
  354.              break;
  355.     case  0x0d:     //下一条
  356.              if(jm<0x76)
  357.     {
  358.      jm+=0x01;
  359.     }
  360.              break;
  361.    case 0x0c:     //第1界面
  362.              jm=0x10;
  363.     K7=0;
  364.              break;
  365.    case  0x18:       //第2界面
  366.              jm=0x20;
  367.     K7=0;
  368.     break;
  369.    case  0x5e:       //第3界面
  370.              jm=0x30;
  371.     K7=0;
  372.     break;
  373.    case  0x08:        //第4界面
  374.              jm=0x40;
  375.     K7=0;
  376.     break;
  377.    case  0x1c:      //第5界面
  378.              jm=0x50;
  379.     K7=0;
  380.     break;
  381.    case  0x5a:        //第6界面
  382.              jm=0x60;
  383.     K7=0;
  384.     break;
  385.    default:
  386.              break;
  387.   }
  388. }
  389.     delay(10);
  390. {
  391. switch(jm)
  392. {
  393.   case 0x71:
  394.          lcd_pos(0x00);
  395.            delay(2);
  396.            for(i=0;i<16;i++)
  397.            {
  398.             lcd_wdat(LCD7_1[i]);                           // 1.clock shows   界面1入口,“时钟显示”           
  399.    delay(2);
  400.             }
  401.       lcd_pos(0x40);
  402.             delay(2);
  403.             for(i=0;i<16;i++)
  404.            {
  405.            lcd_wdat(LCD7_2[i]);                           //2.second clock  
  406.      delay(2);
  407.            }
  408.     break;
  409.   case 0x72:
  410.        for(i=0;i<16;i++)
  411.            {
  412.            lcd_wdat(LCD7_2[i]);                           //2.second clock  
  413.      delay(2);
  414.            }
  415.      lcd_pos(0x40);
  416.          for(i=0;i<16;i++)
  417.          {                        
  418.          lcd_wdat(LCD7_3[i]);                        //3.alarm clock  界面3入口,“闹钟”   
  419.       delay(2);
  420.          }
  421.    break;
  422.   case 0x73:
  423.        for(i=0;i<16;i++)
  424.            {
  425.            lcd_wdat(LCD7_3[i]);                           //3.second clock  
  426.      delay(2);
  427.            }
  428.      lcd_pos(0x40);
  429.          for(i=0;i<16;i++)
  430.          {                        
  431.          lcd_wdat(LCD7_4[i]);                        //4.alarm clock  界面3入口,“闹钟”   
  432.       delay(2);
  433.          }
  434.    break;
  435.   case 0x74:        //4.alarm clock  界面3入口,“闹钟”
  436.        for(i=0;i<16;i++)
  437.            {
  438.            lcd_wdat(LCD7_4[i]);                           
  439.      delay(2);
  440.            }
  441.      lcd_pos(0x40);
  442.          for(i=0;i<16;i++)       //5
  443.          {                        
  444.          lcd_wdat(LCD7_5[i]);                       
  445.       delay(2);
  446.          }
  447.    break;
  448.   case 0x75:
  449.        for(i=0;i<16;i++)
  450.            {             //  5
  451.            lcd_wdat(LCD7_5[i]);                       
  452.      delay(2);
  453.            }
  454.      lcd_pos(0x40);
  455.          for(i=0;i<16;i++)
  456.          {           //6            
  457.          lcd_wdat(LCD7_6[i]);                        
  458.       delay(2);
  459.          }
  460.    break;
  461.    case 0x76:
  462.        for(i=0;i<16;i++)
  463.            {             //  5
  464.            lcd_wdat(LCD7_6[i]);                       
  465.      delay(2);
  466.            }
  467.      lcd_pos(0x40);
  468.          for(i=0;i<16;i++)
  469.          {           //6            
  470.          lcd_wdat(LCD8_0[i]);                        
  471.       delay(2);
  472.          }
  473.   
  474.    break;
  475.   default:break;
  476. }
  477. lcd_pos(0x00);
  478.     delay(2);  
  479. }
  480. ws=0x00;
  481.   }
  482.   lcd_wcmd(0x0c);
  483.    return;      
  484. }
  485. //-------------------------------------------JM1 显示时间//
  486. void JM1SJ()
  487. {
  488. uchar K1=1;
  489. lcd_pos(0x00);
  490.    for(K1=0;K1<16;K1++)
  491.   {
  492.     lcd_wdat(LCD1_0[K1]);   
  493.     delay(2);
  494.    }
  495.    lcd_pos(0x40);
  496.    for(K1=0;K1<16;K1++)
  497.    {
  498.        lcd_wdat(LCD1_1[K1]);
  499.     delay(2);
  500.    }
  501.    K1=1;
  502.   while(K1)
  503. {
  504.   n=D1302(0x8d);      //读1302的年
  505.   delay(1);  
  506.   y=D1302(0x89);      //读1302的月   
  507.   delay(1);
  508.   r=D1302(0x87);      //读1302的日     
  509.   delay(1);
  510.   s=0x1f&D1302(0x85);      //读1302的时
  511.   delay(1);
  512.   f=0x7f&D1302(0x83);      //读1302的分   
  513.   delay(1);
  514.   m=0x7f&D1302(0x81);      //读1302的秒   
  515.   delay(1);
  516.   z=D1302(0x8b);      //读1302的星期
  517.   delay(1);
  518.   lcd_pos(0x02);      //定位
  519.   delay(2);
  520.   lcd_wdat(LCD[n/10]);    //写 LCD1602显示十位年
  521.   delay(1);
  522.   lcd_wdat(LCD[n%10]);  //写LCD1602显示年
  523.   delay(1);
  524.   lcd_pos(0x05);    //定位
  525.   delay(2);
  526.   lcd_wdat(LCD[y/10]);    //写显示十位月
  527.   delay(1);
  528.   lcd_wdat(LCD[y%10]);    //写显示月
  529.   delay(1);
  530.   lcd_pos(0x08);      //定位
  531.   delay(2);
  532.   lcd_wdat(LCD[r/10]);   //写显示十位日
  533.   delay(1);
  534.   lcd_wdat(LCD[r%10]);    //写显示日
  535.   delay(1);
  536.   lcd_pos(0x44);      //定位
  537.   delay(2);
  538.   lcd_wdat(LCD[z]);       //写显示星期
  539.   delay(1);
  540.   lcd_pos(0x48);     //定位
  541.   delay(2);
  542.   lcd_wdat(LCD[s/10]);    //显示十位时
  543.   delay(1);
  544.   lcd_wdat(LCD[s%10]);     //显示时
  545.   delay(1);
  546.   lcd_pos(0x4b);          //定位
  547.   delay(2);
  548.   lcd_wdat(LCD[f/10]);        //显示十位分
  549.   delay(1);
  550.   lcd_wdat(LCD[f%10]);           //显示分
  551.   delay(1);
  552.   lcd_pos(0x4e);              //定位
  553.   delay(2);
  554.   lcd_wdat(LCD[m/10]);        //显示秒的十位
  555.   delay(2);
  556.   lcd_wdat(LCD[m%10]);     //显示秒的个位
  557.   delay(2);
  558.   while(s==ns&&f==nf&&m==nm&&we==1)     //闹钟
  559.   {
  560.   while(ws==0x00)
  561.   {
  562.     FMQ=0;
  563. for(s=5;s>0;s++)
  564. {
  565. for(m=0;m<121;m++)
  566. {;}
  567. }
  568. FMQ=1;
  569.   }
  570.   ws=0x99;
  571.   s++;
  572.   }

  573.   while(f==0x00||f==0x1e)      //整点报时
  574.   {

  575.   while(m<0x01)
  576.   {
  577.     FMQ=0;
  578. delay(3);
  579. m=0x03;
  580.   }
  581.   FMQ=1;
  582.    f++;
  583.   }

  584.   while(ws==0x45||ws==0x46)      // 退出
  585.   {
  586.   K1=0;
  587.   jm=0x70;
  588.   ws=0x00;
  589.   }
  590. }
  591. return;
  592. }
  593. //------------------------------------------JM2MB 秒表//
  594. void JM2MB()
  595. {
  596. uchar K2=1;          //定义变量K2
  597. uint bs,bf,bm;       //定义变量bs,bf,bm 时分秒
  598. uchar  i,j;         //定义变量i,j
  599. lcd_wcmd(0x01);       // 写清屏指令到LCD
  600. lcd_pos(0x00);      //设定LCD的显示位置0x00
  601. for(i=0;i<16;i++)     //把秒表的摸块显示出来  00:00:00
  602. {
  603. lcd_wdat(LCD2_0[i]);
  604. }
  605. while(K2)        //进入K2函数循环
  606. {
  607.     bs=0x1f&D1302(0x85);     //读当前时间时
  608. bf=0x7f&D1302(0x83);     //读当前时间分
  609. bm=0x7f&D1302(0x81);     //读当前时间秒
  610. delay(10);
  611.    while(ws==0x43)        //开始计时循环
  612.    {
  613.      j=0x7f&D1302(0x81);    //变量j赋值时间秒
  614.   i=j;
  615.   if(j<bm)       //判断j和bm那个大
  616.   {j=bm-j;
  617.    j=0x3c-j;
  618.   }
  619.    else{j-=bm;}
  620.   lcd_pos(0x0a);              //定位
  621.      delay(2);
  622.      lcd_wdat(LCD[j/0x0a]);        //显示秒的十位
  623.      delay(2);
  624.      lcd_wdat(LCD[j%0x0a]);     //显示秒的个位
  625.      delay(2);


  626.     delay(2);
  627. j=0x7f&D1302(0x83);      //变量j赋值时间分
  628. if(j<bf&&i<bm)
  629. {j=bf-j;
  630.   j=0x3c-j;
  631.   j-=0x01;
  632. }
  633.   else if(j<bf&&i>=bm)
  634.   {
  635.   j=bf-j;
  636.   j=0x3c-j;
  637.   }
  638.   else if(j>bf&&i<bm)
  639.   {
  640.    j-=bf;
  641.    j-=0x01;
  642.   }
  643.   else {j-=bf;}
  644. lcd_pos(0x07);          //定位
  645. delay(2);
  646.     lcd_wdat(LCD[j/0x0a]);        //显示十位分
  647.     delay(1);
  648.     lcd_wdat(LCD[j%0x0a]);           //显示分
  649.     delay(1);


  650. delay(2);
  651. i=0x7f&D1302(0x83);     //读当前时间分
  652. j=0x1f&D1302(0x85);     //读当前时间时
  653. if(j<bs&&i<bf)
  654. {j=bs-j;
  655.   j=0x3c-j;
  656.   j-=0x01;
  657. }
  658.   else if(j<bs&&i>=bf)
  659.   {
  660.   j=bs-j;
  661.   j=0x3c-j;
  662.   }
  663.   else if(j>bs&&i<bf)
  664.   {
  665.    j-=bs;
  666.    j-=0x01;
  667.   }
  668.   else {j-=bs;}
  669. lcd_pos(0x04);          //定位
  670. delay(2);
  671.     lcd_wdat(LCD[j/0x0a]);        //显示十位分
  672.     delay(1);
  673.     lcd_wdat(LCD[j%0x0a]);           //显示分
  674.     delay(1);

  675. }
  676.      switch(ws)
  677.   {
  678.    case 0x46:jm=0x70;ws=0x00;K2=0;break;   //主菜单
  679.    case 0x45:jm=0x70;ws=0x00;K2=0;break;   //退出
  680.    default:break;
  681.   }
  682. }
  683. return;
  684. }
  685. //--------------------------闹钟设置 ----//
  686. void JM3NZ()
  687. {
  688.    uchar K3;   //定义K3开关
  689.    bit K3x1=1,K3x2=0,K3x3=0,K3x4=0,K3x5=0,K3x6=0,K3x7=0;  //定义光标标志位
  690.    lcd_wcmd(0x01);  //清屏
  691. lcd_pos(0x00);      //设定显示的位置
  692. for(K3=0;K3<16;K3++)
  693. {
  694.    lcd_wdat(LCD3_0[K3]);    //显示摸
  695. }
  696. lcd_pos(0x06);         //设定LCD的显示位置
  697. lcd_wcmd(0x0f);    //写指令到LCD显示光标
  698. K3=1;

  699. while(K3)
  700. {
  701. while(K3x1)
  702. {
  703. lcd_pos(0x06);
  704.   switch(ws)      //十小时设定
  705.   {
  706.    case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x1=0;K3x2=1;break;    //按下0
  707.    case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x1=0;K3x2=1;break;    //按下1
  708.    case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x1=0;K3x2=1;break;     //按下2
  709.    case 0x0d:ws=0x00;K3x1=0;K3x2=1;break;     //下一个
  710.    case 0x40:ws=0x00;K3x1=0;K3x2=1;break;     //下一个
  711.    case 0x44:ws=0x00;K3x1=0;K3x7=1;break;     //上一个
  712.    case 0x19:ws=0x00;K3x1=0;K3x7=1;break;     //上一个
  713.    case 0x43:ws=0x00;K3x1=0;K3=0;break;        //确定
  714.    case 0x45:ws=0x00;K3x1=0;K3=0;break;        //退出
  715.    case 0x46:ws=0x00;K3x1=0;K3=0;break;     //主菜单
  716.    default:break;
  717.   }
  718.   }

  719. while(K3x2&&lcd_sz(0x06)==LCD[2])
  720. {
  721. lcd_pos(0x07);
  722.   switch(ws)      //个小时设定
  723.   {
  724.    case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x2=0;K3x4=1;break;    //按下0
  725.    case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x2=0;K3x4=1;break;    //按下1
  726.    case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x2=0;K3x4=1;break;     //按下2
  727.    case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x2=0;K3x4=1;break;     //按下3
  728.    case 0x0d:ws=0x00;K3x2=0;K3x4=1;break;     //下一个
  729.    case 0x40:ws=0x00;K3x2=0;K3x4=1;break;     //下一个
  730.    case 0x44:ws=0x00;K3x2=0;K3x1=1;break;     //上一个
  731.    case 0x19:ws=0x00;K3x2=0;K3x1=1;break;     //上一个
  732.    case 0x43:K3x2=0;K3=0;break;        //确定
  733.    case 0x45:ws=0x00;K3x2=0;K3=0;break;        //退出
  734.    case 0x46:ws=0x00;K3x2=0;K3=0;break;     //主菜单
  735.    default:break;
  736.   }
  737.   }



  738.   while(K3x2)
  739. {
  740. lcd_pos(0x07);
  741.   switch(ws)      //个小时设定
  742.   {
  743.    case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x2=0;K3x4=1;break;    //按下0
  744.    case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x2=0;K3x4=1;break;    //按下1
  745.    case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x2=0;K3x4=1;break;     //按下2
  746.    case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x2=0;K3x4=1;break;     //按下3
  747.    case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x2=0;K3x4=1;break;     //按下4
  748.    case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x2=0;K3x4=1;break;     //按下5
  749.    case 0x5a:ws=0x00;lcd_wdat(LCD[6]);K3x2=0;K3x4=1;break;     //按下6
  750.    case 0x42:ws=0x00;lcd_wdat(LCD[7]);K3x2=0;K3x4=1;break;     //按下7
  751.    case 0x52:ws=0x00;lcd_wdat(LCD[8]);K3x2=0;K3x4=1;break;     //按下8
  752.    case 0x4a:ws=0x00;lcd_wdat(LCD[9]);K3x2=0;K3x4=1;break;     //按下9
  753.    case 0x0d:ws=0x00;K3x2=0;K3x4=1;break;     //下一个
  754.    case 0x40:ws=0x00;K3x2=0;K3x4=1;break;     //下一个
  755.    case 0x19:ws=0x00;K3x2=0;K3x1=1;break;     //上一个
  756.    case 0x44:ws=0x00;K3x2=0;K3x1=1;break;     //上一个
  757.    case 0x43:K3x2=0;K3=0;break;        //确定
  758.    case 0x45:ws=0x00;K3x2=0;K3=0;break;        //退出
  759.    case 0x46:ws=0x00;K3x2=0;K3=0;break;     //主菜单
  760.    default:break;
  761.   }
  762.   }



  763.    while(K3x4)
  764. {
  765. lcd_pos(0x09);
  766.   switch(ws)      //十分设定
  767.   {
  768.    case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x4=0;K3x5=1;break;    //按下0
  769.    case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x4=0;K3x5=1;break;    //按下1
  770.    case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x4=0;K3x5=1;break;     //按下2
  771.    case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x4=0;K3x5=1;break;     //按下3
  772.    case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x4=0;K3x5=1;break;     //按下4
  773.    case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x4=0;K3x5=1;break;     //按下5
  774.    case 0x0d:ws=0x00;K3x4=0;K3x5=1;break;     //下一个
  775.    case 0x40:ws=0x00;K3x4=0;K3x5=1;break;     //下一个
  776.    case 0x19:ws=0x00;K3x4=0;K3x2=1;break;     //上一个
  777.    case 0x44:ws=0x00;K3x4=0;K3x2=1;break;     //上一个
  778.    case 0x43:K3x4=0;K3=0;break;        //确定
  779.    case 0x45:ws=0x00;K3x4=0;K3=0;break;        //退出
  780.    case 0x46:ws=0x00;K3x4=0;K3=0;break;     //主菜单
  781.    default:break;
  782.   }
  783.   }

  784. while(K3x5)
  785. {
  786. lcd_pos(0x0a);
  787.   switch(ws)      //个分设定
  788.   {
  789.    case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x5=0;K3x6=1;break;    //按下0
  790.    case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x5=0;K3x6=1;break;    //按下1
  791.    case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x5=0;K3x6=1;break;     //按下2
  792.    case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x5=0;K3x6=1;break;     //按下3
  793.    case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x5=0;K3x6=1;break;     //按下4
  794.    case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x5=0;K3x6=1;break;     //按下5
  795.    case 0x5a:ws=0x00;lcd_wdat(LCD[6]);K3x5=0;K3x6=1;break;     //按下6
  796.    case 0x42:ws=0x00;lcd_wdat(LCD[7]);K3x5=0;K3x6=1;break;     //按下7
  797.    case 0x52:ws=0x00;lcd_wdat(LCD[8]);K3x5=0;K3x6=1;break;     //按下8
  798.    case 0x4a:ws=0x00;lcd_wdat(LCD[9]);K3x5=0;K3x6=1;break;     //按下9
  799.    case 0x0d:ws=0x00;K3x5=0;K3x6=1;break;     //下一个
  800.    case 0x40:ws=0x00;K3x5=0;K3x6=1;break;     //下一个
  801.    case 0x19:ws=0x00;K3x5=0;K3x4=1;break;     //上一个
  802.    case 0x44:ws=0x00;K3x5=0;K3x4=1;break;     //上一个
  803.    case 0x43:K3x5=0;K3=0;break;        //确定
  804.    case 0x45:ws=0x00;K3x5=0;K3=0;break;        //退出
  805.    case 0x46:ws=0x00;K3x5=0;K3=0;break;     //主菜单
  806.    default:break;
  807.   }
  808.   }

  809.      while(K3x6)
  810. {
  811. lcd_pos(0x0c);
  812.   switch(ws)      //十秒设定
  813.   {
  814.    case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x6=0;K3x7=1;break;    //按下0
  815.    case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x6=0;K3x7=1;break;    //按下1
  816.    case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x6=0;K3x7=1;break;     //按下2
  817.    case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x6=0;K3x7=1;break;     //按下3
  818.    case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x6=0;K3x7=1;break;     //按下4
  819.    case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x6=0;K3x7=1;break;     //按下5
  820.    case 0x0d:ws=0x00;K3x6=0;K3x7=1;break;     //下一个
  821.    case 0x40:ws=0x00;K3x6=0;K3x7=1;break;     //下一个
  822.    case 0x19:ws=0x00;K3x6=0;K3x5=1;break;     //上一个
  823.    case 0x44:ws=0x00;K3x6=0;K3x5=1;break;     //上一个
  824.    case 0x43:K3x6=0;K3=0;break;        //确定
  825.    case 0x45:ws=0x00;K3x6=0;K3=0;break;        //退出
  826.    case 0x46:ws=0x00;K3x6=0;K3=0;break;     //主菜单
  827.    default:break;
  828.   }
  829.   }

  830. while(K3x7)
  831. {
  832. lcd_pos(0x0d);
  833.   switch(ws)      //个秒设定
  834.   {
  835.    case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x7=0;K3x1=1;break;    //按下0
  836.    case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x7=0;K3x1=1;break;    //按下1
  837.    case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x7=0;K3x1=1;break;     //按下2
  838.    case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x7=0;K3x1=1;break;     //按下3
  839.    case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x7=0;K3x1=1;break;     //按下4
  840.    case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x7=0;K3x1=1;break;     //按下5
  841.    case 0x5a:ws=0x00;lcd_wdat(LCD[6]);K3x7=0;K3x1=1;break;     //按下6
  842.    case 0x42:ws=0x00;lcd_wdat(LCD[7]);K3x7=0;K3x1=1;break;     //按下7
  843.    case 0x52:ws=0x00;lcd_wdat(LCD[8]);K3x7=0;K3x1=1;break;     //按下8
  844.    case 0x4a:ws=0x00;lcd_wdat(LCD[9]);K3x7=0;K3x1=1;break;     //按下9
  845.    case 0x0d:ws=0x00;K3x7=0;K3x1=1;break;     //下一个
  846.    case 0x40:ws=0x00;K3x7=0;K3x1=1;break;     //下一个
  847.    case 0x19:ws=0x00;K3x7=0;K3x6=1;break;     //上一个
  848.    case 0x44:ws=0x00;K3x7=0;K3x6=1;break;     //上一个
  849.    case 0x43:K3x7=0;K3=0;break;        //确定
  850.    case 0x45:ws=0x00;K3x7=0;K3=0;break;        //退出
  851.    case 0x46:ws=0x00;K3x7=0;K3=0;break;     //主菜单
  852.    default:break;
  853.   }
  854.   }


  855.   while(ws==0x43)     //按下确定键,保存闹钟时间
  856. {
  857. while(lcd_sz(0x06)==LCD[0]){ns=0x00;}
  858. while(lcd_sz(0x07)==LCD[1]){ns+=0x01;}
  859. }
  860. }
  861. jm=0x70;

  862. lcd_wcmd(0x0c);
  863. }
  864. //------------------------警戒设置-----//
  865. void JM4JJ()
  866. {
  867.    uchar K4;
  868.    lcd_wcmd(0x01);
  869. lcd_pos(0x00);
  870. for(K4=0;K4<16;K4++)
  871. {
  872.    lcd_wdat(LCD4_0[K4]);
  873. }
  874. while(1);
  875. }
  876. //--------------------------入侵信息---//
  877. void JM5XX()
  878. {
  879.    uchar K5;
  880.    lcd_wcmd(0x01);
  881. lcd_pos(0x00);
  882. for(K5=0;K5<16;K5++)
  883. {
  884.    lcd_wdat(LCD6_0[K5]);
  885. }
  886. delay(2);
  887. lcd_pos(0x40);
  888. for(K5=0;K5<16;K5++)
  889. {
  890.    lcd_wdat(LCD6_1[K5]);
  891. }
  892. while(1);
  893. }
  894. //------------------------------修改时间-----//
  895.   void JM6SJ()
  896. {
  897.    uchar K6;
  898.    lcd_wcmd(0x01);
  899. lcd_pos(0x00);
  900. for(K6=0;K6<16;K6++)
  901. {
  902.    lcd_wdat(LCD6_0[K6]);
  903. }
  904. delay(2);
  905. lcd_pos(0x40);
  906. for(K6=0;K6<16;K6++)
  907. {
  908.    lcd_wdat(LCD6_1[K6]);
  909. }
  910. K6=1;
  911. while(K6)
  912. {
  913.   ;
  914. }
  915. }                                                   
  916. //------------------------------主函数   //
  917.    void main()
  918.    {
  919.          uchar bl;
  920.     int_init();  //中断 初始化      
  921.           bl=D1302(0x81);
  922.     bl=0x7f&bl;
  923.     X1302(0x80,bl);
  924.     delay(1);
  925.    X1302(0x8e,0x00);
  926.             X1302(0x90,0xa5);
  927.             X1302(0x8e,0x80);   //关闭写,但可以读  
  928.              lcd_init();       //LCD初始化
  929.     delay(2);
  930.              lcd_pos(0x00);   //设定显示的位置
  931.              jm=0x10;
  932.              while(1)
  933.             {
  934.                 if(jm==0x70){JM7CD();}         
  935.                 else if(jm==0x10){JM1SJ();}   //时间  
  936.                 else if(jm==0x20){JM2MB();}   // 秒表
  937.     else if(jm==0x30){JM3NZ();}   // 闹钟
  938.     else if(jm==0x40){JM4JJ();}   // 警戒
  939.     else if(jm==0x50){JM5XX();}   // 信息
  940.     else if(jm==0x60){JM6SJ();}      //时间修改
  941.     else{;}
  942.    }
  943.     }
复制代码








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

使用道具 举报

沙发
ID:73711 发表于 2015-3-22 16:36 | 只看该作者
感谢分享   
回复

使用道具 举报

板凳
ID:73711 发表于 2015-3-22 16:38 | 只看该作者
有原理图 就完美了
回复

使用道具 举报

地板
ID:77205 发表于 2015-4-16 23:30 | 只看该作者
学习一下<><><><><><><><><><><><><><><><>
回复

使用道具 举报

5#
ID:59363 发表于 2015-4-17 17:06 | 只看该作者
1602太耗电了点,要是用段码液晶的应该省电点
回复

使用道具 举报

6#
ID:77776 发表于 2015-4-23 21:11 | 只看该作者
这么多代码,头都看晕了
回复

使用道具 举报

7#
ID:79493 发表于 2015-5-10 11:29 | 只看该作者
挺好的~
回复

使用道具 举报

8#
ID:79358 发表于 2015-5-24 15:05 | 只看该作者
楼主我有个问题,这个红外遥控器键值是怎么知道的,比如按某一个键显示第一个界面,这个按键是怎么定义的?
回复

使用道具 举报

9#
ID:78841 发表于 2015-5-28 14:14 | 只看该作者
代码应该还可以精简吧
回复

使用道具 举报

10#
ID:77776 发表于 2015-11-16 21:12 | 只看该作者
只有源程序,怎么没电路图了
回复

使用道具 举报

11#
ID:86796 发表于 2015-11-19 21:19 | 只看该作者
把资源打包吧?
回复

使用道具 举报

12#
ID:96682 发表于 2015-11-22 13:06 | 只看该作者
LZ 好有耐心哦,洞洞板都能焊接得如此工整。
回复

使用道具 举报

13#
ID:204292 发表于 2017-6-2 09:25 | 只看该作者
原理图有吗?
回复

使用道具 举报

14#
ID:35873 发表于 2017-6-18 02:32 | 只看该作者
谢谢分享  下载收藏了  
回复

使用道具 举报

15#
ID:511206 发表于 2019-4-13 14:42 来自手机 | 只看该作者
怎么收藏
回复

使用道具 举报

16#
ID:517951 发表于 2020-11-15 14:32 | 只看该作者
本坛有你更精彩,期待楼主更多力作
回复

使用道具 举报

17#
ID:846386 发表于 2020-12-2 23:20 | 只看该作者
能写这么多代码,值得学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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