根据提供的文件信息,我们可以分析出该程序主要实现了按键扫描功能,并对按键操作进行了处理。下面将从以下几个方面详细解析此程序的关键知识点: ### 1. 按键扫描原理 按键扫描是通过检测键盘上各个按键的状态来确定用户是否按下某个键的操作。本程序采用了一种行列式按键矩阵的方法来实现按键扫描。这种方法通过将按键按照行和列的方式排列,然后通过控制电路中的行线电平状态,检测列线是否有变化,以此判断按键是否被按下。 ### 2. 按键扫描函数实现 #### 2.1 `unsigned char keyscan();` 这是按键扫描的核心函数,其主要功能是返回当前被按下的键值。在该函数中,程序首先初始化按键矩阵的行线为特定值(例如,0x0F),并通过检查列线的状态来确定是否有按键被按下。如果检测到有键按下,则根据不同的行线状态进一步确定具体是哪一个键被按下。 #### 2.2 延时函数 `void delay();` 由于硬件的原因,当按键被按下或释放时,可能会出现“抖动”现象。为了确保读取到的是稳定的按键状态,需要在检测到按键变化后加入延时函数以滤除抖动的影响。 #### 2.3 键值处理 在`keyscan()`函数内部,通过一系列的条件判断语句确定具体的键值。例如,如果检测到某一行线的状态为0x07,则对应的键值为10;如果为0x0B,则键值为11,以此类推。 ### 3. 按键处理函数 #### 3.1 `void key_deal();` 这个函数用于处理按键事件。它首先调用`keyscan()`函数获取当前被按下的键值,然后根据不同的键值执行相应的操作。例如,如果检测到键值为1,则设置地址0x8002处的数据为0x01,并在地址0x8004处写入对应的显示代码。 ### 4. 主循环 #### 4.1 `void main()` 主函数通过不断地调用`keyscan()`和`key_deal()`来持续地监测按键状态并做出响应。这种不断循环检测的方式能够及时捕捉用户的按键操作,并进行相应的处理。 ### 5. 显示代码表 在程序中还定义了一个显示代码表`unsigned char code_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};`。这个数组存储了每个键值对应的显示代码,这些代码通常用于驱动LED数码管显示相应的数字或字符。 ### 总结 这段程序主要实现了基于行列式按键矩阵的按键扫描功能,并通过延时函数消除了按键抖动的影响。程序还包括了一个按键处理函数,用于根据不同的按键执行相应的操作。此外,还定义了一个显示代码表,用于将键值转换为相应的显示代码。整个程序结构清晰,逻辑合理,是一份较为典型的按键扫描程序实例。
#include<stdio.h>
#include<absacc.h>
unsigned char keyscan();
void delay();
unsigned char key_free();
void key_deal();
unsigned char key,temp;
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};
unsigned char keyscan()
{
XBYTE[0x8001]=0x0f;
XBYTE[0x8002]=0x00;
if(XBYTE[0x8001]&0x0f==0x0f)
{
delay();
if(XBYTE[0x8001]&0x0f==0x0f)
{
XBYTE[0x8002]=0x38;
temp=XBYTE[0x8001];
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x07:key=10;break;
case 0x0b:key=11;break;
case 0x0d:key=12;break;
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助