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