本帖最后由 呼兰大侠 于 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);
}
一周热门 更多>