wuzhengmin 发表于 2026-3-1 13:32:13

先设置4列为推挽输出,使能上拉:

wuzhengmin 发表于 2026-3-1 13:41:30

P14—P17设为高阻输入模式,上拉使能

这样都是高电平,我们让某一列变低电平,按下哪行的键,哪行就是低电平

wuzhengmin 发表于 2026-3-1 13:50:37

接着是数码管:

wuzhengmin 发表于 2026-3-1 14:29:02

管脚就设置好了,生成代码:

把前面的数码管和按键都移植过来:

#define KEY_MATRIX_PORTP1
//列P10—P13设为推挽输出,上啦也使能,默认高电平
//行P14—P17设为高阻输入模式,上拉使能,默认高电平

我们让第一列为低电平: KEY_MATRIX_PORT = 11110111 = 0xF7

wuzhengmin 发表于 2026-3-1 18:17:26


我手头普中HC6800-ESV2.0 板子矩阵开关

纵向是P13 P12 P11 P10   横向是P17 P16 P15 P14   

列P10—P13设为推挽输出,上啦也使能,默认高电平。

行P14---P17设为高阻输入 ,上拉也使能,默认高电平。

首先J21的跳线要插在VCC+LE 的2端,如果是插在LE和P102端,数码管不显示按键值

其次一开始没有按下按键,是没有显示的,按下矩阵键盘之后才有显示

wuzhengmin 发表于 2026-3-1 18:19:04

我们使用了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>>
    }
}

wuzhengmin 发表于 2026-3-1 18:36:17

因为99.9%的时候,按键值都是0,所以用USB-CDC 打印函数检查按键值

要加检测条件if(key!=0),否则0会覆盖你想看的按键值............

普中的板子,要注意跳线,这点和STC不同,STC是尽量不用跳线。。。。。。。

好了,矩阵按键实验就完成啦!

wuzhengmin 发表于 2026-3-1 18:41:51

接着学习10.1-LED点阵实验-介绍

我们板载的点阵是8*8=64个

本讲主要内容
1.LED点阵介绍
2.硬件设计
3.软件设计
4.实验现象



wuzhengmin 发表于 2026-3-1 18:56:10

实际把a设置为低电平 ,1的电平为高电平
就点亮啦红色圈中的LED

wuzhengmin 发表于 2026-3-1 19:01:25

其实和数码管很像,第一列是1个数码管

第二列是第二个数码管 .................


列就是位码 ,行就是段码


页: 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21
查看完整版本: 学习休眠唤醒遇到的问题:1无法开启休眠 2舍弃一下功能后能进入休眠但无法唤醒