大家好,我有个问题 我在 89c52 上面好用,但是转移到 stc12c5 上面就乱了。
之前在89c52上面写的程序,一切正常,在12864屏幕上面显示四行字,但是换成12系列单片机之后就全是乱码了,所有的延时我都延长了,还是不行,请指教。#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Lcd_IO P0
#define Commd 0
#define Data 1
sbit LCDRS=P3^4; //12864是数据选择端还是指令选择端
sbit LCDRW=P3^5; //12864的读写操作端
sbit LCDEN=P3^6; //12864的使能端
sbit LCDPSB=P3^7; //选择12864是并行输入还是串行输入
sbit wei=P2^7; //定义数码管的位选
sbit duan=P2^6; //定义数码管的段选
void DelayUs(uint iNumber)
{
for(iNumber=0;iNumber>0;iNumber--);
}
void DelayMs(uint Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber<Delay_MS;iNumber++)
{
iValue=107;
while(iValue--);
}
}
void WriteLCD_CommdData(uchar cCommd,uchar cData)
{
if(cCommd)
LCDRS=1; //数据
else LCDRS=0; //命令
Lcd_IO=cData;
LCDRW=0;
LCDEN=1;
DelayUs(30);
LCDEN=0;
}
void Init_LCD() //液晶初始化
{
DelayUs(10); //外部复位
LCDPSB=1; //选择12864为并行模式
WriteLCD_CommdData(Commd,0x30); //基本指令格式
DelayUs(30);
WriteLCD_CommdData(Commd,0x01); //液晶清屏
DelayMs(30);
WriteLCD_CommdData(Commd,0x06); //设置显示格式,光标位置
WriteLCD_CommdData(Commd,0x0c);
}
void LCD_Position(uchar cX,uchar cY) //设置显示坐标
{
uint iLine;
switch(cY) //判断要显示在那一行
{
case 0:iLine=0x00;break;
case 1:iLine=0x10;break;
case 2:iLine=0x08;break;
case 3:iLine=0x18;break;
default :break;
}
WriteLCD_CommdData(Commd,0x80+iLine+cX); //把地址写给12864
}
void Write_String(uchar *cString)
{
while(*cString!='\0') //判断是否到了字符串末尾
{
WriteLCD_CommdData(Data,*cString);
cString++;
}
}
void main()
{
wei=1;
P0=0XFF;
wei=0;
duan=1;
P0=0x00;
duan=0;
Init_LCD(); //初始化12864液晶
LCD_Position(0,0); //定义显示在第一行的字符串的位置
Write_String("1234566788"); //写入要显示的字符串
LCD_Position(0,1); //定义显示在第二行的字符串的位置
Write_String("哈尔滨香坊区");//写入要显示的字符串
LCD_Position(0,2); //定义显示在第三行的字符串的位置
Write_String("jackliao"); //写入要显示的字符串
LCD_Position(0,3); //定义显示在第四行的字符串的位置
Write_String(" 12864 LCD test"); //写入要显示的字符串
while(1);
}