📄 key1.c
字号:
/****************************************Copyright (c)**************************************************/
/**
;** 西南科技大学计算机学院
;**
;** http://cs.swust.edu.cn
;**
;** 日期: 2004.10.15
;** 功能: 键盘扫描程序,利用定时器定时扫描,将扫描的扫描码转换为显示码,
;** 利用一个数码管将扫描的数据显示出来
;** 扩展: 利用定时器延迟去抖
;** 本程序作用:键盘扫描原理显示。逐行扫描,低电平扫描
;** 数码管段码:0------F 对应 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
;** 0x77,0x7c,0x39,0x5e,0x79,0x71 ,可采用查表实现
;** 硬件连接,连接数码管显示模块中的两组跳线,一组为8位数据线,一组为6位位选线,
;** 默认连接,数据:p00----p07,位选:P10----P15 ,数码管共阴级,键盘模块中
;** 连接键盘行信号线和列信号线,以及SHIFT,(连P27)
;**
;**
;**-------------.c文件
;**------------------------------------------------------------------------------------------------------*/
/**------------------------------------------------------------------------------------------------------*/
#include <at89x52.h>
const char Discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
const char ScanData[]={0xfe,0xfd,0xfb,0xf7};
void timer0_init(void);
char scancount=0;
void keyscan(void);
void PortInit(void);
void keyscan(void);
char key_x,key_y;
char keydata;
unsigned int count=0;
/***********************************************************************************
定时器0中断服务函数
作 用: 添加服务函数,由定时器中断统一调用
入口参数: 无
中断向量: 1
***********************************************************************************/
void int_t0(void) interrupt 1
{
count++;
// if(count==0x8ff)
{
keyscan();
count=0;
}
TH0=0Xff;
}
/***********************************************************************************
主函数
作 用: 程序入口
入口参数: 无
***********************************************************************************/
void main(void)
{
PortInit();
timer0_init();
while(1);
}
/***********************************************************************************
键盘扫描函数
作 用: 逐行扫描方式扫描键盘
入口参数: 无
***********************************************************************************/
void keyscan(void)
{
P2=ScanData[scancount];// 扫描数据
key_y=scancount*4;
scancount++;
if(scancount==4)
{
scancount=0;
}
if((P2&0xf0)!=0xf0)
{
switch(P2&0xf0)
{
case 0xe0: key_x=0x03;
break;
case 0xd0: key_x=0x02;
break;
case 0xb0: key_x=0x01;
break;
case 0x70: key_x=0x00;
break;
default: break;
}
keydata=key_x+key_y;
P0=Discode[keydata];
}
}
/***********************************************************************************
定时器初始化函数
作 用: 初始化定时器,设置定时器中断,定时长度,定时器工作方式
入口参数: 无
***********************************************************************************/
void timer0_init(void)
{
IE|=0X82;
TL0=0X00;
TH0=0X00;
TMOD=01;
TCON|=0X10;
}
/***********************************************************************************
端口初始化函数
作 用: 设置上电后端口某些特殊状态。
入口参数: 无
***********************************************************************************/
void PortInit(void)
{
P1=0xfe;
P0=0X00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -