一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2200|回复: 2

各位老师前辈高手们帮帮我这新手看看这个程序呗!!!

[复制链接]
发表于 2011-5-25 22:53 | 显示全部楼层 |阅读模式
我想做个16*64左移led显示屏。目前处在编程和构思上,经过先前的学习,目前只是会了单片机通过串口给led输送汉字代码实现左移控制。看了这个贴,觉得非常不错。这是原帖,16*32左移  。我原本就是想弄个实时控制,刷新汉字的。想通过这个上位机学习然后融汇贯通,但是现在的问题是这个程序我看不太懂,弄了好几天了,楼主也没标相应的注释,希望老师前辈们能百忙之中抽个空,帮我解下惑,谢谢老师前辈们了!(之前打扰了沈老师,短消息了一下,虽然老师说也不太明白,还是谢谢老师能给我回复,很幸运找到这个社区,成为其中一员,真的能学到东西)
   基本过程应该是这样的,软件生成字模,然后通过串口发送给51。接收到的字模依次存入外部ram里。
然后从TABLE里依次取字模扫描显示。



#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit  H1 = P1^0;
sbit  H2 = P1^1;
sbit  LATCH_L = P1^2;
sbit  OUT_L  = P1^3;
sbit  DS_H  = P1^4;
sbit  DS_L  = P1^5;
void display();
void rxd_data();
void in_data();
void RXD_232();
void INIT();
uchar  xdata TABLE[1500];
uchar BUFF[6];
uint ROW=0xfffe;
bit  ks_bit;
uint second;
uchar s;
uint temp,time,nib;
uchar num,left,cc;
uint count;
bit xz_bit;
uint num_int,num1_int;
void delay(uint z)
{
while(z--);
}
void main()
{  
uchar clean;
INIT();
while(1)
{  

if(xz_bit)
if(second++>=1000)
{
ks_bit=1;second=0;xz_bit=0;num_int=0;num1_int=0;
   for(clean=0;clean<64;clean++)
  {
    TABLE[(count-5)+clean+49]=0x00;
  }
}
if(ks_bit)
display();
  
  
}
}
void INIT()
{
    TMOD=0x21;
TH0=0xfc;
TL0=0x18;
TH1=0xfd;
TL1=0xfd;
EA=1;
TR0=1;
ET0=1;
TR1=1;
SM0=0;
SM1=1;
REN=1;
ES=1;

}
void RXD_232()
{


if(RI)
{
second=0;
   if(ks_bit)
   {
   nib=0;
  s=0;num=0;
     cc=0;
  ROW=0xfffe;
  left=0;
P0=255;
H2=H1=1;
H2=H1=0;
count=0;
   }
     ks_bit=0;
if(count++>=5)
{
if(((count-5)*2)>=num_int&&((count-5)*2)<num_int+32)
TABLE[((count-5)*2+64)-(num1_int)]=SBUF;
if((count-5)*2>=32+num_int&&(count-5)*2<64+num_int)
TABLE[(((count-5)*2)+1+64)-(num1_int+32)]=SBUF;
if(((count-5)*2)%64==0)
{
num1_int=num1_int+32;
num_int=num_int+64;
}
}

RI=0;
xz_bit=1;
}

}
void display()
{
P0=255;
H2=H1=1;
H2=H1=0;
     
in_data();
rxd_data();
OUT_L=0;
OUT_L=1;
P0=ROW/256;
H2=1;
H2=0;
P0=ROW%256;
H1=1;
H1=0;
num++;
if(num==16)num=0;
ROW=_irol_(ROW,1);
delay(150);
}
void rxd_data()
{ uchar l,i,temp;
if(time>=50)
{
    time=0;
left++;
if(left>=8)
  {left=0;
     cc++;  
  if(cc>=2){cc=0;nib=nib+32;
  if(nib>=count+32)nib=0;
  }
  }
}  
    for(l=0+cc;l<4+cc;l++)
    {
    temp=BUFF[l]<<left|BUFF[l+1]>>8-left;
    for(i=0;i<8;i++)
      {
   
      temp<<=1;
   DS_L=CY;
   LATCH_L=0;
   LATCH_L=1;
   }
    }
}
void in_data()
{
for(s=0;s<=2;s++)
{
BUFF[2*s+1]=TABLE[nib+s*32+1+2*num];
BUFF[2*s]=TABLE[nib+s*32+2*num];
}
}
void tim0() interrupt 1
{   
TH0=0xfc;
TL0=0x18;
time++;
}
void tim1() interrupt 4
{   
    RXD_232();
}

这是截图

这是截图
发表于 2011-5-26 08:59 | 显示全部楼层
看不懂,帮顶
据说,程序应该有注释的,以便他人、自己以后不会忘记
回复

使用道具 举报

 楼主| 发表于 2011-5-26 12:39 | 显示全部楼层
回复 2# 国望堂


    呵呵,谢谢,是啊
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-12-16 13:21 , Processed in 0.035637 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表