-
实验目的及其要求
通过proteus仿真软件将原理图连接成教材所用tx-1c实验板的矩阵键盘分布并实现如下功能:
(1)共计16个矩阵键盘,其中前10个按键依次实现按下后在前三位数码管动态显示000至009的数字;
(2)第十一个按键实现按下后加1的功能;
(3)第十二个按键实现按下后减1的功能;
(4)第十三个按键实现清零的功能;
(5)第十四个按键按下后开启定时器T1并实现每1s钟使数码管加1显示的功能,显示范围为000至255之间;
(6)第十五个按键按下后定时器暂停工作
(7)第十六个按键不设置功能;
-
实验原理图
-
实验代码
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar numt0,key,n;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delayms(uint xms){
uint i,j;
for(i=xms;i>0;i--){
for(j=110;j>0;j--);
}
}
void display(uchar numdis){
uchar bai,shi,ge;
bai=numdis/100;
shi=numdis%100/10;
ge=numdis%10;
P0=0x00;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe; //位选数据
wela=0;
delayms(5);
P0=0x00;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
P0=0x00;
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(5);
}
void init(){
TMOD=0x11; //设置定时器1为工作方式1(0000 0001)
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1; //开总中断
ET1=1; //开启定时器0中断
TR1=0;
}
void matrixkeyscan(){
uchar temp;
P3=0xfe; // 1111 1110 P3.0 按行检测
temp=P3;
temp=temp&0xf0; // 1111 0000
if(temp!=0xf0){
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
temp=P3;
switch(temp){
case 0xee: //1110 1110
key=0;
break;
case 0xde: //1101 1110
key=1;
break;
case 0xbe: //1011 1110
key=2;
break;
case 0x7e: //0111 1110
key=3;
break;
}
while(temp!=0xf0){
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
/*第二行检测S4 S5 S6 S7 开始*/
P3=0xfd; // 1111 1101 P3.0 按行检测
temp=P3;
temp=temp&0xf0; // 1111 0000
if(temp!=0xf0){
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
temp=P3;
switch(temp){
case 0xed: //1110 1101
key=4;
break;
case 0xdd: //1101 1101
key=5;
break;
case 0xbd: //1011 1101
key=6;
break;
case 0x7d: //0111 1101
key=7;
break;
}
while(temp!=0xf0){
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
/*第二行检测S4 S5 S6 S7 结束*/
/*第三行检测S8 S9 S10 S11 开始*/
P3=0xfb; // 1111 1011 P3.0 按行检测
temp=P3;
temp=temp&0xf0; // 1111 0000
if(temp!=0xf0){
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
temp=P3;
switch(temp){
case 0xeb: //1110 1011
key=8;
break;
case 0xdb: //1101 1011
key=9;
break;
case 0xbb: //1011 1011
key++;
break;
case 0x7b: //0111 1011
key--;
break;
}
while(temp!=0xf0){
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
/*第三行检测S8 S9 S10 S11 结束*/
/*第四行检测S12 S13 S14 S15 开始*/
P3=0xf7; // 1111 0111 P3.0 按行检测
temp=P3;
temp=temp&0xf0; // 1111 0000
if(temp!=0xf0){
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
temp=P3;
switch(temp){
case 0xe7: //1110 0111
key=0;
break;
case 0xd7: //1101 0111
if(!TR1){
TR1=~TR1;
}
break;
case 0xb7: //1011 0111
if(TR1){
TR1=~TR1;
}
break;
case 0x77: //0111 0111
key=15;
break;
}
while(temp!=0xf0){
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
/*第四行检测S12 S13 S14 S15 结束*/
}
void main(){
init();
while(1){
matrixkeyscan(); //调用键盘矩阵函数
display(key);
}
}
void T0_time() interrupt 3{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
numt0++;
if(numt0==20){
numt0=0;
key++;
if(key==256){
key=0;
}
}
}
-
验截图
(依次按第3、10、11、12、13、14、15按键得到的截图)