请教 32*64 LED 点阵屏左/右移思路

2019-07-15 21:14发布

请教 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(); //读取温度并显示
}
}

上半屏.jpg
下半屏.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
冰葑世纪
1楼-- · 2019-07-16 01:15
dongyumin
2楼-- · 2019-07-16 01:34
for(i=0; i<16; i++)
{
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型的变量里,然后整体左移。。。也是个思路。总之实现就好。。。就是玩玩嘛。

一周热门 更多>