给你改了一下试试。
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- unsigned int cnt_num;
- sbit rs=P2^0;
- sbit rw=P2^1;
- sbit ep=P2^2;
- sbit led=P2^5;
- sbit k1=P3^0;
- sbit k2=P3^1;
- sbit k3=P3^2;
- sbit k4=P3^3;
- sbit bz=P2^3;
- sbit power=P2^4;
- uchar shi,fen,miao,a,b,c,d,e,f,teep,ling;
- uchar code table[]={"0123456789:"};
- void disp_later(uchar x,uchar y,uchar *p,uchar n); //<-------
- void delay(uchar z) //延时函数
- {
- uchar x,y;
- for(x=10;x>0;x--)
- for(y=z;y>0;y--);
- }
- lcd_bz()
- { // 测试LCD忙碌状态
- uint result;
- rs = 0;
- rw = 1;
- ep = 1;
- delay(1);
- result = P0 & 0x80;
- ep = 0;
- return result;
- }
- void lcd_cmd(uchar cmd)
- { // 写入指令数据到LCD
- while(lcd_bz());
- rs = 0;
- rw = 0;
- ep = 0;
- delay(1);
- P0 = cmd;
- delay(1);
- ep = 1;
- delay(1);
- ep = 0;
- }
- void lcd_dat(uchar dat)
- { //写入字符显示数据到LCD
- while(lcd_bz());
- rs = 1;
- rw = 0;
- ep = 0;
- P0 = dat;
- delay(1);
- ep = 1;
- delay(1);
- ep = 0;
- }
- void disp_time(uchar x,uchar y,uchar h,uchar m,uchar s)
- {
- if(0 == y) x |= 0x80; //当要显示第一行时地址码+0x80;
- else x |= 0xC0; //在第二行显示是地址码+0xC0;
- lcd_cmd(x); //发送地址码
- lcd_dat(table[h/10]); //小时
- lcd_dat(table[h%10]);
- lcd_dat(table[10]);
- lcd_dat(table[m/10]); //分
- lcd_dat(table[m%10]);
- lcd_dat(table[10]);
- lcd_dat(table[s/10]); //秒
- lcd_dat(table[s%10]);
- }
- void lcd_init()
- { //LCD初始化设定
- lcd_cmd(0x38); //
- delay(1);
- lcd_cmd(0x0c); //
- delay(1);
- lcd_cmd(0x06); //
- delay(1);
- lcd_cmd(0x01); //清除LCD的显示内容
- delay(1);
- while(1)
- {
- if(teep==0) //每秒变化一次
- {
- disp_time(6,1,shi,fen,miao);
- }
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- }
- }
- if(k1==0) //设置现在时间
- {
- EA=0;
- lcd_cmd(0x01); //清屏
- disp_later(0,0,"K2:H K3:M K4:O",14);
- disp_later(0,1,"TIME:",5);
- disp_time(6,1,shi,fen,miao);
- while(1)
- {
- while(k2==0)
- {
- delay(1);
- if(k2==1)
- {
- shi++;
- if(shi==24) shi=0;
- disp_time(6,1,shi,fen,miao);
- }
- }
- while(k3==0)
- {
- delay(1);
- if(k3==1)
- {
- fen++;
- if(fen==60) fen=0;
- disp_time(6,1,shi,fen,miao);
- }
- }
- if(k2==0)
- {
- lcd_cmd(0x01);
- disp_later(0,0,"start:",6); //显示:开始时间
- disp_time(6,0,a,b,c);
- disp_later(0,1,"delay:",6); //显示:持续时间
- disp_time(6,1,d,e,f);
- delay(10);
- while(k2==1)
- {
- while(k1==0)
- {
- delay(10);
- if(k1==1)
- {
- a++;
- if(a==24) a=0;
- disp_time(6,0,a,b,c);
- }
- }
- while(k2==0)
- {
- delay(10);
- if(k2==1)
- {
- b++;
- if(b==60) b=0;
- disp_time(6,0,a,b,c);
- }
- }
- while(k3==0)
- {
- delay(10);
- if(k3==1)
- {
- d=d+1;
- if(d==60)
- {
- d=0;
- c++;
- if(c==24)
- c=0;
- }
- disp_time(6,1,c,d,e);
- }
- }
- if(k4==0)
- {
- ling=1;
- disp_later(0,0,"1-SET 2-AL 3-SAL",16);
- disp_later(0,1,"TIME:",5);
- disp_time(6,1,shi,fen,miao);
- break;
- }
- }
- }
- if(k3==0) //显示闹铃时间
- {
- lcd_cmd(0x01);
- disp_later(0,0,"start:",6); //显示:开始时间
- disp_time(6,0,a,b,c);
- disp_later(0,1,"delay:",6); //显示:持续时间
- disp_time(6,1,c,d,e);
- delay(10000);
- lcd_cmd(0x01); //清屏
- disp_later(0,0,"1-SET 2-AL 3-SAL",14);
- disp_later(0,1,"TIME:",5);
- disp_time(6,1,shi,fen,miao);
- }
- if(ling==1)
- { if(shi==a)
- {
- if(fen==b)
- {
- power=0; //开电源
- led=1;
- }
- }
- if(shi==a+c)
- {
- if(fen==b+d)
- {
- power=1; //关电源
- led=0;
- bz =0 ;
- delay(1000);
- bz =1 ;
- lcd_cmd(0x01); //清屏
- disp_later(0,0,"1-SET 2-AL 3-SAL",16);
- disp_later(0,1,"TIME:",5);
- disp_time(6,1,shi,fen,miao);
- ling=0;
- }
- }
- }
- }
- }
- } //<-----
- } //<-----
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- teep++;
- led=0;
- if(teep==20)
- {
- teep=0;
- miao++; //秒加一
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- }
- }
- }
- }
复制代码 |