📄 4×4keys.c
字号:
/*********************************************************************
Copyright (C), 2008, 湖南理工学院物理与电子信息系
项目名称:
文件名 :4×4keys.c
创建人 :童耀南 版 本:0.2 日 期:2008.12.24
功能描述:4×4矩阵键盘扫描显示程序
*********************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define keyIO P2//键盘接在P2口
sbit datain=P0^3;//移位寄存器输入接P0^3,输出接数码管
sbit clk=P0^2;//移位寄存器时钟接P0^2
uchar keyboardscan(void);
void display(uchar);
void delay(uint);
//***************************************
//主程序
//***************************************
main()
{
unsigned char key;
keyIO=0xf0;
while(1)
{
key = keyboardscan();//键盘扫描,看是否有按键按下
if(key!=0xff)//如果有按键按下,则显示该按键键值0~15
{
display(key);
LOOP: keyIO=0xf0;
if((keyIO&0xf0)!=0xf0)
goto LOOP;
}
}
}
//*******************************************
// 键盘检测程序,行列反转法
//*******************************************
uchar keyboardscan(void)
{
uchar temp1,temp2,num;
keyIO=0xf0; //P2口赋初值
if((keyIO&0xf0)!=0xf0)
//如果P2口电平不等于0xf0表示有按键按下
{
delay(10); //延时10毫秒后再判断
//此步为软件防抖
if((keyIO&0xf0)!=0xf0)//再一次确定是有按键按下
{
keyIO=0xf0;//所以列线全输出1,行线全输出0
temp1=keyIO&0xf0;//检测列号
keyIO=0x0f;//所以列线全输出0,列线全输出1
temp2=keyIO&0x0f;//检测行号
temp2=temp1|temp2;
switch(temp2)
{ // 下面是键盘的编码识别//返回对应的键值0~15
case 0x77: num=0; break;
case 0x7b: num=1; break;
case 0x7d: num=2; break;
case 0x7e: num=3; break;
case 0xb7: num=4; break;
case 0xbb: num=5; break;
case 0xbd: num=6; break;
case 0xbe: num=7; break;
case 0xd7: num=8; break;
case 0xdb: num=9; break;
case 0xdd: num=10; break;
case 0xde: num=11; break;
case 0xe7: num=12; break;
case 0xeb: num=13; break;
case 0xed: num=14; break;
case 0xee: num=15; break;
default: break;
}
return(num);
}
return(0xff); //非正常按键,返回0xff
}
return(0xff); //如果没有按键按下,则返回0xff
}
//*******************************************
//显示函数
//*******************************************
void display(uchar num)//显示数字0~9 + a~f
{ char Data[]={0xB7,0x90,0x3D,0xB9,//0~3
0x9A,0xAB,0xAF,0xB0,//4~7
0xBF,0xBB,0xBA,0x8F,//8~b
0x27,0x9D,0x2F,0x2E};//c~f
unsigned char j,temp;
temp=Data[num];
for(j=0;j<8;j++)
{
datain=temp&0x80;
clk=0;
clk=1;
temp=temp<<1;
}
}
//*******************************************
// 延时函数
//*******************************************
void delay(uint time)
{
uint i,j;
for(i=time;i>0;i--)
for(j=114;j>0;j--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -