wuzhengmin 发表于 2026-2-28 20:32:53

我们实施的是:

wuzhengmin 发表于 2026-2-28 21:42:31

接着驱动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


}

wuzhengmin 发表于 2026-2-28 21:42:57

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

wuzhengmin 发表于 2026-2-28 21:43:38

led.h:

#ifndef __LED_H
#define __LED_H

#include "config.h"                     //默认已包含stdio.h、intrins.h等头文件

#define LED1P20
#define LED2P21
#define LED3P22
#define LED4P23


#endif

wuzhengmin 发表于 2026-2-28 21:44:50

看主函数:

//<<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-按键控制实验-按键驱动到此结束

wuzhengmin 发表于 2026-3-1 12:58:15

今天我们继续学习 9.1-矩阵按键实验-简介

1.实验介绍
2.硬件设计
3.软件设计
4.实验现象

我们用最简单的方法:

我们配置行为输出模式,假如我们行下拉输出低电平,对应的列设为上拉输入模式来检测对应的IO电平,

如果是低电平就是有按键按下,如果是高电平就没有按下。

例如我们把第一行配置为输出模式,让它输出低电平,4列都是上拉输入模式,高电平

如果检测到第一列变成低电平,就是第一行第一列的开关按下了。

检测完第一行,我们把第一行变成高电平,第二行变成低电平,开始检测第二行按键



wuzhengmin 发表于 2026-3-1 12:58:53

看看硬件电路:

wuzhengmin 发表于 2026-3-1 13:00:03

我手头普中HC6800-ESV2.0 板子:

wuzhengmin 发表于 2026-3-1 13:02:44

数码管:

wuzhengmin 发表于 2026-3-1 13:22:18

我们就按独立按键的方法,一端接地,其他4个端子接高电平,谁变低电平了,谁就被按下

我们列设推挽输出,P00- P03 ,开启下拉,低电平

行P14--P17设置为输入模式,开启上拉,高电平


重点是软件设计:


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