先设置4列为推挽输出,使能上拉:
P14—P17设为高阻输入模式,上拉使能
这样都是高电平,我们让某一列变低电平,按下哪行的键,哪行就是低电平
接着是数码管:
管脚就设置好了,生成代码:
把前面的数码管和按键都移植过来:
#define KEY_MATRIX_PORTP1
//列P10—P13设为推挽输出,上啦也使能,默认高电平
//行P14—P17设为高阻输入模式,上拉使能,默认高电平
我们让第一列为低电平: KEY_MATRIX_PORT = 11110111 = 0xF7
我手头普中HC6800-ESV2.0 板子矩阵开关
纵向是P13 P12 P11 P10 横向是P17 P16 P15 P14
列P10—P13设为推挽输出,上啦也使能,默认高电平。
行P14---P17设为高阻输入 ,上拉也使能,默认高电平。
首先J21的跳线要插在VCC+LE 的2端,如果是插在LE和P102端,数码管不显示按键值
其次一开始没有按下按键,是没有显示的,按下矩阵键盘之后才有显示
我们使用了printf_usb 函数:
看看主函数:
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2026-03-01) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h" //默认已包含stdio.h、intrins.h等头文件
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
#include "key.h"
#include"smg.h"
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码
u8 key=1;
u8 key_num=0; //键值要转换为数码管的段码
//<<AICUBE_USER_MAIN_INITIAL_END>>
SYS_Init();
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码
//<<AICUBE_USER_MAIN_CODE_END>>
while (1)
{
USBLIB_OUT_Done(); //查询方式处理USB接收的数据
//<<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 在此添加主函数中用户主循环代码
key=key_matrix_ranks_scan();
if(key!=0)
printf_usb("KEY VALue:%02X.key_value: %02u\r\n", key,key); //输出2位16进制的key按键值,10进制的key按键值
if (key!=0) key_num=gsmg_code; //Key的段码给了key_num
SMG_DisPlay(&key_num, 8);//本来第一个参数是数组,我们只有1个数,要用&
//第二个参数是显示位置,我们选第8位(最右边)显示。这个地址运算符&,本来是数组(相当于指针)
//我们需要传递的是地址,&key_num就是地址(房间的门牌号)
//<<AICUBE_USER_MAIN_LOOP_END>>
}
}
因为99.9%的时候,按键值都是0,所以用USB-CDC 打印函数检查按键值
要加检测条件if(key!=0),否则0会覆盖你想看的按键值............
普中的板子,要注意跳线,这点和STC不同,STC是尽量不用跳线。。。。。。。
好了,矩阵按键实验就完成啦!
接着学习10.1-LED点阵实验-介绍
我们板载的点阵是8*8=64个
本讲主要内容
1.LED点阵介绍
2.硬件设计
3.软件设计
4.实验现象
实际把a设置为低电平 ,1的电平为高电平
就点亮啦红色圈中的LED
其实和数码管很像,第一列是1个数码管
第二列是第二个数码管 .................
列就是位码 ,行就是段码