初级会员
主题
回帖0
积分70
阅读权限10
注册时间2012-4-29
最后登录1970-1-1
在线时间 小时
|
我的屏是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个汉字后重新开始
}
}
} |
|