LCD12864的描点,画线函数在STC89C52上可以跑通,但是在STC12C5A60S2上不行。
最近在研究12864的51单片机驱动,首先描点画线函数在STC89C52上已经运行成功了,但是换了1T的单片机STC12C5A60S2就不行了。无显示效果。其余的函数如显...
最近在研究12864的51单片机驱动,首先描点画线函数在STC89C52上已经运行成功了,但是换了1T的单片机STC12C5A60S2就不行了。无显示效果。其余的函数如显示字符串的函数任然可以跑通。请教大神这是什么问题呢?
/*********************************************************
*
* 画点函数
*
*********************************************************/
void Lcd12864_DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
{
unsigned char Row,Tier,Tier_bit ;
unsigned char ReadOldH,ReadOldL ;
lcd_wcmd(0x34);
delayNOP();
lcd_wcmd(0x36);
delayNOP();
Tier=X>>4 ;
Tier_bit=X&0x0f ;
if(Y<32)
{
Row=Y ;
}
else
{
Row=Y-32 ;
Tier+=8 ;
}
lcd_wcmd(Row+0x80);
delayNOP();
lcd_wcmd(Tier+0x80);
delayNOP();
lcd_rdat();
delayNOP();
ReadOldH=lcd_rdat();
delayNOP();
ReadOldL=lcd_rdat();
delayNOP();
lcd_wcmd(Row+0x80);
delayNOP();
lcd_wcmd(Tier+0x80);
delayNOP();
if(Tier_bit<8)
{
switch(Color)
{
case 0 :
ReadOldH&=(~(0x01<<(7-Tier_bit)));
break ;
case 1 :
ReadOldH|=(0x01<<(7-Tier_bit));
break ;
case 2 :
ReadOldH^=(0x01<<(7-Tier_bit));
break ;
default :
break ;
}
lcd_wdat(ReadOldH);
delayNOP();
lcd_wdat(ReadOldL);
delayNOP();
}
else
{
switch(Color)
{
case 0 :
ReadOldL&=(~(0x01<<(15-Tier_bit)));
break ;
case 1 :
ReadOldL|=(0x01<<(15-Tier_bit));
break ;
case 2 :
ReadOldL^=(0x01<<(15-Tier_bit));
break ;
default :
break ;
}
lcd_wdat(ReadOldH);
delayNOP();
lcd_wdat(ReadOldL);
delayNOP();
}
lcd_wcmd(0x30);
// delay1(1);
}
以上是画点函数。只要换了单片机,一样的程序立马就可以成功。 展开
/*********************************************************
*
* 画点函数
*
*********************************************************/
void Lcd12864_DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
{
unsigned char Row,Tier,Tier_bit ;
unsigned char ReadOldH,ReadOldL ;
lcd_wcmd(0x34);
delayNOP();
lcd_wcmd(0x36);
delayNOP();
Tier=X>>4 ;
Tier_bit=X&0x0f ;
if(Y<32)
{
Row=Y ;
}
else
{
Row=Y-32 ;
Tier+=8 ;
}
lcd_wcmd(Row+0x80);
delayNOP();
lcd_wcmd(Tier+0x80);
delayNOP();
lcd_rdat();
delayNOP();
ReadOldH=lcd_rdat();
delayNOP();
ReadOldL=lcd_rdat();
delayNOP();
lcd_wcmd(Row+0x80);
delayNOP();
lcd_wcmd(Tier+0x80);
delayNOP();
if(Tier_bit<8)
{
switch(Color)
{
case 0 :
ReadOldH&=(~(0x01<<(7-Tier_bit)));
break ;
case 1 :
ReadOldH|=(0x01<<(7-Tier_bit));
break ;
case 2 :
ReadOldH^=(0x01<<(7-Tier_bit));
break ;
default :
break ;
}
lcd_wdat(ReadOldH);
delayNOP();
lcd_wdat(ReadOldL);
delayNOP();
}
else
{
switch(Color)
{
case 0 :
ReadOldL&=(~(0x01<<(15-Tier_bit)));
break ;
case 1 :
ReadOldL|=(0x01<<(15-Tier_bit));
break ;
case 2 :
ReadOldL^=(0x01<<(15-Tier_bit));
break ;
default :
break ;
}
lcd_wdat(ReadOldH);
delayNOP();
lcd_wdat(ReadOldL);
delayNOP();
}
lcd_wcmd(0x30);
// delay1(1);
}
以上是画点函数。只要换了单片机,一样的程序立马就可以成功。 展开
2个回答
展开全部
我用的也是STC5A60S2,LCD为QC12864B(ST7920字库型),但我没遇到你的情况,仅提供点建议作参考:
1、 从AT89C52转到STC5A60S2中运行时,不要忘记把 #include "REG52.h"改成
#include "STC12C5A60S2.h",并把STC12C5A60S2.h文件放入项目文件夹内,再编译。
2、晶振用11.0592MHz就行了,不要太高。
3、我的描点函数(请自行对比)
void LCD_DrawPoint(uchar x,uchar y,uchar flag) //画点函数
{
uchar x_Byte; //X-字节变量
uchar x_bit; //x-位变量
uchar y_Byte; //y-字节变量
uchar y_bit; //y-位变量
uchar hbit; //高8位变量
uchar lbit; //低8位变量
x_Byte=x/16; //计算在16个字节中的那一个,范围在0~7
x_bit=x&0x0f; //x_bit=x%16;计算在该字节中的哪一位,
y_Byte=y/32; //确定上,下半屏,0为上,1为下
y_bit=y&0x1f; //y_byte=y%32,确定它在第几行
LCD_WriteCmd(0x34); //扩充指令集
LCD_WriteCmd(0x36); //扩充指令集,绘图开
LCD_WriteCmd(0x36); //扩充指令集,绘图开
LCD_WriteCmd(0x80+y_bit); //写入垂直坐标地址确定在第几行
LCD_WriteCmd(0x80+x_Byte+8*y_Byte); //8*y_Dyte表示确认上半屏还是下半屏
LCD_Read_1Byte(); //空读一次
hbit=LCD_Read_1Byte(); //读取高字节
lbit=LCD_Read_1Byte(); //读取低字节
LCD_WriteCmd(0x80+y_bit); //读操作会改变AC的值,所以要重新设置一次地址
LCD_WriteCmd(0x80+x_Byte+8*y_Byte); //重新找到地址
if(flag==1) //说明是要点亮该点
{
if(x_bit<8) //判断在高8位还是低8位,小于8说明是在高8位
{
LCD_WriteData(hbit|(0x01<<(7-x_bit))); //写入修改后的高8位数据到GDRAM区
LCD_WriteData(lbit); //写入没有修改的低8位数据到GDRAM区
}
else //说明是低8位
{
LCD_WriteData(hbit); //写入没有修改的高8位数据到GDRAM区
LCD_WriteData(lbit|(0x01<<(15-x_bit))); //写入修改后的低8位数据到GDRAM区
}
}
else //说明是要熄灭该点
{
if(x_bit<8) //判断其在高八位,还是低八位
{
LCD_WriteData(hbit&~(0x01<<(7-x_bit)));//显示GDRAM区高八位
LCD_WriteData(lbit); //显示GMRAM区低八位
}
else
{
LCD_WriteData(hbit);
LCD_WriteData(lbit&~(0x01<<(15-x_bit)));
}
}
LCD_WriteCmd(0x30); //绘图开关关,返回基本指令集
}
1、 从AT89C52转到STC5A60S2中运行时,不要忘记把 #include "REG52.h"改成
#include "STC12C5A60S2.h",并把STC12C5A60S2.h文件放入项目文件夹内,再编译。
2、晶振用11.0592MHz就行了,不要太高。
3、我的描点函数(请自行对比)
void LCD_DrawPoint(uchar x,uchar y,uchar flag) //画点函数
{
uchar x_Byte; //X-字节变量
uchar x_bit; //x-位变量
uchar y_Byte; //y-字节变量
uchar y_bit; //y-位变量
uchar hbit; //高8位变量
uchar lbit; //低8位变量
x_Byte=x/16; //计算在16个字节中的那一个,范围在0~7
x_bit=x&0x0f; //x_bit=x%16;计算在该字节中的哪一位,
y_Byte=y/32; //确定上,下半屏,0为上,1为下
y_bit=y&0x1f; //y_byte=y%32,确定它在第几行
LCD_WriteCmd(0x34); //扩充指令集
LCD_WriteCmd(0x36); //扩充指令集,绘图开
LCD_WriteCmd(0x36); //扩充指令集,绘图开
LCD_WriteCmd(0x80+y_bit); //写入垂直坐标地址确定在第几行
LCD_WriteCmd(0x80+x_Byte+8*y_Byte); //8*y_Dyte表示确认上半屏还是下半屏
LCD_Read_1Byte(); //空读一次
hbit=LCD_Read_1Byte(); //读取高字节
lbit=LCD_Read_1Byte(); //读取低字节
LCD_WriteCmd(0x80+y_bit); //读操作会改变AC的值,所以要重新设置一次地址
LCD_WriteCmd(0x80+x_Byte+8*y_Byte); //重新找到地址
if(flag==1) //说明是要点亮该点
{
if(x_bit<8) //判断在高8位还是低8位,小于8说明是在高8位
{
LCD_WriteData(hbit|(0x01<<(7-x_bit))); //写入修改后的高8位数据到GDRAM区
LCD_WriteData(lbit); //写入没有修改的低8位数据到GDRAM区
}
else //说明是低8位
{
LCD_WriteData(hbit); //写入没有修改的高8位数据到GDRAM区
LCD_WriteData(lbit|(0x01<<(15-x_bit))); //写入修改后的低8位数据到GDRAM区
}
}
else //说明是要熄灭该点
{
if(x_bit<8) //判断其在高八位,还是低八位
{
LCD_WriteData(hbit&~(0x01<<(7-x_bit)));//显示GDRAM区高八位
LCD_WriteData(lbit); //显示GMRAM区低八位
}
else
{
LCD_WriteData(hbit);
LCD_WriteData(lbit&~(0x01<<(15-x_bit)));
}
}
LCD_WriteCmd(0x30); //绘图开关关,返回基本指令集
}
2014-05-02
展开全部
5A60S2比传统51快8-12倍,适当增加延时
更多追问追答
追问
延时函数是放在哪边呢?延时多长时间合适?
追答
可以先尝试将所有的延时部分,延长12倍,尤其是读写指令,按照12864的指令表上的时间来修改
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询