|
電路圖比較簡單,是一個(gè)51最小系統(tǒng),沒有采用總線方式,而簡單的連線方式,上有4*4矩陣鍵盤,一數(shù)碼管,89S51單片機(jī),串口下載線,數(shù)碼管顯示鎖存芯片\蜂鳴器\1602液晶. 因?yàn)樽罱荚囂?剛剛考試完又課程設(shè)計(jì),桌子上太混亂,原理圖沒有找到.所以就先貼上代碼. 此代碼已經(jīng)調(diào)試成功過,可以實(shí)現(xiàn)時(shí)間的調(diào)整.4*4矩陣鍵盤,第一排前三列是實(shí)現(xiàn)小時(shí)\分鐘\秒的加.第二排前三列是實(shí)現(xiàn)小時(shí)\分鐘\秒的減.當(dāng)然還可以通過設(shè)置矩陣鍵盤的鍵值,來實(shí)現(xiàn)加\減\乘\除四則運(yùn)算,由數(shù)碼管顯示參與運(yùn)算的數(shù)字以及最終的運(yùn)算結(jié)果.其他的不多說了,等下次我把圖貼上,大家勉強(qiáng)可以拿去研究下.其實(shí)硬件很簡單,不詳細(xì)說問題也不大的. #include<reg51.h> #include<stdio.h> #include<stdlib.h> #include<intrins.h> #include<absacc.h> #define uchar unsigned char #define uint unsigned int uchar temp1; void displayListChar(unsigned char X, unsigned char Y, uchar DData); uchar dispbuf[]={'0','1','2','3','4','5','6','7','8','9',':'}; uchar second; uchar minute; uchar hour; uint tcnt,g; uchar flag; void dlms(void); uchar kbscan(void); void Show_Time(void); void delay5ms(void); void dlms(void); void Settime(uchar verify);//verify 在這里為調(diào)整的意思 void delay400ms(void) ; ///#define busy 0x80 file://用/于檢測(cè)LCD狀態(tài)字中的Busy標(biāo)識(shí) ///#define RSaddr 0x1000 ///#define RWaddr 0x2000 ///#define CSaddr 0x0400 #define wc 0x8fff #define wd 0xdfff #define rc 0xbfff void waitLcd() //just wait until 液晶不忙為止 { char temp; bit flag=1; while(flag==1) { temp=XBYTE[rc]; if (temp>>7==0) flag=0; P1=temp; } P1=0xff; } //just wait until 液晶不忙為止 void WriteCommand_Lcd(bit isCheck,char c) { if (isCheck==1) waitLcd(); XBYTE[wc]=c; } void writedata(char c) { waitLcd(); XBYTE[wd]=c; } void LcdInit() { delay5ms(); delay5ms(); delay5ms(); WriteCommand_Lcd(0,0x38); //三次顯示模式設(shè)置,不檢測(cè)忙信號(hào) delay5ms(); WriteCommand_Lcd(0,0x38); delay5ms(); WriteCommand_Lcd(0,0x38); delay5ms(); WriteCommand_Lcd(1,0x38); //顯示模式設(shè)置,開始要求每次檢測(cè)忙信號(hào),8位2行5*7 WriteCommand_Lcd(1,0x08); //關(guān)閉顯示 WriteCommand_Lcd(1,0x01); //清顯示 WriteCommand_Lcd(1,0x06); // 文字不動(dòng),光標(biāo)右移 WriteCommand_Lcd(1,0x0C); // 顯示開及光標(biāo)設(shè)置 } void displayListChar(unsigned char X, unsigned char Y, uchar DData) { Y &= 0x1; X &= 0xF; if (X <= 0xF) { Y &= 0x1; X &= 0xF; if (Y) X |= 0x40; X |= 0x80; WriteCommand_Lcd(0,X); writedata(dispbuf[DData]); } }
void Show_Time(unit k) { displayListChar(0,0,hour/10); displayListChar(1,0,hour%10); displayListChar(2,0,10); displayListChar(3,0,minute/10); displayListChar(4,0,minute%10); displayListChar(5,0,10); displayListChar(6,0,second/10); displayListChar(7,0,second%10); switch(k) { case 1: displayListChar(0,1,1); case 2: displayListChar(0,1,2); case 3: displayListChar(0,1,3); case 4: displayListChar(0,1,4); case 5: displayListChar(0,1,5); case 6: displayListChar(0,1,6); case 7: displayListChar(0,1,7); case 8: displayListChar(0,1,8); case 9: displayListChar(0,1,9); case 10:displayListChar(0,1,10); case 11:displayListChar(0,1,11); case 12:displayListChar(0,1,12); case 13:displayListChar(0,1,13); case 14:displayListChar(0,1,14); case 15:displayListChar(0,1,15); case 16:displayListChar(0,1,16); } void Settime(uchar verify) { //鍵盤設(shè)置 // 1 /hour+ (0xee) 2/minute+ 0xde 3/second+ 0xbe + // 4/hour- 0xed 5/ minute- 0xdd 6/second- 0xbd - // 7 8 9 * // 0 CLR = / ////hour+的代碼 if(flag) { if (verify==0xee) { dlms(); if (verify==0xee) { hour++; if(hour==24) { hour=0; } //while(verify==0xee); verify=0x00; } // 1 /hour+ (0xee) 2/minute+ 0xde 3/second+ 0xbe } ///minute +的代碼 else if (verify==0xde) { dlms(); if (verify==0xde) { minute++; if(minute==60) { minute=0; } //while(verify==0xde); verify=0x00; } // 1 /hour+ (0xee) 2/minute+ 0xde 3/second+ 0xbe } //////second++的代碼 else if (verify==0xbe) { dlms(); if (verify==0xbe) { second++; if(second==60) { second=0; } // while(verify==0xbe); verify=0x00; } // 1 /hour+ (0xee) 2/minute+ 0xde 3/second+ 0xbe }
//////hour- (0xed) 的代碼 else if (verify==0xed) { dlms(); if (verify==0xed) { if(hour==0) {hour=24; } hour--; // if(hour==0) // { // hour=23; //} //while(verify==0xed); verify=0x00; } } // 4/hour- 0xed 5/ minute- 0xdd 6/second- 0xbd ///下面為minute -的代碼 else if (verify==0xdd) { dlms(); if (verify==0xdd) { if(minute==0) {minute=60;} minute--; //if(minute==0) //{ // minute=59; //} //while(verify==0xdd); verify=0x00; } } // 4/hour- 0xed 5/ minute- 0xdd 6/second- 0xbd ///下面為second -的代碼 else if (verify==0xbd) { dlms(); if (verify==0xbd) { if(second==0) {second=60;} second--; //if(second==0) //{ // second=59; //} // while(verify==0xbd); verify=0x00; } // 4/hour- 0xed 5/ minute- 0xdd 6/second- 0xbd } } } void main(void) { TMOD=0x02; //置自動(dòng)重裝載模式 TH0=0x06; //設(shè)初值 TL0=0x06; //設(shè)初值 TR0=1; //開始計(jì)數(shù) ET0=1; //開定時(shí)器/計(jì)數(shù)器 EA=1; //中斷開 delay400ms();//啟動(dòng)等待,等LCM講入工作狀態(tài) LcdInit(); //LCM初始化 while(1) { uchar key; key=kbscan(); dlms(); Show_Time(); // if ((key==0xee)||(key==0xbe)||(key==0xde)||(key==0xed)||(key==0xdd)||(key==0xbd)) if (key!=0) { if (key==0x7e) { dlms(); if (key==0x7e) { EA=0; flag=1; } //while(verify==0xee); key=0x00; } if (key==0x7d) { dlms(); if (key==0x7d) { EA=1; flag=0; } //while(verify==0xee); key=0x00; } Settime( key ); delay400ms(); }
} } void delay5ms(void) { unsigned int TempCya = 277; while(--TempCya); } //延時(shí)400ms void delay400ms(void) { unsigned int TempCya = 22160; while(--TempCya); } //延時(shí)400ms
void timer0(void) interrupt 1 using 1 { tcnt++; if(tcnt==2000) { tcnt=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) { hour=0; }
} } } }
//鍵盤掃描 uchar kbscan(void) { uchar sccode; P1=0xf0; if( (P1&0xf0)!=0xf0 ) { dlms(); if((P1&0xf0)!=0xf0) { sccode=0xfe; while ((sccode&0x10)!=0) { P1=sccode; if ((P1&0xf0)!=0xf0) { temp1=P1; return temp1; } else { sccode=(sccode<<1)|0x01; } } } } return (0); } void dlms(void) { g=554; while(g--); //延時(shí)10mS鐘 } |