12864 st7920 乱码 复位乱码(以解决)

2020-02-05 08:48发布

本帖最后由 呼兰大侠 于 2012-7-14 18:26 编辑

2012-07-14_16-36-26_882.jpg (3.23 MB, 下载次数: 0) 下载附件 乱码 2012-7-14 17:30 上传 (我没有测忙加了个测忙就好了 不乱吗了)


我需要不断的按复位键,才有很小的几率出现正确情况,其他均为乱码为毛啊? 跟软件复位时间长短有关系吗?
求指导!!!!

代码

#include <stc12c5a.h>
#define uchar unsigned char
#define uint unsigned int
#include<intrins.h>

/********************************液晶端口定义**************************/
#define  lcd_data          P1                        //数据口       
sbit RS=P3^3;                                //选择寄存器(并行) 0:指令寄存器 1:数据寄存器;
sbit RW=P3^4;                                //读写控制脚(并行) 0:写入 1:读出
sbit E=P3^5;                                //读写数据启始脚(并行)
sbit PSB=P3^6;                                 //串并方式选择引脚,0为串行模式,1为8/4位数据口模式
sbit rst=P3^7;                                //复位引脚

//***********************************************************************************************
//说明:带字库的12864液晶(ST7920)驱动程序
//创建人:赵山          shanzhao_work@qq.com               
//创建日期:2009-9-18 23:20
//欢迎转载,转载请注明作者及出处!谢谢!
//***********************************************************************************************


//********************************************************
//延时函数
//********************************************************
void delay(uchar x)
{ uchar i;
for(i=x;i>0;i--)
        {_nop_();
        _nop_();}
}

void delay_ms(uint x)
{
        uint i,y;
        for(i=x;i>0;i--)       
                for(y=1000;y>0;y--)
                        _nop_();
}
//********************************************************
//写命令函数
//********************************************************
void LcdWcom(unsigned char WCom)
{
          delay(1);
          RS=0;                                                //指明操作对象为指令寄存器
          RW=0;
          E=0;
          delay(2);                                                //指明为写操作
          E=1;
          lcd_data=WCom;
          delay(5);                        //将命令写入总线
          E=0;
}

//********************************************************
//写数据函数
//********************************************************               
void LcdWdata(unsigned char WData)
{
          delay(1);
          RS=1;                                                //指明操作对象为数据寄存器
          RW=0;                                                //指明为写操作
          E=0;
          delay(2);
          E=1;
          lcd_data=WData;
          delay(5);                        //将数据写入总线
          E=0;
}

//********************************************************
//清屏函数
//********************************************************
void Display_Clear(void)
{
        LcdWcom(0x01);                                //写入清楚显示命令0x01
        delay(100);
}

//********************************************************
//显示初始化函数
//********************************************************
void Display_Init(void)
{
                                //延时45ms
        PSB=1;                                        //8位并行口
        //复位操作
        rst=1;
        delay_ms(45);
        rst=0;
        delay_ms(45);
        rst=1;
        delay_ms(45);       
        //功能设定
        LcdWcom(0x30);                                //设置为8位并行口,基本指令集
        delay(120);
        LcdWcom(0x30);                                //再次设置为8位并行口,基本指令集
        delay(40);
//        //显示开关控制
        LcdWcom(0x0c);                                //游标显示关,正常显示,整体显示开
        delay(120);
        //清除显示
        LcdWcom(0x01);       
        delay_ms(15);                                //延时12ms
        //进入点设置
        LcdWcom(0x06);                                 //设置为游标右移,DDRAM位地址加1,画面不移动
        delay(5);
//        LcdWcom(0x0C);                                //开显示
}

//********************************************************
//设置光标函数
//参数说明:x为行号,y为列号
//********************************************************
void Set_Cursor(unsigned char x, unsigned char y)
{
        unsigned char i;
        switch(x)                                                                   //确定行号
        {
                case 0x00: i=0x80; break;                                //第一行
                case 0x01: i=0x90; break;                                 //第二行
                case 0x02: i=0x88; break;                                 //第三行
                case 0x03: i=0x98; break;                                 //第四行
                default : break;
        }
        i=y+i;                                                                         //确定列号
        LcdWcom(i);
}


//********************************************************
//显示字符函数
//********************************************************
void Display_Char(unsigned char Alphabet)
{
        LcdWdata(Alphabet);                        //写入需要显示字符的显示码
}

//********************************************************
//指定位置显示字符串函数
//参数说明:x为行号,y为列号
//********************************************************
void Display_String(unsigned char x,unsigned char y,unsigned char *Alphabet)
{
        unsigned char i=0;
        delay(100);
        Set_Cursor(x,y);                                //设置显示的起始地址
        while(Alphabet!='')
        {        delay(100);
                LcdWdata(Alphabet);                        //写入需要显示字符的显示码
                i++;
        }
}

//********************************************************
//指定位置显示汉字函数
//参数说明:x为行号,y为列号
//********************************************************
void Display_HZ(unsigned char x,unsigned char y,unsigned char *HZ)
{        delay(200);
        Set_Cursor(x,y);
        delay(200);                        //设置显示的起始地址
        LcdWdata(HZ[0]);                        //写入需要显示汉字的高八位数据
        LcdWdata(HZ[1]);                        //写入需要显示字符的低八位数据
}

//********************************************************
//指定位置显示一行汉字函数,可自动换行
//参数说明:x为行号,y为列号
//********************************************************
void Display_HZ_Line(unsigned char x,unsigned char y,unsigned char *HZ)
{
        unsigned char i=0;
        delay(100);
        Set_Cursor(x,y);                                //设置显示的起始地址
        while(HZ!='')                  
        {        delay(100);
                LcdWdata(HZ[i++]);                        //写入需要显示汉字的高八位数据
                LcdWdata(HZ[i++]);                        //写入需要显示字符的低八位数据
                if((y+i)%16==0)                                //如果满一行
                {       
                        x++;
                        if(x==4)                                //如果满一屏
                                x=0;
                        Set_Cursor(x,0);                //重新设置显示的起始地址
                }
        }
}


//**************************************************************************
//说明:程序主函数
//**************************************************************************
void main(void)
{             
/***********************液晶初始化***************************/
Display_Init();
/**********************显示单个字符*************************/
Set_Cursor(0,0);        //光标地址设定
Display_Char(0x21);        //显示字符!
/***********************显示字符串*************************/
Display_String(1,0,"WWW.AMOMO.COM");   //显示字符串
/************************显示汉字*************************/
Display_HZ(0,1,"织");       //显示电
Display_HZ(0,2,"田");       //显示子
Display_HZ(0,3,"信");       //显示园
Display_HZ(0,4,"长");       //显示园
/************************显示一行汉字*********************/
Display_HZ_Line(2,0,"乱码乱你妹求助!");//显示一行汉字
while(1);

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
jetli
1楼-- · 2020-02-05 09:19
 精彩回答 2  元偷偷看……
jetli
2楼-- · 2020-02-05 10:59
http://www.amobbs.com/forum.php? ... &highlight=0xfd

or

ccKeilVxx_OxFD字库补丁.rar (10.32 KB, 下载次数: 20) 2012-7-14 20:25 上传 点击文件名下载附件


呼兰大侠
3楼-- · 2020-02-05 14:10
jetli 发表于 2012-7-14 20:23
keil 字库补丁打了没有?

没呢 谢谢啦~~

一周热门 更多>