我们实施的是:
接着驱动KEY,新建key.ckey.h
#include "key.h"
u8 KEY_Scan(u8 mode) //mode=0 单击 mode=1 长按
{
static u8 Key=1; //第一次进来是1,这样就实现了单次扫描
if(mode==1) Key=1; //连续返回按键值
if (Key=1 && (KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0))
{
delay_ms(10);
Key=0;
if(KEY1==0) return KEY1_PRESS;
else if(KEY2==0) return KEY2_PRESS;
else if(KEY3==0) return KEY3_PRESS;
else if(KEY4==0) return KEY4_PRESS;
}
else if(KEY1==0 && KEY2==0 && KEY3==0 && KEY4==0) Key=1; //恢复第一次进来状态,否则进不来了
return 0;//没有按键按下返回0
}
key.h:
#ifndef__KEY_H
#define__KEY_H
#include "config.h" //默认已包含stdio.h、intrins.h等头文件
#define KEY1P31
#define KEY2P30
#define KEY3P32
#define KEY4P33
#define KEY1_PRESS1
#define KEY2_PRESS2
#define KEY3_PRESS3
#define KEY4_PRESS4
u8 KEY_Scan(u8 mode); //mode=0 单击 mode=1 长按
#endif
led.h:
#ifndef __LED_H
#define __LED_H
#include "config.h" //默认已包含stdio.h、intrins.h等头文件
#define LED1P20
#define LED2P21
#define LED3P22
#define LED4P23
#endif
看主函数:
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2026-02-28) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h" //默认已包含stdio.h、intrins.h等头文件
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
#include "key.h"
#include "led.h"
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码
u8key =0;
//<<AICUBE_USER_MAIN_INITIAL_END>>
SYS_Init();
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码
//<<AICUBE_USER_MAIN_CODE_END>>
while (1)
{
//<<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 在此添加主函数中用户主循环代码
key=KEY_Scan(0); //mode=0 单击 mode=1 长按
switch(key)
{
case KEY1_PRESS:LED1=!LED1;break;
case KEY2_PRESS:LED2=!LED2;break;
case KEY3_PRESS:LED3=!LED3;break;
case KEY4_PRESS:LED4=!LED4;break;
}
//<<AICUBE_USER_MAIN_LOOP_END>>
}
}
特别说明一下,虽然我手头普中的HC6800-ESV2.0 板子有 P3.0 P3.1的开关 K1 K2,但是我用到的核心板是“擎天柱”,没有P30P31的引脚,所以
只能在K3 K4 这2个按键验证.........K1 K2 就废了
8.4-按键控制实验-按键驱动到此结束
今天我们继续学习 9.1-矩阵按键实验-简介
1.实验介绍
2.硬件设计
3.软件设计
4.实验现象
我们用最简单的方法:
我们配置行为输出模式,假如我们行下拉输出低电平,对应的列设为上拉输入模式来检测对应的IO电平,
如果是低电平就是有按键按下,如果是高电平就没有按下。
例如我们把第一行配置为输出模式,让它输出低电平,4列都是上拉输入模式,高电平
如果检测到第一列变成低电平,就是第一行第一列的开关按下了。
检测完第一行,我们把第一行变成高电平,第二行变成低电平,开始检测第二行按键
看看硬件电路:
我手头普中HC6800-ESV2.0 板子:
数码管:
我们就按独立按键的方法,一端接地,其他4个端子接高电平,谁变低电平了,谁就被按下
我们列设推挽输出,P00- P03 ,开启下拉,低电平
行P14--P17设置为输入模式,开启上拉,高电平
重点是软件设计: