wuzhengmin 发表于 2026-2-28 18:06:53

上拉电阻使能后默认就是高电平

P22 P23 P24 高电平 就是111 ,对应第7位:

如果不想显示可以设置段码P00-P07对应的 下拉电阻使能,默认低电平,

这样不管位码如何,数码管就没有显示

我们设置好之后保存,建立系统:





wuzhengmin 发表于 2026-2-28 20:02:46

接着我们添加用户的代码:

和蜂鸣器一样,新建文件目录APP

建立2个文件 SMG.c 和smg.h

我们是动态扫描8个数码管,反正肉眼分辨20ms---50ms没差别的

我们位码先让com8 有效(低电平)就是要求P22 P23 P24 是111 (可以回去看看真值表) 111=7

然后段选传达0 的字摸 0x3F(因为段选只有第7位有效,其他位是没显示的)

同理第二位com7有效的时候 P22 P23 P24 就是011 =6

然后段选传达1 的字摸 0x06(因为段选只有第6位有效,其他位是没显示的)

同理第三位com6有效的时候 P22 P23 P24 就是101 =5

然后段选传达2 的字摸 0x5b(因为段选只有第5位有效,其他位是没显示的)

........................................

同理第三位com1有效的时候 P22 P23 P24 就是000 =0

然后段选传达7 的字摸 0x07(因为段选只有第1位有效,其他位是没显示的)

注意消隐的原因,SMG_PORT=0;    //消隐

实际是段码给0,清除段数据,消除重影












wuzhengmin 发表于 2026-2-28 20:03:44

完整的看我们的功能函数:

#include"smg.h"

//共阴极数码管显示0~F的段码数据
u8 gsmg_code={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

                               

//从第pos位开始,显示缓冲器dat[]的内容       
void SMG_DisPlay(u8 dat[],u8 pos)//dat[]是显示的内容,pos是显示的开始位置
{
        u8 i=0;
        u8 pos_temp=pos-1;
        for (i=pos_temp; i<8;i++)
        {
                switch (i)
                        {
                        case 0: LSC=1;LSB=1;LSA=1;break;
                        case 1: LSC=1;LSB=1;LSA=0;break;
                        case 2: LSC=1;LSB=0;LSA=1;break;
                        case 3: LSC=1;LSB=0;LSA=0;break;
                        case 4: LSC=0;LSB=1;LSA=1;break;
                        case 5: LSC=0;LSB=1;LSA=0;break;
                        case 6: LSC=0;LSB=0;LSA=1;break;
                        case 7: LSC=0;LSB=0;LSA=0;break;
                       
                        }
                                SMG_PORT=dat ;
                                delay_ms (1) ;
                                SMG_PORT=0;    //消隐,实际是段码给0,清除段数据,消除重影
                       
                               
        }
       

}
       

wuzhengmin 发表于 2026-2-28 20:04:35

主函数:

//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
#include"smg.h"
//<<AICUBE_USER_INCLUDE_END>>


//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
        u8 i = 0;
        u8 smgbuf;
//<<AICUBE_USER_GLOBAL_DEFINE_END>>



////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    // 在此添加用户主函数初始化代码
    //<<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>>
      // 在此添加主函数中用户主循环代码
                for (i=0; i<8; i++) smgbuf = gsmg_code;
                        SMG_DisPlay(smgbuf,1);//dat[]是显示的内容,pos是显示的开始位置
                        //smgbuf有8个元素,从第一位开始全部显示
                        delay_ms(10) ;
                       
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}

wuzhengmin 发表于 2026-2-28 20:07:41

编译后下载

一切顺利,接着我们开始学习8.1-按键控制实验-简介

主要是学对GPIO的输入控制




wuzhengmin 发表于 2026-2-28 20:09:46

按键是机械的结构:

wuzhengmin 发表于 2026-2-28 20:17:35

硬件设计:

我手头的普中HC6800-ES V2.0 的按键:

RXD 就是 P31TXD 就是P30

wuzhengmin 发表于 2026-2-28 20:18:10

RXD 就是 P31TXD 就是P30

wuzhengmin 发表于 2026-2-28 20:22:30

LED是对应P2口

wuzhengmin 发表于 2026-2-28 20:26:12

我们设置上拉,把开关初始电平固定为高电平

软件设计:

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