#include<reg51.h>
#include<INTRINS.H>
sbit SCLK=P1^0 //定义P1^0端口为595的频率
sbit DAT=P1^1 //定义P1^1端口为595的数据
sbit SLCK=P1^2////定义P1^2端口为595的输出频率
unsigned char code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F}//0-9,-,全灭
void sendbyte(unsigned char a)//单位数据发送函数
{ unsigned char i//定义一个无字符串变量
for(i=0i<8i++) //for 循环,循环8次,把一个数变成二进制发送出去
{
SCLK=0// 把595 SCLK频率置低电平
DAT=a&0x80//把数据与0X80后发送出去
a=a<<1 把数据a左移一位
SCLK=1 把595频率置高
}
}
void out595(void) //595输出函数
{
SLCK=0
_nop_()//延时函数,系统自带
SLCK=1
}
main() //主函数
{ unsigned char i //定义一个无符号局部变量I
unsigned int f=60000 //赋值
while(1)//进循环
{for(i=0i<9i++) //进FOR循环
{
sendbyte(tab[i])//调用发送函数 发送I数据道595 比如第一次循环的时候 i 数为0 tab[0] 那么发送的数就是0x3f
out595() //数据输出函数,现在数据在595内面,现在这个就是输出到数码管
while(f--) //延时
}
}
}
void shift_out(uchar g) //移位输出
{
uchar i
uchar dly=5
uchar tmp=g
for(i=0i<8i++)
{
if((tmp&0x80)==0x80)
{
DS_out=1
}
else
{
DS_out=0
}
SHCLK=0 //移位
dly=2
while(dly--)
SHCLK=1
dly=2
while(dly--)
tmp=tmp<<1
}
STCLK=0 //锁存
dly=5
while(dly--)
STCLK=1
}
看电路图,行驱动直接接在单片机I/O口上,有问题吧,单片机I/O不管是输入还是输出,都承受不了32LED灯。所以在I/O口上要加放大电路。这个不是小程序,只能说思路。先要明白汉字显示就是点阵显示。根据电路一次最多只能2个汉字,再多就只能滚动或刷屏。所以以2个汉字为基础开始编程。将第一行的点阵(32个位),顺序写入595,输出595. 控制第一行的I/O驱动,点亮第一行。延时5ms将第二行的点阵(32个位),顺序写入595,关第一行,输出595. 控制第二行的I/O驱动,点亮第二行。延时5ms同理,顺序点亮16行。一屏扫描完毕,重复循环,汉字就显示出来了。必须重复循环,否则没显示。 显示滚动效果。滚动效果其实就是控制行点阵的内容,将每行的32个位,右移一位,再写入595,就是滚动效果了。每扫描一屏,移位一个,位扫描多屏,移动一个,可以控制滚动的速度欢迎分享,转载请注明来源:内存溢出
评论列表(0条)