基于LCD1602的萬年歷,帶鬧鐘
單片機源程序如下:
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit lcd_rs=P2^6; //rs為寄存器選擇 高電平時選擇數(shù)據(jù)寄存器,低電平選擇指令寄存器
- sbit lcd_rw=P2^5; //R/W 為讀寫信號線,高電平時進行讀操作,低電平進行寫操作
- //當 RS 和 R/W 共同為低電平時,可以寫入指令或顯示地址
- sbit lcd_en=P2^7; //液晶控制端
- sbit key_set=P1^4;//設置鍵
- sbit key_up=P1^5; //加鍵同時也是鬧鐘能夠停止按鈕
- sbit key_down=P1^6; // 減鍵同時也是翻屏按鈕
- sbit key_out=P1^7; //鍵 盤控制端口
- uchar count; //定時器計數(shù)變量
- uchar hour,min,sec,hour1,hour2,sec1,sec2,min1,min2; //時間變量
- uchar yue, ri,nian1, nian2, nian3, nian4, yue1, yue2, ri1, ri2; //月日變量
- uint nian; // 年變量
- uchar nao1=0, nao2=0, nao3=0, nao11, nao12, nao21, nao22; //設置鬧鐘變量
- uchar count1; // 星期計數(shù)變量
- uchar ww=0,qq=0,nao=1,flag; //計數(shù)變量鍵盤設置端口,鬧鐘時間是否設置標志量,鬧鐘標志變量,設置鍵標志量
- uchar code table[]={
- 0x00,0x04,0x0E,0x0E,0x0E,0x0E,0x1F,0x1F,
- 0x04,0x08,0x00,0x1E,0x00,0x08,0x04,0x00
- };//設置鬧鐘圖片
- void lcd_delay(uint m) //延時函數(shù) (字符型變量m定義)
- {
- while(m--); //無限循環(huán)體
- }
- void read1602() //忙檢測 作用防止亂碼
- {
- uchar i;
- i=254;
- P0=0xff; //
- lcd_rs=0; //讀寫命令
- lcd_rw=1; //讀命令/數(shù)據(jù)
- lcd_en=1; //液晶模塊執(zhí)行命令
- while(i--);//若一段時間以后仍低,則認為是不忙
- lcd_en=0;
- }
- void write1602(uchar wdata,bit rw)//向LCD1602寫數(shù)據(jù)(rw=1)或者命令(rw=0)
- {
- read1602(); //防止數(shù)據(jù)丟失
- lcd_rs=rw;
- P0=wdata;
- lcd_rw=0;
- lcd_delay(1);
- lcd_en=1;
- lcd_delay(1);
- lcd_en=0;
- }
- void lcd_init() //LCD1602液晶的初始化
- {
-
- lcd_delay(1500);
-
- write1602(0x38,0); //置功能,8位數(shù)據(jù),2行顯示,5x7字符(指令6)
-
- write1602(0x0c,0); //只打開屏顯 (指令4)
-
- write1602(0x06,0); //左到右顯示,自加1 (指令3)
-
- write1602(0x01,0); //清屏 (指令1)
-
- write1602(0x80,0); //(指令8)
- }
- void init() //定時器初始化
- {
- count=0;
- hour=23; //小時初值
- min=59; //分鐘初值
- sec=50; //秒初值
- nian=2018; //年初值
- yue=01; //月初值
- ri=01; //日初值
- count1=1;//星期初值
- TMOD=0x01; //中斷T0工作方式,方式1,16位定時器
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; //計數(shù)器初值,為50ms進入一次中斷子程序
- TR0=1; //允許T0計數(shù)
- ET0=1; //定時器T0溢出中斷允許
- EA=1; //開中斷
- }
- void lcd_printf(uchar *str)//顯示字符串
- { read1602();
- while(*str!='\0')
- {
- write1602(*str,1); //寫入數(shù)據(jù)
- str++;
- lcd_delay(1);
- }
- }
- void lcd_moveto(uchar x,uchar y)//指定顯示的行列坐標
- {
- if(x==0)
- write1602(0x80|y,0);
- if(x==1)
- write1602(0xc0|y,0);
- }
- void fengjie1(uchar a,uchar b, uchar c )//將時分秒兩位數(shù)分解為兩個數(shù)
- {
- hour1=a/10;
- hour2=a%10;
- min1=b/10;
- min2=b%10;
- sec1=c/10;
- sec2=c%10;
- }
- void fengjie2(uint a,uchar b, uchar c ) //將年月日分解為兩個數(shù)
- {
- nian4=a%10;
- a=(a-nian4)/10;
- nian3=a%10;
- a=(a-nian3)/10;
- nian2=a%10;
- nian1=a/10;
- yue1=b/10;
- yue2=b%10;
- ri1=c/10;
- ri2=c%10;
- }
- void fengjie3(uchar a, uchar b )//將鬧鐘分解為兩個數(shù)
- {
- nao11=a/10;
- nao12=a%10;
- nao21=b/10;
- nao22=b%10;
- }
- void display1(uchar hour1,uchar hour2,uchar min1,uchar min2,uchar sec1,uchar sec2) //顯示時間程序
- {
-
- lcd_moveto(1,0); //定位在第二行第一列
- write1602(hour1+48,1); //字符0-9對應十進制48-57
- write1602(hour2+48,1);
- lcd_printf(":");
- write1602(min1+48,1);
- write1602(min2+48,1);
- lcd_printf(":");
- write1602(sec1+48,1);
- write1602(sec2+48,1);
- }
- void display2(uchar nian1,uchar nian2,uchar nian3,uchar nian4,uchar yue1,uchar yue2, uchar ri1, uchar ri2 ) //顯示日期程序
- {
- lcd_moveto(0,0); //定位在第一行第一列
- write1602(nian1+48,1);
- write1602(nian2+48,1);
- write1602(nian3+48,1);
- write1602(nian4+48,1);
- lcd_printf("-");
- write1602(yue1+48,1);
- write1602(yue2+48,1);
- lcd_printf("-");
- write1602(ri1+48,1);
- write1602(ri2+48,1);
- }
- void display3(uchar we) //星期送顯示
- {
- lcd_moveto(0,12);
- switch(we)
- {
- case 1: lcd_printf("M");
- lcd_printf("0");
- lcd_printf("N");
- break;
- case 2: lcd_printf("T");
- lcd_printf("U");
- lcd_printf("E");
- break;
- case 3: lcd_printf("W");
- lcd_printf("E");
- lcd_printf("D");
- break;
- case 4: lcd_printf("T");
- lcd_printf("H");
- lcd_printf("U");
- break;
- case 5: lcd_printf("F");
- lcd_printf("R");
- lcd_printf("T");
- break;
- case 6: lcd_printf("S");
- lcd_printf("A");
- lcd_printf("T");
- break;
- case 7: lcd_printf("S");
- lcd_printf("U");
- lcd_printf("N");
- break;
- }
- }
- void display4(uchar nao11,uchar nao12,uchar nao21, uchar nao22) //顯示鬧鐘時刻
- {
- lcd_moveto(1,6); //定位在第二行第6列
- if(nao==1) //打開鬧鐘
- {write1602(nao11+48,1);//顯示鬧鐘時間
- write1602(nao12+48,1);
- lcd_printf(":");
- write1602(nao21+48,1);
- write1602(nao22+48,1);
- }
- if(nao==0) //關閉鬧鐘
- {lcd_printf("N");
- lcd_printf("O");
- lcd_printf(":");
- lcd_printf("N");
- lcd_printf("O");
- }
- }
- void display5() //顯示鬧鐘圖片
- {
- lcd_moveto(1,13);
- if(nao==1)//如果鬧鐘打開顯示鬧鐘圖片
- {
- write1602(0x00,1); //
- write1602(0x01,1); //?
- }
- if(nao==0)
- {
- lcd_printf(" ");
- lcd_printf(" ");
- }
- }
- void zimo() //字模顯示
- {
- uint i;
- write1602(0x40,0); //寫圖片的指令
- for(i=0;i<16;i++)
- {
- write1602(table[i],1);
- }
- }
- void key() //鍵盤程序
- {
- if(key_set==0)
- {
- flag=1;
- ww++;
- if(ww==8)
- ww=0;
- while(!key_set);
- }
- switch(ww)
- {
- case 0: // 清零
- if(key_up==0)
- {
- while(!key_up);
- if(qq==1)
- {
- qq=0;
- }
- else
- {
- nao=!nao; //開關鬧鐘的作用
- } }
- break;
- case 1: //鍵盤調整年
- lcd_delay(1000);
- lcd_moveto(0,3);
- lcd_printf("-");
- lcd_delay(1000);
- if(key_up==0)
- {
- while(!key_up); //按鍵是否抬起
- nian++;
- }
- if(key_down==0)
- {
- while(!key_down);
- nian--;
- }
- break;
-
- case 2: //鍵盤調整月
- lcd_delay(1000);
- lcd_moveto(0,6);
- lcd_printf("-");
- lcd_delay(1000);
- if(key_up==0)
- {
- while(!key_up);
- yue++;
- if(yue>12)
- yue=1;
- }
- if(key_down==0)
- {
- while(!key_down);
- if(yue==1)
- yue=12;
- else
- yue--;
- }
- break;
- case 3: //鍵盤調節(jié)日期
- lcd_delay(1000);
- lcd_moveto(0,9);
- lcd_printf("-");
- lcd_delay(1000);
- if(key_up==0)
- {
- while(!key_up);
- ri++;
- if(ri>31)
- ri=1;
- }
- if(key_down==0)
- {
- while(!key_down);
- if(ri==1)
- ri=31;
- else
- ri--;
- }
- break;
- case 4: //鍵盤調整星期
- lcd_delay(1000);
- lcd_moveto(0,12);
- lcd_printf("-");
- lcd_printf("-");
- lcd_printf("-");
- lcd_delay(1000);
- if(key_up==0)
- {
- while(!key_up);
- count1++;
- if(count1>7)
- count1=1;
- }
- if(key_down==0)
- {
- while(!key_down);
- if(count1==1)
- count1=7;
- else
- count1--;
- }
- break;
- case 5: //鍵盤調整時
- lcd_delay(1000);
- lcd_moveto(1,1);
- lcd_printf("-");
- lcd_delay(1000);
- if(key_up==0)
- {
- while(!key_up);
- hour++;
- if( hour>23)
- hour=0;
- }
- if(key_down==0)
- {
- while(!key_down);
- if( hour==0)
- hour=23;
- else
- hour--;
- }
- break;
- case 6: //鍵盤調整分
- lcd_delay(1000);
- lcd_moveto(1,4);
- lcd_printf("-");
- lcd_delay(1000);
- if(key_up==0)
- {
- while(!key_up);
- min++;
- if( min>59)
- min=0;
- }
- if(key_down==0)
- {
- while(!key_down);
- if( min==0)
- min=59;
- else
- min--;
- }
- break;
- case 7: //鍵盤調整秒
- lcd_delay(1000);
- lcd_moveto(1,7);
- lcd_printf("-");
- lcd_delay(1000);
- if(key_up==0)
- {
- while(!key_up);
- sec++;
- if( sec>59)
- sec=0;
- }
- if(key_down==0)
- {
- while(!key_down);
- if(sec==0)
- sec=59;
- else
- sec--;
- }
- break;
- }
- if(key_out==0)
- {
- while(!key_out);
- flag=0;
- ww=0;
- }
- }
- void key1() // 調整鬧鐘時間
- {
- if(key_set==0)
- {
- flag=1;
- ww++;
- if(ww==3)
- ww=0;
- while(!key_set);
- }
- switch(ww)
- {
- case 0: //退出設置
- if(key_up==0)
- {
- while(!key_up);
- nao=!nao; //如果鬧鐘開按下后則關,反之同理
- }
- if(key_down==0)
- {
- while(!key_down);
- qq=0; //
- }
- break;
- case 1: // 調試鬧鐘的時
- lcd_delay(1000);
- lcd_moveto(1,7);
- lcd_printf("-");
- lcd_delay(1000);
-
- if(nao==1)
- {if(key_up==0)
- {
- while(!key_up);
- nao1++;
- if( nao1>23)
- nao1=0;
- }
- if(key_down==0)
- {
- while(!key_down);
- if( nao1==0)
- nao1=23;
- else
- nao1--;
- }
- break;
- }
- else break;
- case 2: // 調試鬧鐘的分
- lcd_delay(1000);
- lcd_moveto(1,10);
- lcd_printf("-");
- lcd_delay(1000);
- if(nao==1)
- {if(key_up==0)
- {
- while(!key_up);
- nao2++;
- if( nao2>59)
- nao2=0;
- }
- if(key_down==0)
- {
- while(!key_down);
- if( nao2==0)
- nao2=59;
- else
- nao2--;
- }
- break;
- }
- else break;
-
- default:break;
- }
- if(key_out==0)
- {
- while(!key_out);
- flag=0;
- ww=0;
- }
- }
- void count0(void) interrupt 1 //中斷函數(shù),進行時期的累加 12m晶振
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count++;
- if(count==20) //計時到達一秒
- {
- count=0;
- sec++;
- if(sec==60) //計時到達一分
- {
- sec=0;
- min++;
- if(min==60) //計時到達一小時
- {
- min=0;
- hour++;
- if(hour==24) //計時到達一天
- {
- hour=0;
- ri++;
- count1++;
- if(count1==8) //計時到達一周
- {
- count1=1;
- }
- if(yue==1|yue==3|yue==5|yue==7|yue==8|yue==10|yue==12)
- {
- if(ri>31) //計時到達一個月31天
- {
- ri=1;
- yue++;
- if(yue>12) //計時到達一年
- {
- yue=1;
- nian++;
- }
- }
- }
- if(yue==4|yue==6|yue==9|yue==11)
- {
- if(ri>30) //計時到達一個月30天
- {
- ri=1;
- yue++;
- if(yue>12) //計時到達一年
- {
- yue=1;
- nian++;
- }
- }
- }
- if(yue==2)
- {
- if(nian%4==0)
- {
- if(ri>29)//計時到達一個月29天
- {
- ri=1;
- yue++;
- if(yue>12)
- {
- yue=1;
- nian++;
- }
- }
- }
- else
- {
- if(ri>28) //計時到達一個月28天
- {
- ri=1;
- yue++;
- if(yue>12)
- {
- yue=1;
- nian++;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- void linsheng() //鬧鐘發(fā)生器
- { if(nao==1)
- {if(hour==nao1&min==nao2&sec==nao3)//滿足時間?
- qq=1;//是否設置鬧鐘時間
- if(qq==1)
- {
- key_out=0;
- lcd_delay(10000);
- key_out=1;
- lcd_delay(1000);
- }
- }
- }
- void main()
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
新建文件夾.rar
(47.06 KB, 下載次數(shù): 44)
2018-1-26 12:34 上傳
點擊文件名下載附件
基于LCD1602的萬年歷
|