📄 keyscan.c
字号:
/******************************************************/
/* 文件名: KeyScan.c */
/* 功能描述: 控制8255完成键盘扫描及数码显示实验 */
/******************************************************/
#include "Absacc.h"
#define C8255_A XBYTE[0x7F00] //8255端口地址定义
#define C8255_B XBYTE[0x7F01]
#define C8255_C XBYTE[0x7F02]
#define C8255_CON XBYTE[0x7F03]
//数码管显示编码
unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
//显示缓冲
unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char key_down;
unsigned char key_value;
unsigned char key_count;
void delay(unsigned int time)
{
unsigned int i;
for(i=0; i<time; i++);
}
void keyscan() //按键扫描函数
{
unsigned char cc;
C8255_A = 0x00; //X1~X4置0
cc = C8255_C; //得到Y1~Y4的值
key_down = (~cc) & 0x0f;
}
void display() //显示函数
{
unsigned char i, j = 0xDF;
for(i=0; i<6; i++)
{
C8255_A = 0xFF;
C8255_B = a[b[i]]; //查表输出显示
C8255_A = j;
delay(0x100);
j = (j>>1)|(j<<7);
}
}
void clear() //清屏
{
C8255_B = 0x00;
}
void writebuffer()
{
b[key_count] = key_value;
key_count--;
if(key_count == -1)
key_count = 5;
display();
clear();
keyscan();
while(key_down) //键盘消抖
{
display();
clear();
keyscan();
}
}
void getkey() //得到按键值
{
unsigned char value;
unsigned char i, j = 0xFE;
for(i=0; i<4; i++)
{
C8255_A = j;
value = C8255_C;
if(!(value & 0x01)) //行1
{
key_value = i + 0;
writebuffer();
return;
}
if(!(value & 0x02)) //行2
{
key_value = i + 4;
writebuffer();
return;
}
if(!(value & 0x04)) //行3
{
key_value = i + 8;
writebuffer();
return;
}
if(!(value & 0x08)) //行4
{
key_value = i + 12;
writebuffer();
return;
}
j <<= 1;
}
}
void main()
{
C8255_CON = 0x81; //8255初始化
key_count = 5;
while(1)
{
display(); //显示
clear(); //清屏
keyscan(); //按键扫描
if(key_down) //判是否有键按下
{
display();
delay(0x80);
clear();
keyscan();
if(key_down)
{
getkey(); //得到按键值
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -