继之前的一个问题,现在又要提出新的问题了
时间:10-02
整理:3721RD
点击:
http://bbs.elecfans.com/jishu_545036_1_1.html
这是之前的帖子,现在的情况是串口助手与蓝牙的传输解决了一部分,发送英文数字能返回了,中文还是出了点问题,这是我的程序:
#include <REG51.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define lcddata P2
#define busy 0x80
//延时子程序模块
//**********************************************
void mdelay(uint delay)
{ uint i;
for(;delay>0;delay--)
{for(i=0;i<80;i++) //1ms延时.
{;}
}
}
//************************************************
void show(); //液晶显示程序
//****************************************
//12864液晶显示部分子程序模块
//****************************************
sbit rs=P3^7;//定义引脚
sbit rw=P3^6;
sbit e=P3^5;
sbit PSB = P0^3; //PSB脚为12864-12系列的串、并通讯功能切换,使用8位并行接口,PSB=1
void wr_d_lcd(uchar content);
void wr_i_lcd(uchar content);
void clrram_lcd (void);
void init_lcd(void);
void busy_lcd(void);
void rev_row_lcd(uchar row);
void rev_co_lcd(uchar row,uchar col,uchar mode);
void clr_lcd(void);
void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);
void wr_row_lcd(uchar row,char *p);
uint id=0;
uchar data table[30];
//**********************************
//液晶初始化
//**********************************
void init_lcd(void)
{
wr_i_lcd(0x06); /*光标的移动方向*/
wr_i_lcd(0x0c); /*开显示,关游标*/
}
//***********************************
//填充液晶DDRAM全为空格
//**********************************
void clrram_lcd (void)
{
wr_i_lcd(0x30);
wr_i_lcd(0x01);
}
//***********************************
//对液晶写数据
//content为要写入的数据 写入地址
//***********************************
void wr_d_lcd(uchar content)
{
busy_lcd();
rs=1;
rw=0;
lcddata=content;
e=1;
;
e=0;
}
//********************************
//对液晶写指令
//content为要写入的指令代码 写入数据
//*****************************
void wr_i_lcd(uchar content)
{
busy_lcd();
rs=0;
rw=0;
lcddata=content;
e=1;
;
e=0;
}
//********************************
//液晶检测忙状态
//在写入之前必须执行
//********************************
void busy_lcd(void)
{
lcddata=0xff;
rs=0;
rw=1;
e =1;
while(busy==1);
e =0;
}
//********************************
//指定要显示字符的坐标
//*******************************
void gotoxy(unsigned char y, unsigned char x)
{
if(y==1)
wr_i_lcd(0x80|x);
if(y==2)
wr_i_lcd(0x90|x);
if(y==3)
wr_i_lcd((0x80|x)+8);
if(y==4)
wr_i_lcd((0x90|x)+8);
}
//**********************************
//液晶显示字符串程序
//**********************************
void print(uchar *str)
{
while(*str!='\0')
{
wr_d_lcd(*str);
str++;
}
}
void send(uchar *dis)
{
while(*dis!='\0') {
SBUF=*dis;
dis++;
while(!TI);
{
TI=0;
//软件请发送中断
}
}
}
//***************************************
//液晶显示主程序模块
//***************************************
uchar aa[]={"d5电子"};//这个是测试显示,发现只要设置单字符和中文在一起就乱码,如:ds5信息,汉字就乱码
void show()
{
gotoxy(1,0);
print("欢a光临锐志电子");
mdelay(200);
gotoxy(2,0);
print("【锐志电子】");
mdelay(200); //扫描延时
gotoxy(3,0);
print(aa);
mdelay(200); //扫描延时
gotoxy(4,0);
print(table);
mdelay(200); //扫描延时
}
void serial_init(void)
{
TMOD=0x20;//计时器1作为比特率发生器方式2
TH1=0xe8;
TL1=0xe8; //装入初值 ,这里原来是9600的波特率,串口助手接收中文的话要先输入一个数字(一个字节),不知为什么,英文则不用,串口助手就可以接收到几个正确的中文,后面乱码,后来有人告诉我,9600的波特率传输可能太快,于是我改成了现在1200,串口助手不能接收中文了,但数字英文能接收接近30个不丢失。
TR1=1;//计时中断允许
SM0=0;
SM1=1;//串行口工作于方式2
ES=1;//串行口中断允许
REN=1;//接收允许
EA=1;// 总中断允许
}
//************************************
//主程序
//*************************************
main()
{
init_lcd();
clrram_lcd();
serial_init();
while(1)
{
show(); //液晶显示数据
}
}
/*****************************************
程序中断部分
*****************************************/
void Serial_INT() interrupt 4
{
if(RI)
{
ES=0; //关串口中断
table[id]=SBUF;
id++;//命令存到命令数组
RI=0; //软件清除接收中断
if(table[id]=='\0')//我在这里测试过table[id]=='#'然后在返回串口助手的send[]位置也这样设置,但发送的结尾是#的字符串并没有返回,不知为什么。
{
id=0;
send(table); //将单片机接收完成的字符串发送回计算机
}
ES=1;//开串口中断
}
}
我想着既然我的table[],能正确返回数字英文,那table[]已经接收到并储存了我发送的字符串。于是我直接把它显示在lcd上,结果数字英文只能显示最后一个,中文空白,可以看到send[]和print[]两个函数意思是一样的,只不过显示的地方不一样而已,但是手机能正常接收,lcd却只收到最后一个字符,预设的字符串也能正常显示出来,我目前没想通这个问题。有没有高手能解答。
这是之前的帖子,现在的情况是串口助手与蓝牙的传输解决了一部分,发送英文数字能返回了,中文还是出了点问题,这是我的程序:
#include <REG51.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define lcddata P2
#define busy 0x80
//延时子程序模块
//**********************************************
void mdelay(uint delay)
{ uint i;
for(;delay>0;delay--)
{for(i=0;i<80;i++) //1ms延时.
{;}
}
}
//************************************************
void show(); //液晶显示程序
//****************************************
//12864液晶显示部分子程序模块
//****************************************
sbit rs=P3^7;//定义引脚
sbit rw=P3^6;
sbit e=P3^5;
sbit PSB = P0^3; //PSB脚为12864-12系列的串、并通讯功能切换,使用8位并行接口,PSB=1
void wr_d_lcd(uchar content);
void wr_i_lcd(uchar content);
void clrram_lcd (void);
void init_lcd(void);
void busy_lcd(void);
void rev_row_lcd(uchar row);
void rev_co_lcd(uchar row,uchar col,uchar mode);
void clr_lcd(void);
void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);
void wr_row_lcd(uchar row,char *p);
uint id=0;
uchar data table[30];
//**********************************
//液晶初始化
//**********************************
void init_lcd(void)
{
wr_i_lcd(0x06); /*光标的移动方向*/
wr_i_lcd(0x0c); /*开显示,关游标*/
}
//***********************************
//填充液晶DDRAM全为空格
//**********************************
void clrram_lcd (void)
{
wr_i_lcd(0x30);
wr_i_lcd(0x01);
}
//***********************************
//对液晶写数据
//content为要写入的数据 写入地址
//***********************************
void wr_d_lcd(uchar content)
{
busy_lcd();
rs=1;
rw=0;
lcddata=content;
e=1;
;
e=0;
}
//********************************
//对液晶写指令
//content为要写入的指令代码 写入数据
//*****************************
void wr_i_lcd(uchar content)
{
busy_lcd();
rs=0;
rw=0;
lcddata=content;
e=1;
;
e=0;
}
//********************************
//液晶检测忙状态
//在写入之前必须执行
//********************************
void busy_lcd(void)
{
lcddata=0xff;
rs=0;
rw=1;
e =1;
while(busy==1);
e =0;
}
//********************************
//指定要显示字符的坐标
//*******************************
void gotoxy(unsigned char y, unsigned char x)
{
if(y==1)
wr_i_lcd(0x80|x);
if(y==2)
wr_i_lcd(0x90|x);
if(y==3)
wr_i_lcd((0x80|x)+8);
if(y==4)
wr_i_lcd((0x90|x)+8);
}
//**********************************
//液晶显示字符串程序
//**********************************
void print(uchar *str)
{
while(*str!='\0')
{
wr_d_lcd(*str);
str++;
}
}
void send(uchar *dis)
{
while(*dis!='\0') {
SBUF=*dis;
dis++;
while(!TI);
{
TI=0;
//软件请发送中断
}
}
}
//***************************************
//液晶显示主程序模块
//***************************************
uchar aa[]={"d5电子"};//这个是测试显示,发现只要设置单字符和中文在一起就乱码,如:ds5信息,汉字就乱码
void show()
{
gotoxy(1,0);
print("欢a光临锐志电子");
mdelay(200);
gotoxy(2,0);
print("【锐志电子】");
mdelay(200); //扫描延时
gotoxy(3,0);
print(aa);
mdelay(200); //扫描延时
gotoxy(4,0);
print(table);
mdelay(200); //扫描延时
}
void serial_init(void)
{
TMOD=0x20;//计时器1作为比特率发生器方式2
TH1=0xe8;
TL1=0xe8; //装入初值 ,这里原来是9600的波特率,串口助手接收中文的话要先输入一个数字(一个字节),不知为什么,英文则不用,串口助手就可以接收到几个正确的中文,后面乱码,后来有人告诉我,9600的波特率传输可能太快,于是我改成了现在1200,串口助手不能接收中文了,但数字英文能接收接近30个不丢失。
TR1=1;//计时中断允许
SM0=0;
SM1=1;//串行口工作于方式2
ES=1;//串行口中断允许
REN=1;//接收允许
EA=1;// 总中断允许
}
//************************************
//主程序
//*************************************
main()
{
init_lcd();
clrram_lcd();
serial_init();
while(1)
{
show(); //液晶显示数据
}
}
/*****************************************
程序中断部分
*****************************************/
void Serial_INT() interrupt 4
{
if(RI)
{
ES=0; //关串口中断
table[id]=SBUF;
id++;//命令存到命令数组
RI=0; //软件清除接收中断
if(table[id]=='\0')//我在这里测试过table[id]=='#'然后在返回串口助手的send[]位置也这样设置,但发送的结尾是#的字符串并没有返回,不知为什么。
{
id=0;
send(table); //将单片机接收完成的字符串发送回计算机
}
ES=1;//开串口中断
}
}
我想着既然我的table[],能正确返回数字英文,那table[]已经接收到并储存了我发送的字符串。于是我直接把它显示在lcd上,结果数字英文只能显示最后一个,中文空白,可以看到send[]和print[]两个函数意思是一样的,只不过显示的地方不一样而已,但是手机能正常接收,lcd却只收到最后一个字符,预设的字符串也能正常显示出来,我目前没想通这个问题。有没有高手能解答。
你中文做好了字库了没有啊,没有字库是不显示 的,显示也是乱的。
关于我提出的问题我已经解决了 谢谢
