引脚设置:
//定义74HC595控制管脚
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit RCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
这3个脚设置为推挽输出,使能上拉
P0口推挽输出,使能上拉:
默认高电平
保存,生成
接着写点阵的驱动函数:
#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;
}
对应的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
主函数:
//<<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>>
}
}
我现在用的板子是普中科技的HC6800-ES V2.0 +"擎天柱“”,很旧的实验板,在做LED点阵的实验的时候,遇到点问题
好像软件没问题的情况下,无法顺利点亮左上角的一颗LED,反复拔插 VCC JOE END 跳线和J21 VCC LE P10 有时候就能正常点亮左上角的一颗LED
没有进一步查找资料,反正是硬件有点兼容问题
好像和PC机也有连续,有些PC就OK 有些就折腾很旧才能点亮左上角的一颗LED,暂且搁置..............
我们继续学习11.1-LED点阵实验-动态扫描原理
LED点阵实验-显示字符
1.实验介绍
2.硬件设计
3.软件设计
4.实验现象
1.1.1 LED点阵屏动态扫描原理 和数码管一样
也是8个
行就是段选,列就是位选
使能第一位的时候,传输想显示的数据给段码,就在第一位显示出来
就是使能第一列(低电平)的时候,传输想显示的数据给段码,就在第一位显示出来
行对应的是高位,列对应的是低位
接着介绍取模软件