微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 继之前的一个问题,现在又要提出新的问题了

继之前的一个问题,现在又要提出新的问题了

时间: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却只收到最后一个字符,预设的字符串也能正常显示出来,我目前没想通这个问题。有没有高手能解答。

你中文做好了字库了没有啊,没有字库是不显示 的,显示也是乱的。

关于我提出的问题我已经解决了   谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top