搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2012-7-14 17:33:10 | 显示全部楼层 |阅读模式
本帖最后由 呼兰大侠 于 2012-7-14 18:26 编辑


(我没有测忙加了个测忙就好了 不乱吗了)


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

代码

#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!='\0')
        {        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!='\0')                  
        {        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);

}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-7-14 20:23:51 | 显示全部楼层
keil 字库补丁打了没有?

出0入0汤圆

发表于 2012-7-14 20:26:02 | 显示全部楼层
http://www.amobbs.com/forum.php? ... &highlight=0xfd

or




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-7-14 21:14:08 | 显示全部楼层
jetli 发表于 2012-7-14 20:23
keil 字库补丁打了没有?

没呢 谢谢啦~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 18:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表