您的位置:首页 > 其它

LCD12864液晶使用-ST7920

2015-06-12 18:49 330 查看
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;

}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: