大家好!今天是学习51单片机的第九天,昨天介绍了74hc595,今天继续学习74HC595。学习笔记如下:
之前我们学习了如何在LED点阵上显示一个点,现在使用LED点阵显示数字;
回顾一下显示点的方法;
将LED点阵左边第一列设置为0,即LED阴极为低电平,其余列为1,即高电平,即P0=0x7f。并且第一行A1需要设置成高电平,那么SER=0x80。
同理,我们要显示第二行第二列的点我们就需要设置:P0=0xbf;SER=0x40。
那么如果我们要两个点共同显示,要如何做呢?
原理就是和数码管共同显示的原理一样,视觉停留!只要我们在显示一个点后迅速显示另一个,然后不断交换,在我们看来就会觉得是两个点同时显示。
然后我们假如要显示数字0,这时我们需要用到文字取模软件,网上流行的取模软件有很多,介绍一下我用的PCtoLCD2002:
第一步:单击基本操作>>新建图像,设置宽度和高度这里我们设置8*8。这时中间就会出现8*8的白格。
第二步:单击模拟动画>>放大格点,可以放大个点,进行取模。
第三步:参数设计>>其他选项,出现下面的选项框。
我们一般设置:纵向取模,字节倒序
第四步:取模方式>>C51格式,即可
0x00,0x7C,0x82,0x82,0x7c,0x00,0x00.
需要注意的是:这里是纵向取模,横向我们设置的是0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
代码如下:
实验现象:下载程序后,8*8LED点阵显示数字0
#include "reg51.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义74HC595控制管脚
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit RCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
#define LEDDZ_COL_PORT P0 //点阵列控制端口
u8 gled_row[8]={0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0x00};//LED点阵显示数字0的行数据
u8 gled_col[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED点阵显示数字0的列数据
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void hc595_write_data(u8 dat)
{
u8 i=0;
for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
{
SER=dat>>7;//优先传输一个字节中的高位
dat<<=1;//将低位移动到高位
SRCLK=0;
delay_10us(1);
SRCLK=1;
delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
}
RCLK=0;
delay_10us(1);
RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
}
void main()
{
u8 i=0;
while(1)
{
for(i=0;i<8;i++)//循环8次扫描8行、列
{
LEDDZ_COL_PORT=gled_col[i];//传送列选数据
hc595_write_data(gled_row[i]);//传送行选数据
delay_10us(1000);//延时一段时间,等待显示稳定
hc595_write_data(0x00);//消影
}
}
}