请教 32*64 LED 点阵屏左/右移思路
时间:10-02
整理:3721RD
点击:
请教 32*64 LED 点阵屏左/右移思路
我的3264点阵屏是标准的08接口(芯片:595+245+138),我现在用AT89s52单片机作为驱动。我现在想做一个广告牌,就是让那些字幕进行左/右移,我想很久都没有算法思路,在网上和本论坛进行搜索,也没有满意的帖子。
我现在的点阵屏能够正常显示静态不移动的字体。显示上半屏是一维数组,下半屏显示时钟时间用的是二维数组。看附件
部分C51程序,请大家参考。
#include <REGX52.H>
#include "ziku.h" //字库
#include "ds1302.h"
#include "ds18b20.h"
#define uchar unsigned char
#define uint unsigned int
int wendu; //温度
#define hang P2 //行扫描显示
//sbit EN=P2^6; //显示屏使能
//sbit R2=P3^1; //显示红色下屏
sbit R1=P3^4; //显示红色上屏
sbit SCL=P3^3; //74hc595时钟
sbit ST=P3^2; //74hc595锁存
sbit G2=P3^1; //显示绿色下屏
sbit G1=P3^0; //显示绿色上屏
void write_595(uchar num , uchar dat)
{uchar i;
if(num==1)
{
for(i=0;i<8;i++)
{
R1=dat&0x01;
dat>>=1;
SCL=0;
SCL=1;
}
}
if(num==2)
{
for(i=0;i<8;i++)
{
dat>>=1;
G2=CY;
SCL=0;
SCL=1; //74HC595上升沿数据移入
}
}
}
void dispay1() //上半屏显示16X16汉字
{uchar i;
for(i=0;i<16;i++)
{
// write_595(1 , ~hzdot[i*2]);
// write_595(1 , ~hzdot[i*2+1]);
// write_595(1 , ~hzdot[i*2+32]);
// write_595(1 , ~hzdot[i*2+32+1]);
// write_595(1 , ~hzdot[i*2+64]);
// write_595(1 , ~hzdot[i*2+64+1]);
// write_595(1 , ~hzdot[i*2+96]);
// write_595(1 , ~hzdot[i*2+96+1]);
write_595(1,~hzdot[i*2]);
write_595(1,~hzdot[i*2+1]);
write_595(1,~hzdot[i*2+32]);
write_595(1,~hzdot[i*2+32+1]);
write_595(1,~shuzi[wendu/1000]); //温度,十位
write_595(1,~shuzi[wendu%1000/100]); //温度,个位
write_595(1,~shuzi[(wendu%100/10)]); //温度,十分位
// write_595(2,~shuzi[(wendu%10)]); //温度,百分位
write_595(1,~shuzi[11]); //温度符号:℃
ST=0;
ST=1; //74HC595上升沿锁存输出
hang=i;
}
}
void dispay2() //下半屏显示ds1302时间
{uchar i;
for(i=0;i<16;i++)
{
write_595(2,~shuzi[hour>>4]);
write_595(2,~shuzi[hour&0x0f]);
write_595(2,~shuzi[10]);
write_595(2,~shuzi[minute>>4]);
write_595(2,~shuzi[minute&0x0f]);
write_595(2,~shuzi[10]);
write_595(2,~shuzi[second>>4]);
write_595(2,~shuzi[second&0X0F]);
ST=0;
ST=1; //74HC595上升沿锁存输出
hang=i;
}
}
uchar init_DS18B20()
{ uchar tempH,tempL;
REST_DS18B20();
WRITE_DS18B20(0XCC);
WRITE_DS18B20(0X44);
dispay1(); //上半屏显示欢迎词
dispay2(); //下半屏显示DS1302时间
REST_DS18B20(); //DS18B20复位
WRITE_DS18B20(0XCC);
WRITE_DS18B20(0XBE);
tempL = READ_DS18B20();
tempH = READ_DS18B20();
wendu=((tempH*256)+tempL)*6.25; //读取温度,0.0625放大100倍=6.25
return wendu;
}
void main()
{
// init_ds1302();
while(1)
{ read(); //读取DS1302时间函数
init_DS18B20(); //读取温度并显示
}
}
好全面?,谢谢小编分享
小编的单片机内存小,要左移效果不怎么好,小编用的显示板应该是F3.75双色的板,给个思路,可以定义一个256字节的显示缓冲区,开一个定时器把缓冲区的数据送到屏上,再开一个定时器或者在main的while中把显示缓冲区的数据全部左移一位,
哈哈哈哈哈哈哈哈
附件在哪里。
有没有完整的程序?发到我邮箱 1767802879@qq.com
有没有完整的程序?发到我邮箱 1767802879@qq.com
我有个这样的点阵,但是没找到左移程序,能给个吗?我没时钟,jianxin8187@163.com谢谢
sdsdsdsdsdsdsdasdsad12e e12d1 2e1 e1
小编你好,刚好最近在做这个,可以把完整程序发给我学习一下吗,多谢。935362083@qq.com
看来搞32-*64的点阵屏的人有很多啊!
首先,你先只显示一个字符,然后一次的去移位去移动这个字符。 前提是你必须连接各个驱动的驱动方式。 然后再来移动多个字符。 我自己就是这样做的。 只要你耐心的这样做,肯定是可以对的!