一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2745|回复: 2

如何把32x64改成32x80

[复制链接]
发表于 2012-5-2 17:25 | 显示全部楼层 |阅读模式
我的屏是32x80,现在用32x64的程序,总是有32x8的屏不能显示汉字,请教大神
#include<reg52.h>
#include"zimo.h"
#define uchar  unsigned char
#define uint   unsigned int
#define SPEED  2 //定义速度与速度成反比
#define LIGHT  8  //定义亮度:取值范围0--10
#define NUMBER 10   //定义要显示总32X32汉字个数,计算方法:NUMBER=汉字个数

#define RAD1        0          //0123全为红色 0101橙色  
#define RAD2        0          //2301全为绿色

uchar word=0,col=0,coll=0,disrow=0;//wor为要显字变量,col为位移变量,col1为字节偏移量,disrow为行变量
uchar BUFF__UP[17];    //上半屏显示缓冲 上下缓冲字节数取值=[2*板点阵宽度/8]+1比较保险,即两倍板的点阵字节数.
uchar BUFFDOWN[17];    //下半屏显示缓冲
uchar R_G[6];          //调整颜色
sbit R1=P2^2;
sbit R2=P2^3;//绿色数据

sbit CLK=P2^4;
sbit STB=P2^5;
sbit OE =P2^6;//74HC138使能:低有效
uchar Recive=1;
//根据列指针由双字节合并为单字节的子程序模块
uchar Combine_2byte(uchar h1,uchar h2)
{
uchar T_date,tempcol;
tempcol=coll;
T_date=(h1>>tempcol)|(h2<<(8-tempcol));
return T_date;
}      

//分别装载上、下半屏点阵数据
void Load_one_line(void)
{
BUFF__UP[0]=Table[word][disrow*4+0];//装载上半屏一线点阵数据
BUFF__UP[1]=Table[word][disrow*4+1];
BUFF__UP[2]=Table[word][disrow*4+2];
BUFF__UP[3]=Table[word][disrow*4+3];
BUFF__UP[4]=Table[word+1][disrow*4+0];
BUFF__UP[5]=Table[word+1][disrow*4+1];
BUFF__UP[6]=Table[word+1][disrow*4+2];
BUFF__UP[7]=Table[word+1][disrow*4+3];
BUFF__UP[8]=Table[word+2][disrow*4+0];
BUFF__UP[9]=Table[word+2][disrow*4+1];
BUFF__UP[10]=Table[word+2][disrow*4+2];
BUFF__UP[11]=Table[word+2][disrow*4+3];
BUFF__UP[12]=Table[word+3][disrow*4+0];
BUFF__UP[13]=Table[word+3][disrow*4+1];
BUFF__UP[14]=Table[word+3][disrow*4+2];
BUFF__UP[15]=Table[word+3][disrow*4+3];
BUFF__UP[16]=Table[word+4][disrow*4+3];

BUFFDOWN[0]=Table[word][64+disrow*4+0];//装载下半屏一线点阵数据
BUFFDOWN[1]=Table[word][64+disrow*4+1];
BUFFDOWN[2]=Table[word][64+disrow*4+2];
BUFFDOWN[3]=Table[word][64+disrow*4+3];
BUFFDOWN[4]=Table[word+1][64+disrow*4+0];
BUFFDOWN[5]=Table[word+1][64+disrow*4+1];
BUFFDOWN[6]=Table[word+1][64+disrow*4+2];
BUFFDOWN[7]=Table[word+1][64+disrow*4+3];
BUFFDOWN[8]=Table[word+2][64+disrow*4+0];
BUFFDOWN[9]=Table[word+2][64+disrow*4+1];
BUFFDOWN[10]=Table[word+2][64+disrow*4+2];
BUFFDOWN[11]=Table[word+2][64+disrow*4+3];
BUFFDOWN[12]=Table[word+3][64+disrow*4+0];
BUFFDOWN[13]=Table[word+3][64+disrow*4+1];
BUFFDOWN[14]=Table[word+3][64+disrow*4+2];
BUFFDOWN[15]=Table[word+3][64+disrow*4+3];
BUFFDOWN[16]=Table[word+4][64+disrow*4+3];
}

//发送屏一线点阵数据
void Send_one_line(void)
{
char s;
uchar TEMP0,TEMP1,i,inc;
if(col<8)            inc=0;
if(8<=col&&col<16)   inc=1;
if(16<=col&&col<24)  inc=2;
if(24<=col&&col<32)  inc=3;
for(s=0+inc;s<=8+inc;s++)
{
TEMP0=Combine_2byte(BUFFDOWN[s],BUFFDOWN[s+1]);
TEMP1=Combine_2byte(BUFF__UP[s],BUFF__UP[s+1]);

for(i=0;i<8;i++)
{
R_G[0]=~(TEMP1>>i)&0x01;   //取出最高位
R_G[1]=~(TEMP0>>i)&0x01;   //取出最高位
R_G[2]=0xff;
R_G[3]=0xff;
R_G[4]=0x00;
R_G[5]=0x00;

R1=R_G[RAD1];
R2=R_G[RAD2];
CLK=0;
CLK=1;                 //移位时钟
}
}
}
//亮度调节延时
void delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
{for(j=5;j>0;j--)
;
}  
}
//亮度调整
void PWM_LIGHT(uchar p)
{
OE=0;
delay(p);
OE=1;
delay(10-p);
}

void UART() interrupt 4       
{
           EA=1;
       if (RI)       //RI接受中断标志
              {
           RI=0;             //清除RI接受中断标志
           Recive=SBUF;        //SUBF接受/发送缓冲器
       //PWM_LIGHT(Recive);
       }
           EA=1;
}

//主函数入口
void main(void)
{
uchar i,move;
        SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1                             
            TMOD|= 0x20;      //定时器工作方式2                    
                PCON|= 0x80;                                                         
                TH1 = 0xE6;                // //baud*2  /*  波特率9600、数据位8、停止位1。效验位无 (12M)
            TL1 = 0xE6;         
                TR1  = 1;                                                            
                ES   = 1;        //开串口中断                  
                EA   = 1;        // 开总中断
                TR1=1;                //启动定时器1
            PS=1;                 //串口中断优先
R1=0;//数据初始化
R2=0;
while(1)
{         
for(col=0;col<32;col++)//循环32次,点亮并移动一个汉字,步进是一位,
{
coll=col%8;
move=(col-24==0)?120:SPEED;//移动几个字后停留一段时间,[有一点bug,用%不对,用—可以]
for(i=0;i<move;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
{
for(disrow=0;disrow<16;disrow++)//扫描16行   
{
Load_one_line();//装载上下两屏各一线点阵数据

Send_one_line();//发送一线点阵数据
                     
STB=1;               
STB=0;    // 输出锁存                 
P1=disrow;// 行扫描        LIGHT
PWM_LIGHT(LIGHT);
}
}
}
word=word+1;// 一个汉字移动后,指向下一个汉字
if(word>=NUMBER)
{
word=0;//移动完NUMBER个汉字后重新开始
}   
}
}
发表于 2012-5-3 00:57 | 显示全部楼层
在10年的时候试验过这个程序,原来是32X64,试验用32X80,因为时间长了,找到这个修改过的程序,不知道你能不能用,给你参考一下。原来贴https://www.yleee.com.cn/thread-4894-1-3.html

试验32X80流动显示OK.rar (90.5 KB, 下载次数: 152)
回复

使用道具 举报

 楼主| 发表于 2012-5-3 09:26 | 显示全部楼层
回复 2# shqi2003

谢谢沈老师
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-3-13 21:17 , Processed in 0.031641 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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