本文适用于
CT107D竞赛板+
IAP15转接板
按键
电路原理

2 3脚短接时,S4 S5 S6 S7用作独立按键;1 2脚短接时,用作4x4矩阵键盘。
需要说明的是,IAP15转接板中P36/WR和P37/RD分别被P42/WR P44/RD代替,编程中需要注意。
另外,P36 P37还被用于8255的WR RD,在个人练习中要防止冲突。P30 P31还被用作串口通信的TXD RXD,因此,在仿真过程中按下S7 S6等按键时,计算机与MCU之间无法实现通信,此时Keil会报错。
如果要实现串口通信或者使用仿真功能的话,尽量避免使用S7 S6按键,甚至是P30 P31
代码模板
独立按键
#include<reg52.h>
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit S7 = P3^0;
bit l1=1,l2=1,l3=1; //初始熄灭
void delay100us() //延时100us@12.000MHz
{
unsigned char i, j;
i = 2;
j = 39;
do
{
while (--j);
} while (--i);
}
void delay300ms() //延时300ms@12.000MHz
{
unsigned char i, j, k;
i = 14;
j = 174;
k = 224;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
bit scans4(){
if(S4==0){
delay100us();//消抖
if(S4==0){
return 1;
}
}
return 0;
}
bit scans5(){
if(S5==0){
delay100us();//消抖
if(S5==0){
return 1;
}
}
return 0;
}
bit scans6(){
if(S6==0){
delay100us();//消抖
if(S6==0){
return 1;
}
}
return 0;
}
bit scans7(){
if(S7==0){
delay100us();//消抖
if(S7==0){
return 1;
}
}
return 0;
}
int main(){
P3|=0x0f;
//初始化
while(1){
//按下S7点亮L1,按下S6熄灭L1
if(scans7())
l1=0;
if(scans6())
l1=1;
//按下S5时,L2亮,松开S5时,L2灭
if(scans5())
l2=0;
else
l2=1;
//按一次S4,L3亮,再按一次,L3灭
if(scans4()){
delay300ms();
l3=~l3;
}
//设置锁存器,控制LED灯
P2&=0x1f;
P0=0xff;L1=l1;L2=l2;L3=l3;
P2|=0x80;
P2&=0x1f;
}
}
矩阵键盘
#include <STC15F2K60S2.H>//使用P4时,注意修改头文件
#ifndef u8
#define u8 unsigned char
#endif
u8 code font[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 code y6=0xc0,y7=0xe0;
u8 dis[2],key;
void delay100us() //延时100us@12.000MHz
{
unsigned char i, j;
i = 2;
j = 39;
do
{
while (--j);
} while (--i);
}
u8 scankey(){
u8 key;
P42=0;P44=0;P3=0x0f;
if(P3!=0x0f){
delay100us();
if(P3!=0x0f){
key=P3;
P3=0xf0;P42=1;P44=1;
key|=P3;
if(P42==0) key&=0xbf;
if(P44==0) key&=0x7f;
switch(key){
//返回按键编号
case 0x77:return 4;
case 0x7b:return 5;
case 0x7d:return 6;
case 0x7e:return 7;
case 0xb7:return 8;
case 0xbb:return 9;
case 0xbd:return 10;
case 0xbe:return 11;
case 0xd7:return 12;
case 0xdb:return 13;
case 0xdd:return 14;
case 0xde:return 15;
case 0xe7:return 16;
case 0xeb:return 17;
case 0xed:return 18;
case 0xee:return 19;
}
}
}
return 0;
}
//数码管显示
void display(){
u8 i;
//显示按键编号
dis[0]=font[key/10];
dis[1]=font[key%10];
for(i=0;i<2;i++){
P2&=0x1f;
P0=1<<i;
P2|=y6;
P2&=0x1f;
P0=dis[i];
P2|=y7;
delay100us();
P0=0xff;
}
P2&=0x1f;
}
int main(){
while(1){
key=scankey();
display();
}
}
本文主要介绍了蓝桥杯单片机竞赛中的矩阵键盘使用,详细讲解了电路原理,提供了独立按键和矩阵键盘的代码模板。在电路中,某些引脚在不同配置下可作为独立按键或矩阵键盘使用。编程时需注意引脚替代,并避免在串口通信中使用特定按键,以防通信冲突导致Keil报错。
3809

被折叠的 条评论
为什么被折叠?



