ST7920是一款带中文字库的点阵液晶图形液晶驱动芯片,市场有很多用此控制器成产液晶模块。我有手头就有一款型号为TS12864的液晶模块,其特点是带中文字库,显示中文汉字比较方便,另外还有3线串行驱动模式可以用于管脚少的场合。
既然是图形液晶我们就会用他的绘图功能,有时候为了不破坏原有图形(在现有图形上叠加),这个时候就需要读出原有图形数据然后加工后再次写入。官方手册上对读数据写的不够详细,在网上搜索也找不到例程,使我坡费了一般周折,还好终于搞定!现在吧详细读数据方法和步骤呈上,希望能对大家有所帮助。
官方文档的读数据描述
官方文档并行读数据时序
下面是AVR M48 8M振荡频率下并行读数据的关键部分代码:
#define ST7920_DB_PORT PORTD //ST7920数据输入
#define ST7920_DB_PIN PIND //ST7920数据输出
#define ST7920_DB_PORT_SET_OUT DDRD = 0xFF; //设置数据端口为输出
#define ST7920_DB_PORT_SET_IN DDRD = 0x00; //设置数据端口为输入
#define ST7920_ReadBF (PIND&(1 << PIND7)) //读忙碌标志位
#define ST7920_RST_SET PORTB |= (1 << PB0) //复位置位
#define ST7920_RST_CLR PORTB &= ~(1 << PB0) //复位清零
#define ST7920_E_SET PORTB |= (1 << PB1) //读写使能置位
#define ST7920_E_CLR PORTB &= ~(1 << PB1) //读写使能清零
#define ST7920_RW_SET PORTB |= (1 << PB2) //读写置位
#define ST7920_RW_CLR PORTB &= ~(1 << PB2) //读写清零
#define ST7920_RS_SET PORTB |= (1 << PB3) //显示/命令置位
#define ST7920_RS_CLR PORTB &= ~(1 << PB3) //显示/数据清零
************************************************************************
名称: unsigned char ST7920_ReadData(void)
功能: 从ST7920读数据
参数: 无
返回: uchRevData 读取的一字节数据
************************************************************************
*/
unsigned char ST7920_ReadData(void)
{
unsigned char uchRevData;
ST7920_CheckBusy(); //忙碌检测
ST7920_DB_PORT = 0xFF; //打开上拉电阻
ST7920_DB_PORT_SET_IN; //设置为输入
ST7920_RS_SET;
ST7920_RW_SET;
ST7920_E_SET;
asm("nop":;
asm("nop":;
uchRevData = ST7920_DB_PIN;
ST7920_E_CLR;
return uchRevData;
}
/*
************************************************************************
名称: unsigned int ST7920_ReadGDRAMData(unsigned char uchX ,
unsigned char uchY)
功能: 从GDRAM指定地址读取两字节数据
参数: uchX水平地址(0-127) uchY垂直地址(0-63)
返回: 读取两字节数据
************************************************************************
*/
unsigned int ST7920_ReadGDRAMData(unsigned char uchX ,unsigned char uchY)
{
unsigned int uiReadData = 0;
ST7920_GDRAMLocate(uchX, uchY); //设定GDRAM地址
ST7920_ReadData(); //先预读一次
uiReadData = ST7920_ReadData(); //读设定地址高字节数据
uiReadData = uiReadData << 8 | ST7920_ReadData(); //读设定地址低字节数据
ST7920_WriteCMD(0x36);
ST7920_WriteCMD(0x30);
return uiReadData;
}
注意:在设定好要读的地址后,要先空读一次,然后才能依次读出两个字节的数据。如果还有不明白的地方可以QQ交流。
用户1447181 2009-7-31 00:20
用户216996 2009-7-22 21:07
用户1381877 2009-4-20 14:01
用户1129670 2008-1-3 21:17
十分感谢
我看说明书 读取了一个礼拜的数据 还是没有读取出来 十分郁闷
原来要空读一次
用户1079511 2007-9-29 16:28
7920串行模式的数据传输方向是单向,顾不能读取数据,不要再此浪费时间了,更何况7920的绘图很麻烦!
用户1079511 2007-8-30 17:40
串行我没试过,但我的好多网友都说串行不能读数据!
用户1327242 2007-8-30 10:54