📄 kbscan.c
字号:
/**************************************************************************
Description:线翻转法键盘扫描程序,只检测和处理单键
4*4键盘排列:
0 1 2 3
-----------------
| 0 1 2 3 | 0
| 4 5 6 7 | 1
| 8 9 A B | 2
| C D E F | 3
-----------------
Time:2007-1-5
***************************************************************************/
#include <iom8v.h>
#include <macros.h>
#define key_port PORTB //定义键盘接口
#define port_DDR DDRB
#define port_PIN PINB
typedef unsigned int UINT;
typedef unsigned char UCHAR;
const UCHAR digital[16] =
{
0x3f, 0x6, 0x5b, 0x4f, //0,1,2,3
0x66, 0x6d, 0x7d, 0x7, //4,5,6,7
0x7f, 0x6f, 0x77, 0x7c, //8,9,A,B
0x39, 0x5e, 0x79, 0x71 //C,D,E,F
};
/*延时程序*/
void delay_1ms(void)
{//1ms延时函数
UINT i;
for(i=0; i<141; i++)
{}
}
void delay(UINT n)
{//延时n毫秒
UINT i;
for(i=0; i<n; i++) //执行n次1毫秒延时
delay_1ms();
}
/*键盘扫描*/
void scan_init(void)
{//初始化键盘扫描端口
key_port = 0xff;
port_DDR = 0x0f; //高四位输入,开上拉电阻
key_port = 0xf0; //低四位输出0
}
void scan_turn(void)
{//端口输出翻转
key_port |= 0x0f;
port_DDR = 0xf0; //低四位输入,开上拉电阻
key_port &= 0x0f; //高四位输出0
}
UCHAR kbscan(void)
{
UCHAR row, col; //行、列坐标
row = 4;
col = 4;
scan_init();
if((port_PIN&0xf0)!=0xf0) { //有键按下
delay(5); //防抖
if((port_PIN&0xf0)!=0xf0) {
row = (port_PIN&0xf0); //行值
scan_turn(); //翻转
if((port_PIN&0x0f)!=0x0f)
col = (port_PIN&0x0f); //列值
/*行坐标*/
switch(row)
{
case 0xe0: row = 0;
break;
case 0xd0: row = 1;
break;
case 0xb0: row = 2;
break;
case 0x70: row = 3;
break;
default: row=4; //未知数值
}
/*列坐标*/
switch(col)
{
case 0x0e: col = 0;
break;
case 0x0d: col = 1;
break;
case 0x0b: col = 2;
break;
case 0x07: col = 3;
break;
default: col=4; //未知数值
}
}
}
if((row!=4)&(col!=4))
return row*4+col;
else return 16; //错误返回
}
/*MAIN*/
void main(void)
{
UCHAR key;
DDRD = 0xff;
while(1){
key = kbscan();
if(key!=16)
PORTD = ~digital[key]; //数码管输出相应数字
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -