打印

贴个带汉字库串行12864液晶模块的驱动,CCSC写的

[复制链接]
2675|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ocon|  楼主 | 2009-8-23 00:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
已在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~"); //
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

4920

帖子

14

粉丝