📄 key_scan.c
字号:
#include<reg52.h> //PB段码,PA位控
#include <absacc.h>
#include <string.h>
#include <intrins.h>
#include <ctype.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/* 定义8155的I/O端口地址 */
#define COM8155 XBYTE[0xf000] /* 8155命令口地址 */
#define PA8155 XBYTE[0xf001] /* 8155的PA口地址 */
#define PB8155 XBYTE[0xf002] /* 8155的PB口地址 */
#define PC8155 XBYTE[0xf003] /* 8155的PC口地址 */
uchar key_scan(void);
void delay(uchar ms);
void proc_key(uchar key);
uchar key;
void main()
{
while(1)
{
COM8155=0x03 ; //给8155送命令,PA,PB口都为输出,PC口为输入.
key = key_scan();
// while ((PC8155&0xcf)!=0xcf) ; //松键后执行下面程序,会出现数码管按下不亮.
proc_key(key); //键盘功能
}
}
//键处理子程序
/*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,*/
/*0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E, */
void proc_key(uchar key)
{
switch(key)
{
case 0x11:PB8155=0xfc;PA8155=0xf0;delay(10);break; //数码显示0
case 0x12:PB8155=0x60;PA8155=0xf0;delay(10);break; //数码显示1
case 0x14:PB8155=0xda;PA8155=0xf0;delay(10);break; //数码显示2
case 0x18:PB8155=0xf2;PA8155=0xf0;delay(10);break; //数码显示3
case 0x21:PB8155=0x66;PA8155=0xf0;delay(10);break; //数码显示4
case 0x22:PB8155=0xb6;PA8155=0xf0;delay(10);break; //数码显示5
case 0x24:PB8155=0xbe;PA8155=0xf0;delay(10);break; //数码显示6
case 0x28:PB8155=0xe0;PA8155=0xf0;delay(10);break; //数码显示7
case 0x41:PB8155=0xfe;PA8155=0xf0;delay(10);break; //数码显示8
case 0x42:PB8155=0xf6;PA8155=0xf0;delay(10);break; //数码显示9
case 0x44:PB8155=0xEE;PA8155=0xf0;delay(10);break; //数码显示a
case 0x48:PB8155=0x3E;PA8155=0xf0;delay(10);break; //数码显示b
case 0x81:PB8155=0x9c;PA8155=0xf0;delay(10);break; //数码显示c
case 0x82:PB8155=0x7a;PA8155=0xf0;delay(10);break; //数码显示d
case 0x84:PB8155=0x9E;PA8155=0xf0;delay(10);break; //数码显示e
case 0x88:PB8155=0x8E;PA8155=0xf0;delay(10);break; //数码显示f
default: break;
}
}
/* 键扫描函数 */
uchar key_scan(void)
{
uchar scancode,tmpcode;
PB8155 = 0xf0; // 在列行没有接高电平发全0列扫描码
PA8155=0xff; //关闭显示
if ((PC8155&0xcf)!=0xcf) // 若哪行有0代表有键按下,PC口"1100,****"PC口7,6位没有用默认为高电平,5,4位不用时为0.
{
delay(1); // 延时去抖动
if ((PC8155&0xcf)!=0xcf) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe; //从第一列开始发0
while((scancode&0x10)!=0) // 逐行扫描
{
PB8155 = scancode; // 输出列扫描码
if ((PC8155&0xcf)!=0xcf) // 本行有键按下
{
tmpcode = (PC8155<<4)|0x0f;
/* 返回特征字节码,为1的位即对应于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return(key); // 无键按下,返回值为原来key值(这是松开键让它一直执行子程序), 如返回值为0(是按一下才执行键功能程序,松开就不执行);
}
//延时子程序ms级
void delay(uchar ms)
{
uchar i;
while(ms--)
{
for(i=0;i<150;i++)
{;}
}//--焦建国制作
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -