实验步骤
一、确定汉字点阵
二、编写代码
#include "reg51.h"//定义单片机的特殊寄存器#includetypedef unsigned int u16; //声明变量
typedef unsigned char u8;
sbit SRCLK=P3^6; //移位时钟控制
sbit RCLK=P3^5; //并行输出控制
sbit SER=P3^4; //串行数据输入控制
u8 ledduan[]={0x22,0xb4,0x68,0x34,0x02,0x38,0x02,0xff}; //每一列的数值,改变数字使矩阵上的点位置发生改变以得到想要显示的汉字
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe }; //每一行低电平有效
void delay(u16 i)
{
while(i--);
} /*空循环实现延时,以毫秒为单位*/
void Hc595SendByte(u8 dat) //向74HC595发送一个字节的数据
{
u8 a;
SRCLK=0;
RCLK=0; //时钟控制和输出控制置零
for(a=0;a<8;a++)
{
SER=dat>>7; //把dat右移七位赋值给ser
dat<<=1; //dat数值乘2
SRCLK=1;
_nop_();
_nop_(); //一个机器周期
SRCLK=0; //时钟控制周期是两个机器周期,删掉几个或增加几个没有看出不同,可能是为了防抖和一定的反应时间
}
RCLK=1;
_nop_();
_nop_();
RCLK=0; //输入控制周期为两个机器周期
}
void main()
{
u8 i;
while(1)
{
P0=0x7f;
for(i=0;i<8;i++)
{
P0=ledwei[i]; //位选
Hc595SendByte(ledduan[i]); //发送段选数据,显示每一列的灯泡
delay(10); //延时,每一列进行显示,但是间隔短所以类似整体显示,间隔大的话(如10000)就不会出现字
Hc595SendByte(0x00); //消隐
}
}
}
三、测试
四、注意事项
1、单片机JP595断开,JDE和GND链接
2、代码延时不宜超过200,越小越好。