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; } |
相关文章推荐
- 【数据结构】跳跃列表 SkipList
- 实验内存泄露的检测
- iOS 项目中用到的一些开源库和第三方组件
- struts2注解@Result的几个跳转方式说明
- android-studio undefined reference to `__android_log_print
- hdu1233
- Jmeter做性能测试——HTTP请求
- 阅读《构建之法》第10,11,12章
- 深入解析单例线程安全问题
- Markdown语法 (中文版)
- LIB和DLL的区别与使用
- LIB和DLL的区别与使用
- 可编程硬件Arduino初探(2)-神奇的鸡腿multiwii
- 网络数据请求(同步/异步连接下的GET/POST请求)
- CSAPP LAB: Buffer Overflow
- [译]可编程硬件Arduino初探(4)-MultiWii之config.h
- apache与nginx
- 关于VSS2005不能添加目录的解决办法
- poj 1160 Post Office(四边形不等式优化dp)
- Exchange Server 2010 数据库故障处理实例