题目要求:
设计一个4*4矩阵键盘(S4-S19),双数码管显示,其键值对应为“00~15”。按下按键后,数码管显示相应的键值。
/*数码管显示相应的键值,00-15*/
#include <STC15F2K60S2.H>
#include"intrins.h"
#define uchar unsigned char
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管
uchar code key_table[]={0x81,0x41,0x21,0x11,0x82,0x42,0x22,0x12,0x84,0x44,0x24,0x14,0x88,0x48,0x28,0x18};//矩阵键值,这里要注意,和普通的行列扫描得到的数组不一样
uchar cont ,Trg,n,i,num;
void init()//消影,关蜂鸣器
{
P2=0xa0;P0=0x00;P2=0x00;
P2=0x80;P0=0xff;P2=0x00;
}
void Delay2ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
}
void readkey()
{
uchar ReadData,keypress;
P3=0xf0;
P42=1; P44=1;
P36=P42;P37=P44;//行置低,列置高,读取列数
keypress=P3;//暂存列数
P3=0x0f;
P42=0; P44=0;//行置高,列置低,读取行数
//和独立键盘类似的读取
ReadData=(P3|keypress)^0xff;
Trg=ReadData&(ReadData^cont);
cont=ReadData;
}
void display(uchar n)
{
P2=0xc0;P0=0x40;P2=0x00;//选位,十位
P2=0xe0;P0=table[n/10];P2=0x00;
Delay2ms();
P2=0xc0;P0=0x80;P2=0x00;//选位,个位
P2=0xe0;P0=table[n%10];P2=0x00;
Delay2ms();
}
void main()
{
init();
while(1)
{
readkey();
for(i=0;i<16;i++)//循环判断键值对应的数字
{
if(Trg==key_table[i])//和独立键盘不同的是不能用&,只能用==判断
{
num=i;
break;
}
}
display(num);
}
}
矩阵按键经常用到,使用前,要在断电的情况下换跳帽。这里需要特别注意,STC15F2K60S2,的引脚和c51的不同,15系列有P4口,首先要添加对应的文件。
下面看看矩阵键盘的引脚图
行列扫描时,要特殊处理P42和P44
void readkey()
{
uchar ReadData,keypress;
P3=0xf0;
P42=1; P44=1;
P36=P42;P37=P44;//行置低,列置高,读取列数
keypress=P3;//暂存列数
P3=0x0f;
P42=0; P44=0;//行置高,列置低,读取行数
//和独立键盘类似的读取
ReadData=(P3|keypress)^0xff;
Trg=ReadData&(ReadData^cont);
cont=ReadData;
}
此外,对应的键值数组要改变