事情總是看著簡單,做起來沒那么容易。
這個程序我開始時是根據(jù)教程編的,有些地方不理解就匆匆略過……事實證明這是不可取的……
寫了百十來行以后編譯,報錯!就不會解決了。
這時才體會到基礎(chǔ)是多么重要!!!
學(xué)習(xí)方法要科學(xué),要知其然,更要知其所以然。
就像羅哥說的,從原理入手……
感謝 劉鵬 百忙之中抽出時間指導(dǎo),真是我的良師和益友。。。。。。。
*****************************************************
把程序貼出來。大家學(xué)習(xí)學(xué)習(xí)。千萬不要ctrl c,ctrl v。
全部代碼下載地址:http://m.raoushi.com/f/ssz.rar
********************************************
我已經(jīng)加了部分注釋……
*************************************************************
P1口接4*4矩陣鍵盤
P2口作為數(shù)碼管的片選控制端
P0口送給數(shù)碼管數(shù)據(jù)
1:實現(xiàn)時分秒的顯示
2:通過S1調(diào)節(jié)秒,S2調(diào)節(jié)分鐘,S3調(diào)節(jié)小時,S4退出調(diào)節(jié)模式。
3:按鍵松手有效
*************************************************************
矩陣鍵盤的掃描
定時器的應(yīng)用
*****************************************
c語言函數(shù)調(diào)用
形參
實參
******************************************************************
#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};//共陰數(shù)碼管字模
uchar code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//P2口位選8個數(shù)碼管
uchar key_code[] =
{0xb7,0xbb,0xbd,0xbe};
uchar key;
uchar hour,min,sec;
uchar k;
void delay(uchar z) //延時函數(shù)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void display() //顯示函數(shù)
{
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];//送數(shù)據(jù),十位
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); //返回?zé)o效碼
}
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) //調(diào)整時間
{
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();//函數(shù)調(diào)用,初始化
while(1)
{
a=keyscan();
contral(a);
display();
}
}
