wuzhengmin 发表于 2026-3-1 21:17:24

引脚设置:
//定义74HC595控制管脚
sbit SRCLK=P3^6;        //移位寄存器时钟输入
sbit RCLK=P3^5;                //存储寄存器时钟输入
sbit SER=P3^4;                 //串行数据输入
这3个脚设置为推挽输出,使能上拉

wuzhengmin 发表于 2026-3-1 21:20:11

P0口推挽输出,使能上拉:

默认高电平


wuzhengmin 发表于 2026-3-1 21:23:03

保存,生成

wuzhengmin 发表于 2026-3-2 09:08:58

接着写点阵的驱动函数:

#include "leddz.h"

/*******************************************************************************
* 函 数 名         : LEDDZ_write_data(u8 dat)//行数据传输
* 函数功能                   : 向74HC595写入一个字节的数据
* 输    入         : dat:数据
* 输    出         : 高位对Q7,低位对Q0
*******************************************************************************/
void LEDDZ_write_data(u8 dat)
{
        u8 i=0;
       
        for(i=0;i<8;i++) //循环8次即可将一个字节写入595寄存器中
        {
                SER=dat>>7;//优先传输一个字节中的高位
                //SER是串行数据输入端,dat是8位,现在只要1位,电路决定先传高位
                dat<<=1;//将低位移动到高位
                SRCLK=0; //移位寄存器时钟产生上升沿
                delay_us(1);
                SRCLK=1;
                delay_us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中       
        }
       
        RCLK=0;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
        delay_us(1);
        RCLK=1;
       
}
/*******************************************************************************
* 函 数 名         : LEDDZ_COL_Write_Data(u8 dat) //列输出函数
* 函数功能                   : 向8*8点阵写入一个字节的数据
* 输    入         : dat:数据
* 输    出         : 高位对Q7,低位对Q0
*******************************************************************************/
void LEDDZ_COL_Write_Data(u8 dat) //列输出函数
{
        LEDDZ_COL_PORT=dat;
       
}

wuzhengmin 发表于 2026-3-2 09:09:33

对应的h函数:

#ifndef__LEDDZ_H
#define__LEDDZ_H

#include "config.h"

//定义74HC595控制管脚
sbit SRCLK=P3^6;        //移位寄存器时钟输入
sbit RCLK=P3^5;                //存储寄存器时钟输入
sbit SER=P3^4;                 //串行数据输入

#define LEDDZ_COL_PORT        P0        //点阵列控制端口

void LEDDZ_write_data(u8 dat);//行控制输出函数
void LEDDZ_COL_Write_Data(u8 dat); //列输出函数
#endif

wuzhengmin 发表于 2026-3-2 09:10:43

主函数:


//<<AICUBE_USER_HEADER_REMARK_END>>


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


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


//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<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>>
    // 在此添加主函数中运行一次的用户代码
                LEDDZ_write_data(0x80);//行控制输出函数
           //我们要求第一行输出高电平,其他都是低电平:0x80
                LEDDZ_COL_Write_Data(0x7F); //列输出函数
           //我们要求第一列输出低电平,其他都是高电平:0x7F
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}

wuzhengmin 发表于 2026-3-2 10:36:08

我现在用的板子是普中科技的HC6800-ES V2.0 +"擎天柱“”,很旧的实验板,在做LED点阵的实验的时候,遇到点问题

好像软件没问题的情况下,无法顺利点亮左上角的一颗LED,反复拔插 VCC JOE END 跳线和J21 VCC LE P10 有时候就能正常点亮左上角的一颗LED

没有进一步查找资料,反正是硬件有点兼容问题

好像和PC机也有连续,有些PC就OK 有些就折腾很旧才能点亮左上角的一颗LED,暂且搁置..............

wuzhengmin 发表于 2026-3-2 10:47:01

我们继续学习11.1-LED点阵实验-动态扫描原理

LED点阵实验-显示字符

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

wuzhengmin 发表于 2026-3-2 11:45:02

1.1.1 LED点阵屏动态扫描原理 和数码管一样

也是8个

wuzhengmin 发表于 2026-3-2 11:48:06

行就是段选,列就是位选



使能第一位的时候,传输想显示的数据给段码,就在第一位显示出来
就是使能第一列(低电平)的时候,传输想显示的数据给段码,就在第一位显示出来
行对应的是高位,列对应的是低位
接着介绍取模软件




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