樓主的程序:
- #include<reg51.h>
- #include<INTRINS.H>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key1=P1^0;
- sbit key2=P1^1;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit key5=P1^4;
- sbit key6=P1^5;
- sbit key7=P1^6;
- sbit key8=P1^7;
- sbit buzzer=P2^5; //蜂鳴器端口
- sbit lcd_RS = P2^0; //1602數據/命令選擇端(H:數據寄存器L:指令寄存器)
- sbit lcd_RW = P2^1; //1602讀/寫選擇端
- sbit lcd_E = P2^2;//1602使能信號端
- uchar time0[]="CLOCK 23:58";
- uchar mark1[]="2015-01-01";
- uchar mark2[]=" SET UP ";
- uchar code tab[]={'0','1','2','3','4','5','6','7','8','9'};//液晶顯示
- uchar code tab2[]={0x08,0x14,0x0A,0x15,0x0A,0x14,0x08,0x10}; //有鬧鈴聲響開關標示顯示
- uchar alarm_on; //鬧鈴聲響級
- uchar sound_on; //鬧鈴發聲標示
- uchar display_alarm; //顯示鬧鈴標示
- uchar num=0;
- uchar flag_clock,flag_alarm,flag_year; //時鐘/鬧鈴設置模式標示
- uchar second,minute,hour; //秒,分,時
- uint nian,yue,ri; //年月日
- uchar alarm_h,alarm_m; //鬧鈴的時,分
- uchar clock[11]; //時間
- uchar alarm[11]; //鬧鈴
- uint year[10]; //年月日
- void delay1(uint t)//短延時函數
- {
- while(t--);
- }
- void delay2(uint t) //長延時函數
- {
- uint x,y;
- for(x=t;x>0;x--)
- for(y=110;y>0;y--);
- }
- void WriteCommand(uchar com) //寫入指令
- {
- delay2(5);//操作前短暫延時,保證信號穩定
- lcd_E=0;
- lcd_RS=0;
- lcd_RW=0;
- P3=com;
- lcd_E=1;
- delay2(5);
- lcd_E=0;
- }
- void WriteData(uchar dat) //寫數據
- {
- delay2(5); //操作前短暫延時,保證信號穩定
- lcd_E=0;
- lcd_RS=1;
- lcd_RW=0;
- P3=dat;
- lcd_E=1;
- delay2(5);
- lcd_E=0;
- }
- void handle_time() //顯示時間
- {
- uchar i;
- clock[0]='C';
- clock[1]='L';
- clock[2]='O';
- clock[3]='C';
- clock[4]='K';
- clock[5]=0x20;//顯示為空
- clock[6]=tab[hour/10];
- clock[7]=tab[hour%10];
- clock[8]=0x3a; //顯示冒號
- clock[9]=tab[minute/10];
- clock[10]=tab[minute%10];
- WriteCommand(0x80+0x03);//光標指向第1行
- for(i=0;i<11;i++)// 顯示
- {
- WriteData(clock[i]);
- delay2(10);
- }
- }
- void handle_year() //顯示年月日
- {
- uchar i;
- year[0]=tab[nian/1000];
- year[1]=tab[(nian%1000)/100];
- year[2]=tab[((nian%1000)%100)/10];
- year[3]=tab[((nian%1000)%100)%10];
- year[4]='-';
- year[5]=tab[yue/10];
- year[6]=tab[yue%10];
- year[7]='-';
- year[8]=tab[ri/10];
- year[9]=tab[ri%10];
- WriteCommand(0x80+0x43); //第2行
- for(i=0;i<10;i++)
- {
- WriteData(year[i]);
- delay2(10);
- }
- }
- void InitLcd1602() //lcd1602初始化
- {
- uchar i;
- delay2(15);
- WriteCommand(0x38); //display mode
- WriteCommand(0x38); //display mode
- WriteCommand(0x38); //display mode
- WriteCommand(0x06); //顯示光標移動位置
- WriteCommand(0x0c); //顯示開及光標設置
- WriteCommand(0x01); //顯示清屏
- WriteCommand(0x80+0x03);//光標指向第一行
- for(i=0;i<11;i++)// 顯示
- {
- WriteData(time0[i]);
- delay2(10);
- }
- WriteCommand(0x80+0x43);//將光標移到第二行
- for(i=0;i<10;i++)// 顯示
- {
- WriteData(mark1[i]);
- delay2(10);
- }
- }
- void handle_alarm() //顯示鬧鐘
- {
- uchar i;
- alarm[0]='A';
- alarm[1]='L';
- alarm[2]='A';
- alarm[3]='R';
- alarm[4]='M';
- alarm[5]=0x20;//顯示為空
- alarm[6]=tab[alarm_h/10];
- alarm[7]=tab[alarm_h%10];
- alarm[8]=0x3a; //顯示冒號
- alarm[9]=tab[alarm_m/10];
- alarm[10]=tab[alarm_m%10];
- WriteCommand(0x80+0x03);//光標指向第1行第一個字符
- for(i=0;i<11;i++)// 顯示
- {
- WriteData(alarm[i]);
- delay2(10);
- }
- }
- void clock_set_up() //時鐘設置模式
- {
- while(flag_clock)
- {
- uchar i;
- WriteCommand(0x80+0x43);
- for(i=0;i<11;i++)// 顯示
- {
- WriteData(mark2[i]);
- delay2(10);
- }
- if(key1==0) //時++
- {
- delay2(5);//延時消抖
- if(key1==0)
- {
- hour++;
- if(hour==24)
- {
- hour=0;
- }
- }
- while(!key1);//松手檢測
- }
- if(key2==0)
- {
- delay2(5);//延時消抖
- if(key2==0)
- {
- if(hour!=0) //時減
- hour--;
- }
- while(!key2);//松手檢測
- }
- if(key3==0) //分++
- {
- delay2(5);
- if(key3==0)
- {
- minute++;
- if(minute==60)
- {
- minute=0;
- hour++;
- if(hour==24)
- {
- hour=0;
- }
- }
- }
- while(!key3);
- }
- if(key4==0) //分--
- {
- delay2(5);
- if(key4==0)
- {
- if(minute!=0)
- minute--;
- }
- while(!key4);
- }
- handle_time(); //顯示時間
- if(key7==0) //結束時鐘設置
- {
- delay2(5);//延時消抖
- while(!key7);//松手檢測
- flag_clock=0;
- }
- }
- }
- void alarm_set_up() //鬧鈴設置模式
- {
- while(flag_alarm)
- {
- uchar i;
- WriteCommand(0x80+0x43);
- for(i=0;i<11;i++)// 顯示
- {
- WriteData(mark2[i]);
- delay2(10);
- }
- if(key1==0) //時++
- {
- delay2(5);//延時消抖
- if(key1==0)
- {
- alarm_h++;
- if(alarm_h==24)
- {
- alarm_h=0;
- }
- }
- while(!key1);//松手檢測
- }
- if(key2==0) //時--
- {
- delay2(5);
- if(key2==0)
- {
- if(alarm_h!=0)
- alarm_h--;
- }
- while(!key2);
- }
- if(key3==0) //分++
- {
- delay2(5);//延時消抖
- if(key3==0)
- {
- alarm_m++;
- if(alarm_m==60)
- {
- alarm_m=0;
- alarm_h++;
- if(alarm_h==24)
- {
- alarm_h=0;
- }
- }
- }
- while(!key3);//松手檢測
- }
- if(key4==0) //分--
- {
- delay2(5);
- if(key4==0)
- {
- if(alarm_m!=0)
- alarm_m--;
- }
- while(!key4);
- }
- handle_alarm(); //顯示鬧鈴
- if(key7==0) //結束鬧鈴設置
- {
- delay2(5);//延時消抖
- while(!key7);//松手檢測
- flag_alarm=0;
- }
- }
- }
- void alarm_sound() //聲響
- {
- buzzer=0;
- delay2(50);
- buzzer=1;
- delay2(50);
- buzzer=0;
- delay2(50);
- buzzer=1;
- delay2(50);
- buzzer=0;
- delay2(50);
- }
- void year_set_up() //key4年月日設置
- {
- while(flag_year)
- {
- uchar i;
- WriteCommand(0x80+0x03);
- for(i=0;i<11;i++)// 顯示
- {
- WriteData(mark2[i]);
- delay2(10);
- }
- if(key1==0) //年+
- {
- delay2(5);
- if(key1==0)
- {
- nian++;
- }
- while(!key1);
- }
- if(key2==0) //年--
- {
- delay2(5);
- if(key2==0)
- {
- if(key2==0)
- nian--;
- }
- while(!key2);
- }
- if(key3==0) //月+
- {
- delay2(5);
- if(key3==0)
- {
- yue++;
- if(yue==13)
- yue=1;
- }
- while(!key3);
- }
- if(key4==0) //月--
- {
- delay2(5);
- if(key4==0)
- {
- yue--;
- if(yue==0)
- yue=1;
- }
- while(!key4);
- }
- if(key5==0) //日++
- {
- delay2(5);
- if(key5==0)
- {
- if(yue==2||yue==4||yue==6||yue==9||yue==11)
- {
- ri++;
- if(yue==2)
- {
- if(ri==29)
- {
- if((nian%4==0&&nian%100!=0)||(nian%400==0));//閏年
- else //平年
- ri=1;
- }
- if(ri==30)
- ri=1;
- }
- if(ri==31)
- ri=1;
- }
- else
- {
- ri++;
- if(ri==32)
- ri=1;
- }
- }
- while(!key5);
- }
- if(key6==0) //日—-
- {
- delay2(5);
- if(key6==0)
- {
- ri--;
- if(ri==0)
- ri=1;
- }
- while(!key6);
- }
- handle_year();
- if(key7==0)
- {
- delay2(5);
- if(key7==0)
- flag_year=0;
- while(!key7);
- }
- }
- }
- void key7_set_up() //K7開關鬧鈴
- {
- uchar i;
- alarm_on++;
- if(alarm_on==2)
- {
- alarm_on=0;
- }
- if(alarm_on==1)
- {
- sound_on=1;
- WriteCommand(0x40);//寫入自定義字符
- for(i=0;i<8;i++)
- {
- WriteData(tab2[i]);
- }
- WriteCommand(0x80+0x40);//顯示自定義字符
- WriteData(0x00);
- delay2(10);
- }
- if(alarm_on==0)
- {
- sound_on=0;
- buzzer=1;
- WriteCommand(0x80+0x40);//顯示鬧鈴標示為空
- WriteData(0x20);
- delay2(10);
- }
- }
-
- void main()
- {
- TMOD=0x10;
- IE=0x88;
- TH1=0x3c;
- TL1=0xb0;
- TR1=1;
- nian=2015;
- yue=1;
- ri=1;
- hour=23; //初始時間
- minute=58;
- second=0;
- display_alarm=0; //開機不顯示鬧鈴
- alarm_h=0; // 初始鬧鈴
- alarm_m=0;
- alarm_on=0;
- sound_on=1; //開機默認無聲響
- InitLcd1602();
- while(1)
- {
- uchar i;
- handle_year();
- handle_time();
- if(key1==0) //進入時鐘設置模式
- {
- delay2(5);//延時消抖
- while(!key1);//松手檢測
- flag_clock=1;
- clock_set_up();
- }
- if(key2==0) //設置鬧鈴模式
- {
- delay2(5);//延時消抖
- while(!key2);//松手檢測
- flag_alarm=1;
- alarm_set_up();
- }
- if(key3==0) //顯示鬧鈴,
- {
- delay2(5);//延時消抖
- while(!key3);//松手檢測
- display_alarm=1;
- while(display_alarm)
- {
- handle_alarm();
- if(key7==0)
- {
- delay2(5);
- if(key7==0)
- display_alarm=0;
- while(!key7);
- }
- }
- }
- if(key4==0) //設置年月日模式
- {
- delay2(5);
- while(!key4);
- flag_year=1;
- year_set_up();
- }
- if(key7==0) //鬧鈴開關啟
- {
- delay2(5);
- while(!key7);
- key7_set_up();
- }
- if((hour==alarm_h)&&(minute==alarm_m)) //鬧鈴時間是否到了
- {
- if(sound_on==1)
- {
- sound_on=0;
- alarm_sound();
- }
- }
- }
- }
- void ti_func() interrupt 3
- {
- TH1=0x3c;
- TL1=0xb0;
- if(num<20)
- {
- num=num+1;
- }
- if(num==20) //num為20時1S時間到
- {
- num=0;
- second=second+1;
- if(second==60) //1分鐘時間到
- {
- second=0;
- minute=minute+1;
- if(minute==60) //1小時時間到
- {
- minute=0;
- hour=hour+1;
- if(hour==24) // 24小時到
- {
- hour=0;
- ri++;
- if(yue==2||yue==4||yue==6||yue==9||yue==11)
- {
- if(yue==2)
- {
- if(ri==29)
- {
- if((nian%4==0&&nian%100!=0)||(nian%400==0));//閏年
- else
- {
- ri=1;
- yue++;
- }
- }
- if(ri==30)
- {
- ri=1;
- yue++;
- }
- }
- if(ri==31)
- {
- ri=1;
- yue++;
- }
- }
- else
- {
- if(ri==32)
- {
- ri=1;
- yue++;
- if(yue==13)
- {
- nian++;
- yue=1;
- }
- }
- }
- }
- }
- }
- }
- }
復制代碼 |