独立按键
**P3上电为高电平,只要检测P3口低四位哪一个为低电平,就可以检测哪一个独立按键被按下(使用独立按键需要将2,3脚接地,开发板上对应J5的BTN一端)
**
独立按键按下,数码管显示对应的数字
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
void delay_ms(int n);
void show(uint w,uint n);
uint key_scan();
sbit beer=P0^6;
uchar which[] = {
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar num[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
P2=0xA0;beer=0;P2 &= 0x1f;;//上电电位不稳,先关闭蜂鸣器
while(1)
{
show(1,key_scan());
}
}
//数码管显示函数 w为第几位亮,n为显示的数字
void show(uint w,uint n)
{
P2=(P2&0x1f)|0xc0;// 110 选择Y6C进行位选
P0=which[w-1];
P2=(P2&0x1f)|0xe0;// 111 选择Y7C进行段选
P0=num[n];
delay_ms(5);
P0 = 0xFF;
P2 &= 0x1f;
}
//检测独立按键按下,
uint key_scan()
{
uint key_value = 0;
if((P3&0x0F)!=0x0F)//当独立按键按下时,会使低三位有一个不是高电平
{
delay_ms(5); //延时消抖
if((P3&0x0F)!=0x0F)
{
switch(P3&0x0F)
{
case 0x0e:key_value = 7;break;
case 0x0d:key_value = 6;break;
case 0x0b:key_value = 5;break;
case 0x07:key_value = 4;break;
}
}
}
return key_value;
}
//延时函数
void delay_ms(int n)
{
int i,j;
for(i=n;i>0;i--)
for(j=110;j>0;j--);
}
矩阵键盘
矩阵键盘的判断,可以先将一行置为0,然后扫描每一列,以此类推进行扫描,就可以确定按键位置。
#include <STC15F2K60S2.H>
//IAP单片机与51的区别 P36被替换成了P42,P37替换成了P44
void selectHC573(unsigned choose);
void show(unsigned char num);
void keyscan();
unsigned char leddata[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82, 0xF8, 0x80, 0x90, //0-9
0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, }; //A-F 10-15
sbit beer=P0^6;
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C1=P3^4;
sbit C2=P3^5;
sbit C3=P4^2;
sbit C4=P4^4;
void main()
{
selectHC573(5);
beer=0;
P2&=0x1f;
while(1)
{
keyscan();
}
}
void selectHC573(unsigned choose)
{
switch(choose)
{
case 4:{
P2=P2&0x1f|0x80; break; } //Y4C——LED灯
case 5:{
P2=P2&0x1f|0xA0; break; } //Y5C——蜂鸣器 继电器 ULN2003芯片
case 6:{
P2=P2&0x1f|0xC0; break; } //Y6C——数码管位选
case 7:{
P2=P2&0x1f|0xE0; break; } //Y7C——数码管段选
}
}
void show(unsigned char num)
{
selectHC573(6);
P0=0x01;
selectHC573(7);
P0=leddata[num];
}
int keynum; //存放键值
void keyscan()
{
//先将第一行置0,再扫描每一列
R1=0;
R2=R3=R4=1;
C1=C2=C3=C4=1;
if(C4==0)
{
while(C4==0);
keynum=0;
show(keynum);
}
else if(C3==0)
{
while(C3==0);
keynum=1;
show(keynum);
}
else if(C2==0)
{
while(C2==0);
keynum=2;
show(keynum);
}
else if(C1==0)
{
while(C1==0);
keynum=3;
show(keynum);
}
//再将第二行置0,再扫描每一列
R2=0;
R1=R3=R4=1;
C1=C2=C3=C4=1;
if(C4==0)
{
while(C4==0);
keynum=4;
show(keynum);
}
else if(C3==0)
{
while(C3==0);
keynum=5;
show(keynum);
}
else if(C2==0)
{
while(C2==0);
keynum=6;
show(keynum);
}
else if(C1==0)
{
while(C1==0);
keynum=7;
show(keynum);
}
//然后将第三行置0,再扫描每一列
R3=0;
R1=R2=R4=1;
C1=C2=C3=C4=1;
if(C4==0)
{
while(C4==0);
keynum=8;
show(keynum);
}
else if(C3==0)
{
while(C3==0);
keynum=9;
show(keynum);
}
else if(C2==0)
{
while(C2==0);
keynum=10;
show(keynum);
}
else if(C1==0)
{
while(C1==0);
keynum=11;
show(keynum);
}
R4=0;
R1=R2=R3=1;
C1=C2=C3=C4=1;
if(C4==0)
{
while(C4==0);
keynum=12;
show(keynum);
}
else if(C3==0)
{
while(C3==0);
keynum=13;
show(keynum);
}
else if(C2==0)
{
while(C2==0);
keynum=14;
show(keynum);
}
else if(C1==0)
{
while(C1==0);
keynum=15;
show(keynum);
}
}