该液晶 模块为240*128,RA8822芯片,CM240128-7型号,使用AVR ATMega32单片机驱动,以下为源程序。子程序CM240128.h同样适用于80C51,只需要去掉主程序中的预定义_CM240128_AVR,并且稍微修改主程序即可。
#include
<
mega32.h
>
#include < delay.h >
#define _CM240128_AVR // for AVR ATMega32
#include " CM240128.h "
uchar ss[] = " 液晶显示屏CM240128-7 " ;
void main()
... {
// 等待几秒钟
uchar i;
#ifdef _CM240128_AVR
DDRA = 0xFF; /**//* output */
PORTA = 0xFF; /**//* all off */
DDRB = 0xFF;
PORTB = 0xFF;
DDRD = 0xFF; /**//* output */
PORTD = 0xFF; /**//* all off */
#endif
for(i=0; i<20; i++)
delay_ms(200);
LCD_Reset();
LCD_Initial();
LCD_Clear();
GotoXY(6,0); // 设定光标位置
PrintStr(ss, 1);
}
#include < delay.h >
#define _CM240128_AVR // for AVR ATMega32
#include " CM240128.h "
uchar ss[] = " 液晶显示屏CM240128-7 " ;
void main()
... {
// 等待几秒钟
uchar i;
#ifdef _CM240128_AVR
DDRA = 0xFF; /**//* output */
PORTA = 0xFF; /**//* all off */
DDRB = 0xFF;
PORTB = 0xFF;
DDRD = 0xFF; /**//* output */
PORTD = 0xFF; /**//* all off */
#endif
for(i=0; i<20; i++)
delay_ms(200);
LCD_Reset();
LCD_Initial();
LCD_Clear();
GotoXY(6,0); // 设定光标位置
PrintStr(ss, 1);
}
以下为功能子程序:
/**/
/*
CM240128.h
液晶模块控制芯片为RA8822,型号为CM240128-7
使用RA8822英文版文档中的源代码修改而得。原来的源代码为320*240屏的,初始化设置
时候需要重新设置以符合240*128的屏。此代码用于80C51和AVR单片机,主要是管脚定义
的差别,请看以下预定义。
by Gorden. 2007-04-09
*/
#ifndef __CM240128_h
#define __CM240128_h
#define uchar unsigned char // 0~255
#define uint unsigned int // 0~65535
#include < stdio.h >
#ifdef _CM240128_AVR // for AVR ATMega32
#define LCD_RS PORTB.0
#define LCD_WR PORTB.4
#define LCD_RD PORTB.1
#define LCD_CS1 PORTB.2
#define LCD_RST PORTB.3
#define LCD_cmdReg PORTA
#define LCD_cmdData PORTA
#define LCD_DATA PORTA
// #define LCD_READY P2
#define LCD_CS2 PORTB.5
#define LCD_BUSY PORTB.6
#define LCD_INT PORTB.7
#else // for 80C51
#define LCD_RS P0_5
#define LCD_WR P0_3
#define LCD_RD P0_6
#define LCD_CS1 P0_4
#define LCD_RST P0_2
#define LCD_cmdReg P2
#define LCD_cmdData P2
#define LCD_DATA P2
// #define LCD_READY P2
#define LCD_CS2 P3_4
#define LCD_BUSY P3_5
#define LCD_INT P3_6
void delay_ms(unsigned int m) // 11.0592MHz晶振,1.0us周期
... {
unsigned int j;
unsigned int i;
for(i=0; i<m; i++)
for(j=0; j<109; j++)
_nop_();
}
#endif
// =============================================
extern void delay ( int i);
extern void LCD_CmdWrite(unsigned char , unsigned char );
extern unsigned char LCD_CmdRead(unsigned char );
extern void LCD_DataWrite(unsigned char );
extern void LCD_ChkBusy( void );
extern void LCD_Reset( void );
extern void LCD_Initial( void );
extern void LCD_Clear( void );
extern void LCD_Fill( void );
extern void PrintStr( char * ptr, int delay_time);
extern void putHEX(unsigned int var);
extern void putHEX2(unsigned char var);
extern void GotoXY(unsigned char x1,unsigned char y1);
static const char ASCIITable[] = " 0123456789ABCD " ;
// =================================================================== //
// LCD Command Write Subroutine //
// =================================================================== //
void LCD_CmdWrite(unsigned char cmdReg,unsigned char cmdData)
... {
//LCD_ChkBusy();
LCD_cmdReg = cmdReg; // 写入缓存器的地址
LCD_CS1 =0; // 致能 RA8803 读写动作
LCD_RD = 1; // 禁能读取动作
LCD_RS = 0; // 设定为写入资至缓存器模式
LCD_WR = 0; // 开始写入缓存器的地址
//delay(10);
LCD_WR = 1;
LCD_RS = 1;
LCD_CS1 =1; // 致能 RA8803 读写动作
//…………………………………………………………….
//LCD_ChkBusy();
delay(1);
LCD_cmdReg = cmdData; // 写入缓存器的数据
LCD_CS1 =0; // 致能 RA8803 读写动作
LCD_RD = 1; // 禁能读取动作
LCD_RS = 0; // 设定为写入数据至缓存器模式
LCD_WR = 0; // 开始写入缓存器的数据
//delay(10);
LCD_WR = 1;
LCD_RS = 1;
LCD_CS1 =1; // 致能 RA8803 读写动作
//delay(1);
}
void delay( int i)
... {
int k ;
for ( k=0 ; k < i ; k++ );
}
// ******************************************************************************* //
// *** 定义 所有 缓存器的 初始值 ************************************************** //
// ******************************************************************************* //
void LCD_Initial( void )
... {
LCD_CmdWrite(0x00,0xCD); // LCD 基本显示功能设定-1 C9
LCD_CmdWrite(0x01,0xF1); // 系统工作频率与中断准位设定 F1
LCD_CmdWrite(0x02,0x10); // LCD 内存读写速度与功能设定
LCD_CmdWrite(0x03,0x80); // LCD 特殊显示功能
LCD_CmdWrite(0x10,0x6B); // LCD 基本显示功能设定-2
LCD_CmdWrite(0x11,0x20); // 设定光标高度与行距
LCD_CmdWrite(0x12,0x91); // LCD 显示图层设定
LCD_CmdWrite(0x20,0x1D); // 设定实际显示窗口垂直起始地址(X1) 320*160 = 0x27
LCD_CmdWrite(0x30,0x9F); // 设定实际显示窗口水平起始地址(Y1) 320*160 = 0xEF
LCD_CmdWrite(0x40,0x00); // 设定实际显示窗口垂直结束地址(X2)
LCD_CmdWrite(0x50,0x00); // 设定实际显示窗口水平结束地址(Y2)
LCD_CmdWrite(0x21,0x1D); // 设定LCD 模块垂直起始地址(X1) 320*160 = 0x27
LCD_CmdWrite(0x31,0x9F); // 设定LCD 模块水平起始地址(Y1) 320*160 = 0xEF
LCD_CmdWrite(0x41,0x00); // 设定LCD 模块垂直结束地址(X2)
LCD_CmdWrite(0x51,0x00); // 设定LCD 模块水平结束地址(Y2)
LCD_CmdWrite(0x60,0x00); // 设定光标水平地址(Common)
LCD_CmdWrite(0x61,0x00); // 设定垂直开始显示地址(Segment)
LCD_CmdWrite(0x70,0x00); // 设定光标垂直地址(Segment)
LCD_CmdWrite(0x71,0x00); // 设定于水平区块移动模式下,起始地址
LCD_CmdWrite(0x72,0xEF); // 设定于水平区块移动模式下,结束地址
LCD_CmdWrite(0x80,0x33); // 光标闪烁时间设定
LCD_CmdWrite(0x81,0x00); // 变换FRM 极性的起始地址(Common)
LCD_CmdWrite(0x91,0x00); // 变换FRM 极性的结束地址(Common)
LCD_CmdWrite(0x90,0x04);
LCD_CmdWrite(0xA0,0x11); // 中断功能设定
LCD_CmdWrite(0xA1,0x00); // 键盘扫描控制缓存器
LCD_CmdWrite(0xA2,0x00); // 键盘扫描控制输出数据
LCD_CmdWrite(0xA3,0x00); // 键盘扫描控制输入数据
LCD_CmdWrite(0xB0,0x27); // 设定水平方向断点的地址
LCD_CmdWrite(0xB1,0xEF); // 设定垂直方向断点的地址
LCD_CmdWrite(0xC0,0xD0); // 触控屏幕功能设定
LCD_CmdWrite(0xC1,0x0A); // 读写并可侦测触控屏幕的状态
LCD_CmdWrite(0xC8,0x80); // 读取触控屏幕水平轴的数据(高字节)
LCD_CmdWrite(0xC9,0x80); // 读取触控屏幕水平轴的数据(高字节)
LCD_CmdWrite(0xCA,0x00); // 读取触控屏幕水平轴与垂直轴的数据(低字节)
LCD_CmdWrite(0xD0,0x0C); // 设定DAC 电流输出,可调整LCD 亮度
LCD_CmdWrite(0xE0,0x00); // 设定写入显示内存的数据(需搭配缓存器[F0]使用
LCD_CmdWrite(0xF0,0xA0); // 设定中文字型为”BIG5” // A0-GB 90-BIG5 80-ENG
LCD_CmdWrite(0xF1,0x0F); // 改变字型垂直与水平显示大小
}
// ******************************************************************************* //
// *** 清除显示内存 子程序 ****************************************************** //
// ******************************************************************************* //
void LCD_Clear( void )
... {
unsigned char READ_REG;
#if 0
// 此处清屏命令无效,不知为何
LCD_CmdWrite(0xE0,0x40); // 设定将显示内存的数据全部写入”0x00”
READ_REG = LCD_CmdRead(0xF0);
READ_REG &= 0xF7;
READ_REG |= 0x08;
LCD_CmdWrite(0xF0,READ_REG); // 当缓存器[0xF0]之位3 设定为”1”时,
#else
// 使用填充空格的方式清屏
GotoXY(0, 0);
for(READ_REG=0; READ_REG<240; READ_REG++)
...{
LCD_DataWrite(' ');
}
#endif
delay(1000); // 硬件自动将显示内存全部写入缓存器[E0]的资料
}
void LCD_Fill( void )
... {
unsigned char READ_REG;
LCD_CmdWrite(0xE0,0xff);
READ_REG = LCD_CmdRead(0xF0);
READ_REG &= 0xF7;
READ_REG |= 0x08;
LCD_CmdWrite(0xF0,READ_REG);
delay(1000);
}
void LCD_DataWrite(unsigned char WrData)
... {
LCD_ChkBusy(); // 判断 RA8803 是否忙碌中
LCD_DATA = WrData; // 准备预写入显示内存的数据
LCD_CS1 =0; // 致能 RA8803 读写动作
LCD_RD = 1; // 禁能读取动作
LCD_RS = 1; // 设定为写入数据至显示内存模式
LCD_WR = 0; // 开始写数据至显示内存
LCD_WR = 0; // WR = 0;
LCD_WR = 0; // WR = 0;
//delay(1);
LCD_WR = 1;
LCD_RS = 1;
LCD_CS1 =1; // 禁能 RA8803 读写动作
}
void PrintStr( char * ptr, int delay_time)
... {
while(*ptr != '
CM240128.h
液晶模块控制芯片为RA8822,型号为CM240128-7
使用RA8822英文版文档中的源代码修改而得。原来的源代码为320*240屏的,初始化设置
时候需要重新设置以符合240*128的屏。此代码用于80C51和AVR单片机,主要是管脚定义
的差别,请看以下预定义。
by Gorden. 2007-04-09
*/
#ifndef __CM240128_h
#define __CM240128_h
#define uchar unsigned char // 0~255
#define uint unsigned int // 0~65535
#include < stdio.h >
#ifdef _CM240128_AVR // for AVR ATMega32
#define LCD_RS PORTB.0
#define LCD_WR PORTB.4
#define LCD_RD PORTB.1
#define LCD_CS1 PORTB.2
#define LCD_RST PORTB.3
#define LCD_cmdReg PORTA
#define LCD_cmdData PORTA
#define LCD_DATA PORTA
// #define LCD_READY P2
#define LCD_CS2 PORTB.5
#define LCD_BUSY PORTB.6
#define LCD_INT PORTB.7
#else // for 80C51
#define LCD_RS P0_5
#define LCD_WR P0_3
#define LCD_RD P0_6
#define LCD_CS1 P0_4
#define LCD_RST P0_2
#define LCD_cmdReg P2
#define LCD_cmdData P2
#define LCD_DATA P2
// #define LCD_READY P2
#define LCD_CS2 P3_4
#define LCD_BUSY P3_5
#define LCD_INT P3_6
void delay_ms(unsigned int m) // 11.0592MHz晶振,1.0us周期
... {
unsigned int j;
unsigned int i;
for(i=0; i<m; i++)
for(j=0; j<109; j++)
_nop_();
}
#endif
// =============================================
extern void delay ( int i);
extern void LCD_CmdWrite(unsigned char , unsigned char );
extern unsigned char LCD_CmdRead(unsigned char );
extern void LCD_DataWrite(unsigned char );
extern void LCD_ChkBusy( void );
extern void LCD_Reset( void );
extern void LCD_Initial( void );
extern void LCD_Clear( void );
extern void LCD_Fill( void );
extern void PrintStr( char * ptr, int delay_time);
extern void putHEX(unsigned int var);
extern void putHEX2(unsigned char var);
extern void GotoXY(unsigned char x1,unsigned char y1);
static const char ASCIITable[] = " 0123456789ABCD " ;
// =================================================================== //
// LCD Command Write Subroutine //
// =================================================================== //
void LCD_CmdWrite(unsigned char cmdReg,unsigned char cmdData)
... {
//LCD_ChkBusy();
LCD_cmdReg = cmdReg; // 写入缓存器的地址
LCD_CS1 =0; // 致能 RA8803 读写动作
LCD_RD = 1; // 禁能读取动作
LCD_RS = 0; // 设定为写入资至缓存器模式
LCD_WR = 0; // 开始写入缓存器的地址
//delay(10);
LCD_WR = 1;
LCD_RS = 1;
LCD_CS1 =1; // 致能 RA8803 读写动作
//…………………………………………………………….
//LCD_ChkBusy();
delay(1);
LCD_cmdReg = cmdData; // 写入缓存器的数据
LCD_CS1 =0; // 致能 RA8803 读写动作
LCD_RD = 1; // 禁能读取动作
LCD_RS = 0; // 设定为写入数据至缓存器模式
LCD_WR = 0; // 开始写入缓存器的数据
//delay(10);
LCD_WR = 1;
LCD_RS = 1;
LCD_CS1 =1; // 致能 RA8803 读写动作
//delay(1);
}
void delay( int i)
... {
int k ;
for ( k=0 ; k < i ; k++ );
}
// ******************************************************************************* //
// *** 定义 所有 缓存器的 初始值 ************************************************** //
// ******************************************************************************* //
void LCD_Initial( void )
... {
LCD_CmdWrite(0x00,0xCD); // LCD 基本显示功能设定-1 C9
LCD_CmdWrite(0x01,0xF1); // 系统工作频率与中断准位设定 F1
LCD_CmdWrite(0x02,0x10); // LCD 内存读写速度与功能设定
LCD_CmdWrite(0x03,0x80); // LCD 特殊显示功能
LCD_CmdWrite(0x10,0x6B); // LCD 基本显示功能设定-2
LCD_CmdWrite(0x11,0x20); // 设定光标高度与行距
LCD_CmdWrite(0x12,0x91); // LCD 显示图层设定
LCD_CmdWrite(0x20,0x1D); // 设定实际显示窗口垂直起始地址(X1) 320*160 = 0x27
LCD_CmdWrite(0x30,0x9F); // 设定实际显示窗口水平起始地址(Y1) 320*160 = 0xEF
LCD_CmdWrite(0x40,0x00); // 设定实际显示窗口垂直结束地址(X2)
LCD_CmdWrite(0x50,0x00); // 设定实际显示窗口水平结束地址(Y2)
LCD_CmdWrite(0x21,0x1D); // 设定LCD 模块垂直起始地址(X1) 320*160 = 0x27
LCD_CmdWrite(0x31,0x9F); // 设定LCD 模块水平起始地址(Y1) 320*160 = 0xEF
LCD_CmdWrite(0x41,0x00); // 设定LCD 模块垂直结束地址(X2)
LCD_CmdWrite(0x51,0x00); // 设定LCD 模块水平结束地址(Y2)
LCD_CmdWrite(0x60,0x00); // 设定光标水平地址(Common)
LCD_CmdWrite(0x61,0x00); // 设定垂直开始显示地址(Segment)
LCD_CmdWrite(0x70,0x00); // 设定光标垂直地址(Segment)
LCD_CmdWrite(0x71,0x00); // 设定于水平区块移动模式下,起始地址
LCD_CmdWrite(0x72,0xEF); // 设定于水平区块移动模式下,结束地址
LCD_CmdWrite(0x80,0x33); // 光标闪烁时间设定
LCD_CmdWrite(0x81,0x00); // 变换FRM 极性的起始地址(Common)
LCD_CmdWrite(0x91,0x00); // 变换FRM 极性的结束地址(Common)
LCD_CmdWrite(0x90,0x04);
LCD_CmdWrite(0xA0,0x11); // 中断功能设定
LCD_CmdWrite(0xA1,0x00); // 键盘扫描控制缓存器
LCD_CmdWrite(0xA2,0x00); // 键盘扫描控制输出数据
LCD_CmdWrite(0xA3,0x00); // 键盘扫描控制输入数据
LCD_CmdWrite(0xB0,0x27); // 设定水平方向断点的地址
LCD_CmdWrite(0xB1,0xEF); // 设定垂直方向断点的地址
LCD_CmdWrite(0xC0,0xD0); // 触控屏幕功能设定
LCD_CmdWrite(0xC1,0x0A); // 读写并可侦测触控屏幕的状态
LCD_CmdWrite(0xC8,0x80); // 读取触控屏幕水平轴的数据(高字节)
LCD_CmdWrite(0xC9,0x80); // 读取触控屏幕水平轴的数据(高字节)
LCD_CmdWrite(0xCA,0x00); // 读取触控屏幕水平轴与垂直轴的数据(低字节)
LCD_CmdWrite(0xD0,0x0C); // 设定DAC 电流输出,可调整LCD 亮度
LCD_CmdWrite(0xE0,0x00); // 设定写入显示内存的数据(需搭配缓存器[F0]使用
LCD_CmdWrite(0xF0,0xA0); // 设定中文字型为”BIG5” // A0-GB 90-BIG5 80-ENG
LCD_CmdWrite(0xF1,0x0F); // 改变字型垂直与水平显示大小
}
// ******************************************************************************* //
// *** 清除显示内存 子程序 ****************************************************** //
// ******************************************************************************* //
void LCD_Clear( void )
... {
unsigned char READ_REG;
#if 0
// 此处清屏命令无效,不知为何
LCD_CmdWrite(0xE0,0x40); // 设定将显示内存的数据全部写入”0x00”
READ_REG = LCD_CmdRead(0xF0);
READ_REG &= 0xF7;
READ_REG |= 0x08;
LCD_CmdWrite(0xF0,READ_REG); // 当缓存器[0xF0]之位3 设定为”1”时,
#else
// 使用填充空格的方式清屏
GotoXY(0, 0);
for(READ_REG=0; READ_REG<240; READ_REG++)
...{
LCD_DataWrite(' ');
}
#endif
delay(1000); // 硬件自动将显示内存全部写入缓存器[E0]的资料
}
void LCD_Fill( void )
... {
unsigned char READ_REG;
LCD_CmdWrite(0xE0,0xff);
READ_REG = LCD_CmdRead(0xF0);
READ_REG &= 0xF7;
READ_REG |= 0x08;
LCD_CmdWrite(0xF0,READ_REG);
delay(1000);
}
void LCD_DataWrite(unsigned char WrData)
... {
LCD_ChkBusy(); // 判断 RA8803 是否忙碌中
LCD_DATA = WrData; // 准备预写入显示内存的数据
LCD_CS1 =0; // 致能 RA8803 读写动作
LCD_RD = 1; // 禁能读取动作
LCD_RS = 1; // 设定为写入数据至显示内存模式
LCD_WR = 0; // 开始写数据至显示内存
LCD_WR = 0; // WR = 0;
LCD_WR = 0; // WR = 0;
//delay(1);
LCD_WR = 1;
LCD_RS = 1;
LCD_CS1 =1; // 禁能 RA8803 读写动作
}
void PrintStr( char * ptr, int delay_time)
... {
while(*ptr != '