发表于:2011/5/19 20:28:53
#0楼
如题,毕业设计做LED点阵显示屏,用protues仿真时,下位机直接显示文字没有问题了,就是利用串口调试助手送字模显示时两侧会出现少许乱码,求教是程序出问题还是送的字模有问题:
=================
系统原理图:
=================
送字模显示出现乱码图:
=================
利用串口助手发送的字模数据是汉字“业”的字模:
00 02 08 02 06 02 01 C2 00 02 FF FE 00 02 00 02 00 02 FF FE 00 42 00 82 03 02 0C 02 00 02 00 00
=================
下位机循环左移程序和protues原理图:
=================
下位机与上位机串口通信显示汉字程序:
include <REGX51.H>
#define FOSC 12 //定义晶振频率
#define INIT_TH0 0x3C //定时器T0初始值
#define INIT_TL0 0xB0
#define TMOD_T00 0x00 //定义T0为方式0,GATE=0,C/T=0,13位计数器
#define TMOD_T01 0x01 //定义T0为方式1,GATE=0,C/T=0,16位计数器
#define TMOD_T02 0x02 //定义T0为方式2,GATE=0,C/T=0,自动装入8位
//计数器
#define TMOD_T03 0x03 //定义T0为方式3,GATE=0,C/T=0,定时器0分成
//两个8位计数器,定时器1停止计数
#define uchar unsigned char //缩定定义
#define uint unsigned int
/*P1口位定义*/
/*P2 BIT Define*/
/*P3 bit define*/
/************位定义************/
sbit STTP = P2^7;
/************函数声明*************/
void delay(); //延时函数
void out_rxd(uchar *d); //汉字输出
/************汉字点阵*************/
unsigned char hanzi[1][32];
char code kong[6][32]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//显示空屏,如果只有一个字或将字全部移出必须设置一个空屏幕
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/************主函数***************/
void main()
{
unsigned char i,j,k; //i:每个字的显示循环;j每个字的显示码除以2;k每列
//刷新次数
unsigned int b=0; //显示偏移控制,char类型最多只能显示14个汉字加一个
//空白位字符
unsigned char a; //控制移动间隔时间
TMOD=0x20;TH1=0xfa;TL1=0xfa;TR1=1;
SCON=0x50;PCON=0x80;
for(i=0;i<32;i++)
{
while(RI==0);
RI=0;
hanzi[0][i]=SBUF;
}
TR1=0;SCON=0x00;
while(1)
{
j=0;
if(a>10) //移动间隔时间;取值0--255
{
a=0;
b+=2;
if(b>=256) //显示到最后一个字,回头显示,判断值=字数*32
{
b=0;
}
}
for(i=0;i<16;i++)
{
P1=i;
for(k=0;k<1;k++)
{
STTP = 0;
out_rxd(&hanzi[5][j+b+1]);
out_rxd(&hanzi[5][j+b]);
out_rxd(&hanzi[4][j+b+1]);
out_rxd(&hanzi[4][j+b]);
out_rxd(&hanzi[3][j+b+1]);
out_rxd(&hanzi[3][j+b]);
out_rxd(&hanzi[2][j+b+1]);
out_rxd(&hanzi[2][j+b]);
out_rxd(&hanzi[1][j+b+1]);
out_rxd(&hanzi[1][j+b]);
out_rxd(&hanzi[0][j+b+1]);
out_rxd(&hanzi[0][j+b]);
STTP = 1;
delay();
}
j=j+2;
a++;
}
}
}
/************子函数**************/
void delay()/*延时子程序*/
{unsigned int n;
for(n=0;n<250;n++)
{;}
}
void out_rxd(uchar *d)
{
SBUF = *d; //启动串行口传送
while(TI == 0); //等待串口传送结束
TI = 0; //将串口中断标志位置0
}
=================
这样程序只能接收一个汉字的字模显示,能否帮忙修改下能接收多个字模数据?
=================
系统原理图:
=================
送字模显示出现乱码图:
=================
利用串口助手发送的字模数据是汉字“业”的字模:
00 02 08 02 06 02 01 C2 00 02 FF FE 00 02 00 02 00 02 FF FE 00 42 00 82 03 02 0C 02 00 02 00 00
=================
下位机循环左移程序和protues原理图:
附件:
[本地下载]=================
下位机与上位机串口通信显示汉字程序:
include <REGX51.H>
#define FOSC 12 //定义晶振频率
#define INIT_TH0 0x3C //定时器T0初始值
#define INIT_TL0 0xB0
#define TMOD_T00 0x00 //定义T0为方式0,GATE=0,C/T=0,13位计数器
#define TMOD_T01 0x01 //定义T0为方式1,GATE=0,C/T=0,16位计数器
#define TMOD_T02 0x02 //定义T0为方式2,GATE=0,C/T=0,自动装入8位
//计数器
#define TMOD_T03 0x03 //定义T0为方式3,GATE=0,C/T=0,定时器0分成
//两个8位计数器,定时器1停止计数
#define uchar unsigned char //缩定定义
#define uint unsigned int
/*P1口位定义*/
/*P2 BIT Define*/
/*P3 bit define*/
/************位定义************/
sbit STTP = P2^7;
/************函数声明*************/
void delay(); //延时函数
void out_rxd(uchar *d); //汉字输出
/************汉字点阵*************/
unsigned char hanzi[1][32];
char code kong[6][32]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//显示空屏,如果只有一个字或将字全部移出必须设置一个空屏幕
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/************主函数***************/
void main()
{
unsigned char i,j,k; //i:每个字的显示循环;j每个字的显示码除以2;k每列
//刷新次数
unsigned int b=0; //显示偏移控制,char类型最多只能显示14个汉字加一个
//空白位字符
unsigned char a; //控制移动间隔时间
TMOD=0x20;TH1=0xfa;TL1=0xfa;TR1=1;
SCON=0x50;PCON=0x80;
for(i=0;i<32;i++)
{
while(RI==0);
RI=0;
hanzi[0][i]=SBUF;
}
TR1=0;SCON=0x00;
while(1)
{
j=0;
if(a>10) //移动间隔时间;取值0--255
{
a=0;
b+=2;
if(b>=256) //显示到最后一个字,回头显示,判断值=字数*32
{
b=0;
}
}
for(i=0;i<16;i++)
{
P1=i;
for(k=0;k<1;k++)
{
STTP = 0;
out_rxd(&hanzi[5][j+b+1]);
out_rxd(&hanzi[5][j+b]);
out_rxd(&hanzi[4][j+b+1]);
out_rxd(&hanzi[4][j+b]);
out_rxd(&hanzi[3][j+b+1]);
out_rxd(&hanzi[3][j+b]);
out_rxd(&hanzi[2][j+b+1]);
out_rxd(&hanzi[2][j+b]);
out_rxd(&hanzi[1][j+b+1]);
out_rxd(&hanzi[1][j+b]);
out_rxd(&hanzi[0][j+b+1]);
out_rxd(&hanzi[0][j+b]);
STTP = 1;
delay();
}
j=j+2;
a++;
}
}
}
/************子函数**************/
void delay()/*延时子程序*/
{unsigned int n;
for(n=0;n<250;n++)
{;}
}
void out_rxd(uchar *d)
{
SBUF = *d; //启动串行口传送
while(TI == 0); //等待串口传送结束
TI = 0; //将串口中断标志位置0
}
=================
这样程序只能接收一个汉字的字模显示,能否帮忙修改下能接收多个字模数据?
[此贴子已经被作者于2011/5/19 20:36:26编辑过]