请教 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; //显示红 {MOD}下屏
sbit R1=P3^4; //显示红 {MOD}上屏
sbit SCL=P3^3; //74hc595时钟
sbit ST=P3^2; //74hc595锁存
sbit G2=P3^1; //显示绿 {MOD}下屏
sbit G1=P3^0; //显示绿 {MOD}上屏
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(); //读取温度并显示
}
}
-
-
{
temp[4*j] = temp[4*j]<<1 | temp[4*j+1]>>7;
temp[4*j+1] = temp[4*j+1]<<1 | temp[4*j+2]>>7;
temp[4*j+2] = temp[4*j+2]<<1 | temp[4*j+3]>>7;
temp[4*j+3] = temp[4*j+3]<<1 | buf[2*k]>>7;
}
这是16x32的。就是把后面的字节的最高位加在前一字节的最低位,然后左移而已。。。
不然就把这些数据分成几组,比如32位,4个字节,我这一行的数据装在一个long型的变量里,然后整体左移。。。也是个思路。总之实现就好。。。就是玩玩嘛。
一周热门 更多>