已在PIC16F690上验证通过
/*****************************
LCD12864_ST7920.h
编译器:CCSC 4.032
日期:2009年8月22日 by Wind
适用于采用ST7920芯片做控制的内置汉字库128X64点阵LCM,
串行接口,可以仅用两个管脚STD和SCLK进行控制,CS脚和RST脚可置1不用。
可用的函数:
void LCDInit(void); //LCD初始化
void LCD_clearTXT( void ); //清文本区,光标回到0坐标
void LCD_xy(char x,char y); //指定汉字坐标x:0~7,y:0~3,左上角为0,0
void LCD_str(char c); //显示字符串
*****************************/
#bit STD =PORTB.6 //引脚定义
#bit SCLK =PORTB.4 //
#bit RST =PORTC.6 //
#bit CS =PORTA.2 //
void SendByteLCD(char WLCDData); //串行发送一个8位字节
void SPIWR(char Wdata,char RS); //串行发送一个完整的指令或数据周期(3*8=24位)
void SendCMD(char CMD); //发送指令
void SendData(char Data); //发送数据
void LCDInit(void); //LCD初始化
void LCD_clearTXT( void ); //清文本区,光标回到0坐标
void LCD_xy(char x,char y); //指定汉字坐标x:0~7,y:0~3
void LCD_str(char c); //显示字符串
char AC_TABLE[]={ //ST7920的DDRAM地址表
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置
};
/*****************************
串行发送一个8位字节
*****************************/
void SendByteLCD(char WLCDData)
{
char i;
for(i=0;i<8;i++){
if((WLCDData<<i)&0x80)
STD=1;
else
STD=0;
SCLK=0;
SCLK=1;
}
}
/*****************************
发送3*8=24个位的内容(指令或数据)
*****************************/
void SPIWR(char Wdata,char RS)
{
SendByteLCD(0xf8+(RS<<1)); //发送RS位
SendByteLCD(Wdata&0xf0); //发送高4位
SendByteLCD((Wdata<<4)&0xf0); //发送低四位
}
/*****************************
发送指令
*****************************/
void SendCMD(char CMD)
{
SPIWR(CMD,0);
}
/*****************************
发送数据
*****************************/
void SendData(char Data)
{
SPIWR(Data,1);
}
/*****************************
LCD初始化
*****************************/
void LCDInit(void)
{
RST=0;
delay_ms(50);
RST=1; //取消复位
CS=1; //选通LCD
SendCMD(0x30);//0011,0000功能设置,一次送8位数据,基本指令集
SendCMD(0x01);//0000,0001 清DDRAM
SendCMD(0x02);//0000,0010 DDRAM地址归位
SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC//
SendCMD(0x06);//0000,0110点设定,显示字符/光标从左到右移位,DDRAM地址加 一//
SendCMD(0x0c);//0000,1100显示设定,开显示,显示光标,当前显示位反白闪动
}
/*****************************
清文本区,光标回到0坐标
*****************************/
void LCD_clearTXT( void )
{
char i;
SendCMD(0x80); //AC归起始位
for(i=0;i<64;i++)
SendData(0x20);
LCD_xy(0,0);
}
/*****************************
指定汉字坐标x:0~7,y:0~3,左上角为0,0
*****************************/
void LCD_xy(char x,char y)
{
if(x>=8) //如果X大于7
x=7;
if(y>=4) //如果Y大于3
y=3;
SendCMD(AC_TABLE[8*y+x]); //根据坐标值查表取得光标地址
}
/*****************************
显示字符串,字符串所需的多次发送由编译器自动完成
*****************************/
void LCD_str(char c)
{
SendData(c); //发送字符数据
}
================================================
调用方法:
LCDInit(); //128X64液晶屏初始化
LCD_clearTXT();
LCD_str("HELLO MM~"); // |
|