仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (197.75 KB, 下載次數: 49)
下載附件
2022-6-9 02:33 上傳
51hei截圖20220608221804.jpg (99.53 KB, 下載次數: 46)
下載附件
2022-6-8 22:18 上傳
單片機源程序如下:
//4*4鍵盤檢測程序,按下鍵后相應的代碼顯示在數碼管上
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char i=100;
unsigned char j,k,temp,key,t,time=30,mode=1;
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void init()
{
TMOD=0x01;
TH0=0x3C;
TL0=0x80;
ET0=1;
TR0=0;
EA=1;
}
void sound()
{
beep=0;
delay(150);
beep=1;
delay(20);
}
void data_tim()
{
if(t==20)
{
t=0;
time--;
if(time==0)
{
TR0=0;
mode=1;
sound();
}
}
}
void display(uchar q_c,uchar bai_c,uchar sh_c,uchar g_c) //顯示程序
{
P0=table[q_c]; //顯示編號
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[bai_c]; //顯示百位
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
dula=0;
P0=table[sh_c]; //顯示十位
dula=1;
dula=0;
wela=0;
P0=0xef;
wela=1;
wela=0;
delay(5);
P0=table[g_c]; //顯示個位
dula=1;
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(5);
}
void keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
//key=0;
TR0=~TR0;
mode=0;
break;
case 0xde:
mode=0;
key=0;
time=30;
break;
case 0xbe:
//key=2;
time+=1;
break;
case 0x7e:
//key=3;
time-=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
// display(key);
// P0=table[key];
/* P0=0xff;
dula=1;
while(i--);
dula=0;
P0=0xc0;
wela=1;
wela=0;
dula=0;
wela=0;
P0=0xff;
dula=1;
dula=0;
P0=0xc5;
wela=1;
wela=0; */
P1=0xfe;
}
}
if(mode==0)
{
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=1;
TR0=0;
mode=1;
break;
case 0xdd:
key=2;
TR0=0;
mode=1;
break;
case 0xbd:
key=3;
TR0=0;
mode=1;
break;
case 0x7d:
key=4;
TR0=0;
mode=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
//beep=0;
}
beep=1;
// display(key);
/* P0=table[key];
dula=1;
// while(100--);
dula=0;
P0=0xc0;
wela=1;
wela=0;
*/ P1=0xfc;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=5;
mode=1;
TR0=0;
break;
case 0xdb:
key=6;
TR0=0;
mode=1;
break;
case 0xbb:
key=7;
TR0=0;
mode=1;
break;
case 0x7b:
key=8;
TR0=0;
mode=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
//beep=0;
}
beep=1;
// display(key);
/* P0=table[key];
dula=1;
// while(100--);
dula=0;
P0=0xc0;
wela=1;
wela=0;
*/ P1=0xf8;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
//beep=0;
}
beep=1;
// display(key);
/* P0=table[key];
dula=1;
// while(100--);
dula=0;
P0=0xc0;
wela=1;
wela=0;
*/ P1=0xf0;
}
}
}
}
void main()
{
dula=0;
wela=0;
init();
while(1)
{
keyscan();
data_tim();
display(key,time/100,time%100/10,time%10);
}
}
void Timer0() interrupt 1
{
t++;
TH0=0x3C;
TL0=0x80;
}
Keil代碼與Proteus8.8仿真下載:
八路搶答器.7z
(277.74 KB, 下載次數: 37)
2022-6-9 02:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|