單片機(jī)鍵盤的應(yīng)用
作業(yè)1:數(shù)碼管前三位數(shù)顯示一個(gè)跑表,從000到999,之間以百分之一秒的速度運(yùn)行,當(dāng)按下key1時(shí)跑表停止,再次按下時(shí)跑表開始
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula =P2^6;
sbit wela = P2^7;
sbit key1 = P3^7;
uchar aa,flag,bai,shi,ge,tt;
uint num,bb;
void init();
void keyscan();
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
main()
{
init();
P3 = 0xff;
while(1)
{
display(bai,shi,ge);
if(key1==0)//檢測是否按下
{
delay(10);
if(key1==0)//確實(shí)按下了
{
TR0 = 0;//定時(shí)器停止
bb ++;//計(jì)算按下的次數(shù)
while(!key1)
display(bai,shi,ge);
if(bb %2==0)
{
TH0 =(65536-50000)/256;//裝初值
TL0 =(65536-50000)%256;
TR0 = 1;//重啟定時(shí)器
}
}
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
TMOD = 0x01;
TH0 =(65536-50000)/256;
TL0 =(65536-50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void time0()interrupt 1
{
TH0 =(65536-50000)/256;
TL0 =(65536-50000)%256;
aa++;
if(aa==2)
{
aa = 0;
num ++;
if(num==1000)
num=0;
}
bai = num/100;
shi = num/10%10;
ge = num%10;
}
void display(uchar bai,uchar shi,uchar ge)
{
wela = 1;
P0 = 0xfe;
wela = 0;
P0 = 0x0;//消影操作
dula = 1;
P0 = table[bai];
dula = 0;
tt = 25;
while(tt--);
dula = 1;//關(guān)燈操作,高速度掃描時(shí)必備
P0 = 0;
dula = 0;
wela = 1 ;
P0 = 0xfd;
wela = 0;
P0= 0x0;//消影操作
dula = 1;
P0 = table[shi];
dula = 0;
tt = 25;
while(tt--);
dula = 1;//關(guān)燈操作,高速度掃描時(shí)必備
P0 = 0;
dula = 0;
wela = 1;
P0 = 0xfb;
wela = 0;
P0 = 0x0;//消影操作
dula = 1;
P0 = table[ge];
dula =0;
tt=25;
while(tt --);
dula = 1;//關(guān)燈操作,高速度掃描時(shí)必備
P0 = 0;
dula = 0;
}
在上題目的基礎(chǔ)上,用另外三個(gè)獨(dú)立鍵盤實(shí)現(xiàn)按下第一個(gè)時(shí)計(jì)數(shù)停止,按下第二個(gè)時(shí)計(jì)數(shù)開始,按下第三個(gè)時(shí)計(jì)數(shù)清零重新開始
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula =P2^6;
sbit wela = P2^7;
sbit key1 = P3^3;
sbit key2 = P3^4;
sbit key3 = P3^5;
sbit key4 = P3^6;
uchar aa,flag,bai,shi,ge,tt;
uint num,bb;
void init();
void keyscan();
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
main()
{
init();
P3 = 0xff;
while(1)
{
display(bai,shi,ge);
if(key1==0)//檢測是否按下
{
delay(10);
if(key1==0)//確實(shí)按下了
{
TR0 = 0;//定時(shí)器停止
while(!key1)
display(bai,shi,ge);
TR0 = 1;//重啟定時(shí)器
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
TR0 = 0;//定時(shí)器停止
while(!key2)
display(bai,shi,ge);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
TH0=(65536-50000)/256;
TL0 = (65536-50000)%256;
TR0 = 1;//重啟定時(shí)器
while(!key3)
display(bai,shi,ge);//不加入這句話有很大的bug
}
}
if(key4==0)
{
delay(10);
if(key4==0)
{
num = 0;//重新開始計(jì)數(shù)
while(!key4)
display(bai,shi,ge);
}
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
TMOD = 0x01;
TH0 =(65536-50000)/256;
TL0 =(65536-50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void time0()interrupt 1
{
TH0 =(65536-50000)/256;
TL0 =(65536-50000)%256;
aa++;
if(aa==2)
{
aa = 0;
num ++;
if(num==1000)
num=0;
}
bai = num/100;
shi = num/10%10;
ge = num%10;
}
void display(uchar bai,uchar shi,uchar ge)
{
wela = 1;
P0 = 0xfe;
wela = 0;
P0 = 0x0;//消影操作
dula = 1;
P0 = table[bai];
dula = 0;
tt = 25;
while(tt--);
dula = 1;//關(guān)燈操作,高速度掃描時(shí)必備
P0 = 0;
dula = 0;
wela = 1 ;
P0 = 0xfd;
wela = 0;
P0= 0x0;//消影操作
dula = 1;
P0 = table[shi];
dula = 0;
tt = 25;
while(tt--);
dula = 1;//關(guān)燈操作,高速度掃描時(shí)必備
P0 = 0;
dula = 0;
wela = 1;
P0 = 0xfb;
wela = 0;
P0 = 0x0;//消影操作
dula = 1;
P0 = table[ge];
dula =0;
tt=25;
while(tt --);
dula = 1;//關(guān)燈操作,高速度掃描時(shí)必備
P0 = 0;
dula = 0;
}
作業(yè)3:按下16個(gè)矩陣鍵盤依次在數(shù)碼管上顯示1到16的平方
#in