事情總是看著簡單,做起來沒那么容易。
這個程序我開始時是根據教程編的,有些地方不理解就匆匆略過……事實證明這是不可取的……
寫了百十來行以后編譯,報錯!就不會解決了。
這時才體會到基礎是多么重要!!!
學習方法要科學,要知其然,更要知其所以然。
就像羅哥說的,從原理入手……
感謝 劉鵬 百忙之中抽出時間指導,真是我的良師和益友。。。。。。。
*****************************************************
把程序貼出來。大家學習學習。千萬不要ctrl c,ctrl v。
全部代碼下載地址:http://www.zg4o1577.cn/f/ssz.rar
********************************************
我已經加了部分注釋……
*************************************************************
P1口接4*4矩陣鍵盤
P2口作為數碼管的片選控制端
P0口送給數碼管數據
1:實現時分秒的顯示
2:通過S1調節秒,S2調節分鐘,S3調節小時,S4退出調節模式。
3:按鍵松手有效
*************************************************************
矩陣鍵盤的掃描
定時器的應用
*****************************************
c語言函數調用
形參
實參
******************************************************************
#include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共陰數碼管字模 uchar code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//P2口位選8個數碼管 uchar key_code[] = {0xb7,0xbb,0xbd,0xbe}; uchar key; uchar hour,min,sec; uchar k; void delay(uchar z) //延時函數 { uchar x,y; for(x=z;x>0;x--) for(y=100;y>0;y--); } void display() //顯示函數 { if(k==20)//定時器定時50ms,20次就是1秒 { k=0; sec++; } if(sec>59) { sec=0; min++; } if(min>59) { min=0; hour++; } if(hour>23) { hour=0; } P2=table2[5]; //片選 P0=table1[hour/10];//送數據,十位 delay(10); P2=table2[4]; //片選 P0=table1[hour%10];//個位 delay(10); P2=table2[3]; P0=table1[min/10]; delay(10); P2=table2[2]; P0=table1[min%10]; delay(10); P2=table2[1]; P0=table1[sec/10]; delay(10); P2=table2[0]; P0=table1[sec%10]; delay(10); } unsigned char keyscan()//鍵盤掃描程序 { unsigned char scan1, scan2, keycode, j; P1 = 0xf0; scan1 = P1; if (scan1 != 0xf0) //判鍵是否按下 { delay(10); //延時10ms scan1 = P1; if (scan1 != 0xf0) //二次判鍵是否按下 { TR0=0; P1 = 0x0f; scan2 = P1; keycode = scan1 | scan2; //組合成鍵掃描編碼 for (j = 0; j < 4; j++) { if (keycode == key_code[j]) //查表得鍵值 { key = j; while(P1!= 0x0f) display(); return (key); //返回有效鍵值 } } } } else P1 = 0xff; return (key = 4); //返回無效碼 } void system_Ini() //定時器初始化 { TMOD= 0x01; TH0=(65535-50000)/256; TL0=(65535-50000)%256; ET0 = 1; TR0 = 1; EA=1; } void timer0 () interrupt 1 //中斷程序 { TH0=(65535-50000)/256; TL0=(65535-50000)%256; k++; } void contral(uchar key) //調整時間 { if(key==0||key==1||key==2) { if(key==0) { sec++; if(sec>59) { sec=0; } } else if(key==1) { min++; if(min>59) { min=0; } } else if(key==2) { hour++; if(hour>23) { hour=0; } } } else if(key==3) { TR0=1; } } void main() { uchar a; system_Ini();//函數調用,初始化 while(1) { a=keyscan(); contral(a); display(); } }