|
我想实现在12864画任意点,可是读出的数据总是不对,明明只点亮一个点,画出的点多显示那么两三个点,关于12864读数据时要注意的两点:一是EN要先置低,二是读数据时要先假读一次,这两个地方我都注意了,可读出的数据还是不正确,请大虾们帮帮我!谢谢大家了。
读数据及画点函数如下:
/*******************************************
函数名称:Read_Data
功 能:从液晶中读出数据
参 数:无
返回值 :无
********************************************/
uchar Read_Data()
{
uchar lcdtemp = 0,lcddata = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn; //设置P4口为输入状态
do //判忙
{
LCD_EN_H;
_NOP();
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(0x80==(lcdtemp & 0x80));
LCD_RS_H; //读数据:RS=0;RW=1
LCD_RW_H;
_NOP();
LCD_EN_L;
LCD_EN_H; //使能,读出数据
lcddata = LCD2MCU_Data;
delay_us(1);
LCD_EN_L;
delay_us(1);
return lcddata;
}
/*********************************************
函数名称:Lcd_Point
功 能:实现液晶屏上任意点(x,y)的绘画
参 数:x:横坐标(范围:0~127)
y:从坐标(范围:0~63)
color:是否点亮该点(1:点亮;0:不点亮)
返回值 :无
**********************************************/
void Lcd_Point(uchar x,uchar y,uchar color)
{
uchar i,XAddr,YAddr,BitTemp,Data_H,Data_L;
XAddr = x/16; //确定x的区域(0~8)
YAddr = y%64;
BitTemp = x%16;
if(y > 31) //change:32->31
{
XAddr +=8;
YAddr -=32;
}
Write_Cmd(0x34);
for(i=0;i<2;i++)
{
Write_Cmd(0x80 + YAddr);
Write_Cmd(0x80 + XAddr);
Data_H = Read_Data();
Data_L = Read_Data();
}
if(color == 1)
{
if(BitTemp > 7)
{
Data_L |= (0x80>>(BitTemp-8));
}
else
{
Data_H |= (0x80>>(BitTemp));
}
}
else
{
} //最后打开图形显示功能
Write_Cmd(0x80 + YAddr);
Write_Cmd(0x80 + XAddr);
Write_Data(Data_H);
Write_Data(Data_L);
Write_Cmd(0x36);
}
单片机用的是MSP430f149,液晶控制IC是ST7920。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|