|
- #include<reg52.h>
- #define uchar unsigned char//宏定義
- #define uint unsigned int//宏定義
- sbit dula=P2^6;//控制數(shù)碼管
- sbit wela=P2^7;
- sbit rs=P3^5;//控制液晶數(shù)據(jù)名命令選擇
- sbit lcden=P3^4;//液晶寫(xiě)數(shù)據(jù)控制
- sbit s1=P3^0;//控制矩陣鍵盤(pán)的S9
- sbit s2=P3^1;//控制矩陣鍵盤(pán)的S13
- sbit s3=P3^2;//控制矩陣鍵盤(pán)的S17
- sbit rd=P3^7;//申明RD的位
- uchar count,date,shi,fen,miao,s1num;
- uchar code table[]=" 2017-10-17 MON";//初始化顯示日期
- uchar code table1[]=" 19:28:20";//初始化顯示時(shí)間
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)//寫(xiě)指令函數(shù)
- {
- rs=0;//數(shù)據(jù)置低
- lcden=0;//lcden拉低
- P0=com;
- delay(5);
- lcden=1;//拉高
- delay(5);//穩(wěn)定五毫秒
- lcden=0;//拉低
-
- }
- void write_date(uchar date)//寫(xiě)指數(shù)據(jù)函數(shù)
- {
- rs=1;//數(shù)據(jù)置高
- lcden=0;//lcden拉低
- P0=date;
- delay(5);
- lcden=1;//拉高
- delay(5);//穩(wěn)定五毫秒
- lcden=0;//拉低
-
- }
- void init()
- {
- uchar num;
- dula=0;//關(guān)閉數(shù)碼管
- wela=0;
- lcden=0;//通過(guò)1602的資料顯示lcden初始為低
- /* 一定注意這里的賦值與程序開(kāi)頭的自定義賦值,當(dāng)二者賦值一致的時(shí)候才會(huì)正常走動(dòng),不也一樣時(shí)就會(huì)出現(xiàn)錯(cuò)誤,原因未知*/
- fen=28;
- miao=20;
- shi=19;
- /***************************************************/
- write_com(0x38);//設(shè)置16X2顯示,5X7點(diǎn)陣,8位數(shù)據(jù)接口
- delay(5);
- write_com(0x0c);//00001100開(kāi)顯示,不顯示光標(biāo)
- write_com(0x06);//00000110,讀入一個(gè)字符后指針和光標(biāo)都加一,整屏不移動(dòng)
- write_com(0x01);//清零,不清零會(huì)顯示出錯(cuò)
- write_com(0x80);//指針賦值,寫(xiě)入地址,表示從第一行開(kāi)始寫(xiě)
- for(num=0;num<15;num++)//第一行共需要15個(gè)顯示位,顯示位數(shù)一定要一一對(duì)應(yīng)
- {
- write_date(table[num]);//寫(xiě)數(shù)據(jù)進(jìn)去
- delay(5);
- }
- write_com(0x80+0x40);//寫(xiě)入第二行的地址
- for(num=0;num<12;num++)//第二行共需要11個(gè)顯示位,顯示位數(shù)一定要一一對(duì)應(yīng),
- {
- write_date(table1[num]);//寫(xiě)數(shù)據(jù)進(jìn)去
- delay(5);
- }
- TMOD=0x01;//采用定時(shí)器0的方式1
- TH0=(65536-50000)/256;//裝初值
- TL0=(65536-50000)%256;
- EA=1;//開(kāi)總中斷
- ET0=1;//打開(kāi)T0中斷
- TR0=1;//啟動(dòng)定時(shí)器0
-
-
- }
- void write_sfm(uchar add,uchar date)//寫(xiě)動(dòng)態(tài)數(shù)據(jù)到時(shí)分秒表中
- {
- uchar shi,ge;//時(shí)、分、秒、都由兩個(gè)數(shù)字表示,分離開(kāi)
- shi=date/10;//分離出數(shù)據(jù)的十位
- ge=date%10;//分離個(gè)位
- write_com(0x80+0x40+add); //寫(xiě)動(dòng)態(tài)到第二行中
- write_date(0x30+shi);//通過(guò)1602的字符手冊(cè),讓十位顯示0(0x30),送數(shù)據(jù)到第二行
- write_date(0x30+ge);//通過(guò)1602的字符手冊(cè),讓個(gè)位顯示0(0x30),送數(shù)據(jù)到第二行
-
- }
- void keyscan()//編寫(xiě)按鍵控制時(shí)鐘函數(shù)
- {//5
- rd=0;//讓RD接地,要控制那一列就讓那一列接地,通過(guò)矩陣鍵盤(pán)原理圖判斷
- if(s1==0)//檢測(cè)s1是否按下
- {//4
- s1num++;//每按下一次s1就加一
- delay(5);//延時(shí)消抖
- if(s1==0)//判斷s1確實(shí)被按下
- {
-
- while(!s1);//檢測(cè)是否松手
- if(s1num==1)//按下第一次讓秒閃爍
- {
- TR0=0;//關(guān)閉定時(shí)器,禁止時(shí)鐘繼續(xù)走動(dòng)
- write_com(0x80+0x40+11);//控制第二行的第幾位
- write_com(0x0f);//顯示光標(biāo),并讓光標(biāo)閃爍,0x0f來(lái)源于1602的原理圖
- }
- if(s1num==2)//按下第二次讓分閃爍
- {
- TR0=0;//關(guān)閉定時(shí)器,禁止時(shí)鐘繼續(xù)走動(dòng)
- write_com(0x80+0x40+8);//控制第二行的第幾位
- write_com(0x0f);//顯示光標(biāo),并讓光標(biāo)閃爍,0x0f來(lái)源于1602的原理圖
- }
- if(s1num==3)//按下第三次讓時(shí)閃爍
- {
- TR0=0;//關(guān)閉定時(shí)器,禁止時(shí)鐘繼續(xù)走動(dòng)
- write_com(0x80+0x40+5);//控制第二行的第幾位
- write_com(0x0f);//顯示光標(biāo),并讓光標(biāo)閃爍,0x0f來(lái)源于1602的原理圖
- }
- if(s1num==4)//第四次按下,清零,讓光標(biāo)不閃爍
- {
- s1num=0;//清零
- write_com(0x0c);//光標(biāo)停止閃爍
- TR0=1;//開(kāi)啟定時(shí)器,時(shí)鐘重新開(kāi)始走動(dòng)
- }
- }
-
- }//4
-
- if(s1num!=0)//確認(rèn)s1鍵被按下
- {//3
- if(s2==0)//檢測(cè)s2被按下
- {//2
- delay(5);
- if(s2==0)//確定s2被按下
- {//1
- while(!s2);
- if(s1num==1)//確定讓秒加一
- {
- miao++;
- if(miao==60)
- miao=0;
- write_sfm(10,miao);
- write_com(0x80+0x40+10);
-
- }
- if(s1num==2)//確定讓分加一
- {
- fen++;
- if(fen==60)
- fen=0;
- write_sfm(7,fen);
- write_com(0x80+0x40+7);
-
- }
- if(s1num==3)//確定讓時(shí)加一
- {
- shi++;
- if(shi==24)
- shi=0;
- write_sfm(4,shi);
- write_com(0x80+0x40+4);
-
- }
- }//1
-
- }//2
- if(s3==0)//檢測(cè)s3被按下
- {//2
- delay(5);
- if(s3==0)//確定s2被按下
- {//1
- while(!s3);
- if(s1num==1)//確定讓秒加一
- {
- miao--;
- if(miao==0)
- miao=60;
- write_sfm(10,miao);
- write_com(0x80+0x40+10);
-
- }
- if(s1num==2)//確定讓分加一
- {
- fen++;
- if(fen==0)
- fen=60;
- write_sfm(7,fen);
- write_com(0x80+0x40+7);
-
- }
- if(s1num==3)//確定讓時(shí)加一
- {
- shi++;
- if(shi==0)
- shi=24;
- write_sfm(4,shi);
- write_com(0x80+0x40+4);
-
- }
- }//1
-
- }//2
- } //3
-
- }//5
- void main()
- {
- init();
-
- while(1)
- {
- keyscan();
- if(count==20)//判斷是否到了1秒
- {
- count=0;
- miao++;
- if(miao==60)//判斷是否到了一分鐘
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
-
- }
- write_sfm(4,shi);
- }
- write_sfm(7,fen);
- }
- write_sfm(10,miao);//10表示table1[]中的秒位正好在第十個(gè)字符位后面
- }
- }
-
- }
- void timer0() interrupt 1//選擇中斷源
- {
- TH0=(65536-50000)/256;//裝初值
- TL0=(65536-50000)%256;
- count++;
- }
復(fù)制代碼 |
|