12864显示汉字,开始是乱码,然后正常显示

2019-07-18 11:30发布

#include<reg52.h>
#define uchar unsigned char       
#define uint  unsigned int
#define DataPort  P3
sbit E=P2^0;
sbit RW=P2^1;
sbit RS=P2^2;
sbit PSB=P2^3;
uchar code a1[]="啊啊啊啊啊啊啊啊";
uchar code a2[]="哈哈哈哈哈哈哈哈";
uchar code a3[]="啦啦啦啦啦啦啦啦";
uchar code a4[]="呃呃呃呃呃呃呃呃";
uchar d[]={0x98,0x90,0x88,0x80};
/**************延时1ms*count*****************/
void delay(int count)
{        int x,y;
for(x=0;x<count;x++)
for(y=0;y<120;y++);
}


/***********忙检测********************/
void Busy()
{
DataPort=0xFF;
RS=0;
RW=1;
while (1)
   {
E =1;
if (P0^7==0) break;
}
E=0;
}
/***********写指令子程序****************/
void Write_Com(uchar command)
{
Busy();        //检测忙标志位
RS=0;
RW=0;                                                          
DataPort=command;        //写入指令
E=1;
delay(1);                                                       
E=0;                                                                                                  
}                                                          
/***********写数据子程序***************/
void Write_Data(uchar Data)
{
Busy();
RS=1;                 
RW=0;
DataPort=Data;
E=1;
delay(1);
E=0;  
}
/***********LCD初始化*******************/
void Init_LCD(void)
{   
PSB=0;
delay(1);
PSB=1;         //将PSB置1,通信方式为8位数据并口
delay(1);
Write_Com(0x30);//30H--基本指令操作
Write_Com(0x34);   
Write_Com(0x0c);//开显示,关光标,不闪烁。
Write_Com(0x01);//清除显示  
Write_Com(0x02);
Write_Com(0x06);//指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。
Write_Com(0x04);//显示状态 全关
}
/*****************清屏***********************/
void Clear_Lcd(void)
{
Write_Com(0x01);
Write_Com(0x34);
Write_Com(0x30);
}

/*******************逐行显示***************************************/
void Lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==1)
     {X=0x80;}
   else if (X==2)
     {X=0x90;}
   else if (X==3)
     {X=0x88;}
   else if (X==4)
     {X=0x98;}
   pos = X+Y ;

   Write_Com(pos);     //显示地址
}

void main()
{
   uchar i;
   delay(100);                 //上电,等待稳定
   Init_LCD();                 //初始化LCD
   while(1)
   {
     Lcd_pos(1,0);             //设置显示位置为第一行
     for(i=0;i<16;i++)
     {
       Write_Data(a1[i]);
       delay(30);
     }

     Lcd_pos(2,0);             //设置显示位置为第二行
     for(i=0;i<16;i++)
     {
       Write_Data(a2[i]);
       delay(30);
     }
     Lcd_pos(3,0);             //设置显示位置为第三行
     for(i=0;i<16;i++)
     {
       Write_Data(a3[i]);
       delay(30);
     }
     Lcd_pos(4,0);             //设置显示位置为第四行
     for(i=0;i<16;i++)
     {
       Write_Data(a4[i]);
       delay(30);
     }
    Clear_Lcd(); //清屏函数,为下次刷新准备
   }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
武力戡乱
1楼-- · 2019-07-19 07:29
 精彩回答 2  元偷偷看……
BAO小鸟666
2楼-- · 2019-07-19 11:44
我用的是12864的液晶屏,就是在不停的刷新显示数据时,文字部分乱码,数字部分卡。是清屏问题还是时序问题。我是新手,还请多指点一下!
// 回零并调整压力-----------------------------------------------------------------------------------------------------------------------
start:        Di();
                writeCmd(0x01);          // 清屏
            writeCmd(0x0c);          // 取消光标闪烁
//-----------------------------------------------------------------
//-----------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------

                                  
Zeroing:        
                writeCmd(0x0c);          // 取消光标闪烁
                                setPosition(0,0),writeString(Zeroing);         //显示正在回零
               
                Move_to_Zero();
                while( Limit_down == 1 )
                    {
                                              
                }
                Motor2_Off();                   // 撞到零点限位,电机停止
                                Pressure_last = 33;
                delay(60000);
                            
                                direction2 = 1;                 //确定计数方向                       
                                Motor2_On();
                     
                                //delay(60000);
                                               
                       

                                writeCmd(0x01);          // 清屏
                    writeCmd(0x0c);          // 取消光标闪烁
                               
                                setPosition(0,0),writeString(Adjusting);
               
                               
                P_counting();  // 检测码盘

                Motor2_Off();                                  // 调压电机运行到设置高度后停止
                        Pressure_last = Pressure_set;  


备注:writeString(Zeroing)------应该显示“正在回零”-------但此时却显示乱码;  
         writeString(Adjusting-----应该显示“正在调压”-------但此时却显示乱码;  

我的静态显示时就没有问题,就writeString(Zeroing)、writeString(Adjusting)显示时总是刷屏(显示的是直流电机调节的情况),会出现乱码
武力戡乱
3楼-- · 2019-07-19 15:43
程序不完整啊,看不到时序啊。你参考1602的代码,只要仿真没有警告,就一定可以完美运行!
去论坛找找吧,里面很多的例子,找个没有警告的。
武力戡乱
4楼-- · 2019-07-19 18:48
另外你这个12864就是1602的一个扩展!
shiow1984
5楼-- · 2019-07-19 20:52
 精彩回答 2  元偷偷看……

一周热门 更多>