LCD12864液晶使用-ST7920

来源:互联网 发布:mac版谷歌dhc插件下载 编辑:程序博客网 时间:2024/04/30 06:08
LCD12864液晶型号为ST7920,位带字库液晶,同时也有图形县显示区,具体操作请看手册,这里只是简单说下使用,本教程是串行使用方式,本教程实现了液晶的画图,显示字和自定义字功能。
第一幅图为画图效果,画了一幅图;
第二幅图为用自身字符库,写了一首诗;
第三幅图为用CGRAM,4个16*16用户自定义字拼出一个32*32的字;

一、DDRAM
使用内部字库,写入DDRAM,字体大小只能为16*16,对应整个屏幕
地址:
                X
        ----------------------------------->
        |
        |        80H,81H,82H,83H,84H,85H,86H,87H,
        |        
      Y|        90H,91H,92H,93H,94H,95H,96H,97H,
        |
        |        88H,89H,8AH,8BH,8CH,8DH,8EH,8FH,
        |
        |        98H,99H,9AH,9BH,9CH,9DH,9EH,9FH,
        v

32个地址,分别对应屏幕上32个16*16的点阵
使用方法:
1、设定DDRAM地址;
2、写入数据;

二、GDRAM
不使用内部字库,用户可以自定义字体或者画图,对应整个屏幕
地址:
                X
        ----------------------------------->
        |上半屏:
        |        80H,81H,82H,83H,84H,85H,86H,87H,
        |0
      Y||
        |31        
        |下半屏:
        |        88H,89H,8AH,8BH,8CH,8DH,8EH,8FH,
        |0
        ||
        |31
        v
X地址会自动加一,Y地址不会自动自加;
一个X地址对应水平两个字节,高字节在前,低字节在后;
对应方式:                                X=80H
                        -------------------------------->
                        . . . . . . . .         . . . . . . . . 
                        B7B6B5B4B3B2B1B0 B7B6B5B4B3B2B1B0
                                高字节                         低字节
使用方法:
1、关闭绘图显示;
2、用扩充指令集设置GDRAM地址,先发Y,再发X;
3、用普通命令发数据;
4、打开绘图显示;

三、CGRAM
4个16*16的缓存区,可以定义字库没有的字或者字符,也可以拼成一个32*32的字符或者图像
,地址为        0000H        0002H        0004H        0006H

使用方法:
1、设置CGRAM地址;
2、写入16*2个数据;
3、设置DDRAM地址;
4、写入刚才的CGRAM地址;

四、经实践证明DDRAM和GDRAM显示是独立的显示缓存区,但是他们对应的显示区是一样的;

五、串行通信用法
串行数据1个字节数据传输共分三个字节完成:
第一个字节:串口控制--格式        11111ABC
                        A为数据传送方向控制:H数据从LCD到MCU;L数据从MCU到LCD;
                        B为数据类型选择:         H表示是显示数据;L表示是控制命令;
                        C固定为0
要发送或者接收的字节XXXX XXXX分为两个字节:
第二个字节:数据的高四位放到第二个字节的高四位,其余位补0,格式:XXXX0000
第三个字节:数据的低四位放到第三个字节的高四位,其余位补0,格式:XXXX0000

六、在向液晶发送命令之前,必须检查液晶是否处于“忙”的状态;
七、向液晶的DDRAM写20H,是清除显示;
八、底层代码
//先发高位,再发低位
void        ST7920_Serial_Write(unsigned char        frame_header,unsigned char        temp)
{
        union        Commonwealth_8        writeData;
        unsigned char        i=0;

        ST7920_CS                        =1;
        ST7920_SID_TRIS        =OUTPUT_PIN;//双向口使用

        //发送帧头
        writeData.byte_8=frame_header;
        ST7920_SID                        =writeData.Data_Uint8_bit.bit7;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit6;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);


        ST7920_SID                        =writeData.Data_Uint8_bit.bit5;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit4;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit3;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit2;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit1;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit0;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);        

        //发送数据
        writeData.byte_8=temp        & 0xF0;
        ST7920_SID                        =writeData.Data_Uint8_bit.bit7;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit6;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit5;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit4;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);


        ST7920_SID                        =writeData.Data_Uint8_bit.bit3;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit2;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit1;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit0;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);        


        writeData.byte_8=((temp << 4) & 0xF0);
        ST7920_SID                        =writeData.Data_Uint8_bit.bit7;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit6;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit5;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit4;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit3;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit2;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit1;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit0;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID_TRIS        =INPUT_PIN;//双向口使用
        ST7920_CS                        =0;
}

unsigned char        ST7920_Serial_ReadComm(void)
{
        union        Commonwealth_8        writeData;
        unsigned char        temp;
        unsigned char        i=0;

        ST7920_CS                        =1;
        ST7920_SID_TRIS        =OUTPUT_PIN;//双向口使用



        //发送帧头
        writeData.byte_8=(LCD_Frame | LCDtoMCU | LCD_Command);//0xFC;
        ST7920_SID                        =writeData.Data_Uint8_bit.bit7;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit6;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit5;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit4;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit3;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit2;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit1;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);

        ST7920_SID                        =writeData.Data_Uint8_bit.bit0;
        i=4;
        ST7920_CLK                        =1;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);



        ST7920_SID_TRIS        =INPUT_PIN;//双向口使用

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit7        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit6        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit5        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit4        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit3        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit2        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit1        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit0        =ST7920_SID;
        temp                        =writeData.byte_8 & 0xF0;


        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit7        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit6        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit5        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit4        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit3        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit2        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit1        =ST7920_SID;

        ST7920_CLK                        =1;i=4;while(i--);//delay(1);
        ST7920_CLK                        =0;i=4;while(i--);//delay(1);
        writeData.Data_Uint8_bit.bit0        =ST7920_SID;
        temp                        |=((writeData.byte_8 >>4) & 0x0F);
        ST7920_CS                        =0;

        return        temp;
}


BOOL        LCD_Buay(void)
{
        if(ST7920_Serial_ReadComm() & ST7920_BUSY)
        {
                return        TRUE;
        }
        return        FALSE;
}





0 0
原创粉丝点击