LCD12864
簡介
12864LCD液晶顯示模塊是一款4位/8位并行、2線或3線接口方式,內(nèi)部含有國際一級、二級簡體中文字庫的圖形點陣液晶模塊。顯示分辨率為12864,內(nèi)置8198個1616點漢字,和128個16*8點ASCII字符集。
功能引腳圖
串口通訊需要使用的引腳
- CS片選信號 (如果只有一款屏,可以將CS直接接到VCC上,實現(xiàn)兩線通訊。)
- SID數(shù)據(jù)傳輸引腳
- CLK時鐘
- PSB(低電平表示串行通訊,串口通訊時可以直接接地。)
- VSS、VDD電源腳
原理圖
工作電壓:5V
驅(qū)動電壓:0-7V
邏輯電平:2.7-5.5V
工作溫度:0-55°C
串行時序圖
- 在操作液晶屏前,將CS片選信號拉高。
- SID前8位是控制字符,1-5位固定為1。
RW為0時,表示寫操作。RS為1時,表示寫數(shù)據(jù),RS為0時,表示寫指令。
因此寫指令CMD固定為0xF8,寫數(shù)據(jù)DAT固定為0xFA。 - 發(fā)送數(shù)據(jù)分為兩組,將發(fā)送的8位數(shù)據(jù)截取成兩段,第一段發(fā)送給1byte的高4位,第二段發(fā)送給2byte的高4位。
基本指令說明
-
功能設定
本設計使用(0x30),表示8位MPU控制,選擇基本指令集。 -
顯示開關設置
本設計使用(0x0C),表示設定顯示開,關閉光標,正常顯示。 -
進入設定點
本設計使用(0x06),表示顯示數(shù)據(jù)的讀寫時,設定游標方向右移,DDRAM地址計數(shù)器加1。 -
清楚顯示
本設計使用(0x01),表示清除顯示。 -
設定DDRAM地址
本設計使用(0x80),表示設置啟動位置到地址計數(shù)器。
128x64點陣原理上等同于256x32點陣,第三行對應的DDRAM地址緊接著第一行,第四行對應的DDRAM地址緊接著第二行。在使用反白功能時,第一行反白,第三行必然反白。
6. 屏幕與DDRAM地址的對應關系
代碼配置
lcd12864.h
#ifndef __LCD12864_H
#define __LCD12864_H
#include "stm32f10x.h"
#include "Delay.h"
#define CS GPIO_Pin_0 //片選信號
#define SID GPIO_Pin_1 //數(shù)據(jù)傳輸
#define CLK GPIO_Pin_2 //時鐘
#define PSB GPIO_Pin_3 //串并選擇 低電平為串行
#define CMD_PROT GPIOC //GPIO分組
#define CS_HIGH GPIO_SetBits(CMD_PROT,CS)
#define CS_LOW GPIO_ResetBits(CMD_PROT,CS)
#define SID_HIGH GPIO_SetBits(CMD_PROT,SID)
#define SID_LOW GPIO_ResetBits(CMD_PROT,SID)
#define CLK_HIGH GPIO_SetBits(CMD_PROT,CLK)
#define CLK_LOW GPIO_ResetBits(CMD_PROT,CLK)
#define PSB_HIGH GPIO_SetBits(CMD_PROT,PSB)
#define PSB_LOW GPIO_ResetBits(CMD_PROT,PSB)
#define CMD 0xF8 //寫指令
#define DAT 0xFA //寫數(shù)據(jù)
typedef struct{
uint8_t com; //地址
uint8_t num; //長度
uint8_t *dat; //數(shù)據(jù)
}LCD_InitTypeDef; //定義寫文字用的結(jié)構(gòu)體
void LCD12864_UserConfig(void);/*用戶配置*/
void LCD12864_Write_Init(void);/*LCD12864上電初始化流程*/
void LCD12864_Write_CMD_Data(uint8_t cmd,uint8_t data);/*LCD12864寫函數(shù) 傳入指令寫指令,傳入數(shù)據(jù)寫數(shù)據(jù)*/
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure);/*LCD12864寫文字*/
void LCD12864_Write_Number(uint8_t com,uint8_t num);/*LCD12864寫數(shù)字*/
void LCD12864_Open(void);/*屏幕開顯示*/
void LCD12864_Shut(void);/*屏幕關顯示,進入睡眠*/
#endif
lcd12864.c文章來源:http://www.zghlxwxcb.cn/news/detail-447824.html
#include "lcd12864.h"
/*用戶配置*/
void LCD12864_UserConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = CS|SID|CLK|PSB;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(CMD_PROT,&GPIO_InitStructure);
}
/*LCD12864寫一個字節(jié)*/
void LCD12864_Write_Byte(uint8_t data)
{
uint8_t WBi;
CS_HIGH; //寫之前拉高片選信號
for(WBi=0;WBi<8;WBi++)
{
(data<<WBi&0x80)?SID_HIGH:SID_LOW; //移位,判斷高位
CLK_LOW; //拉低時鐘
CLK_HIGH; //拉高時鐘
}
CS_LOW; //釋放片選,不再占據(jù)總線
}
/*LCD12864寫函數(shù) 傳入指令寫指令,傳入數(shù)據(jù)寫數(shù)據(jù)*/
void LCD12864_Write_CMD_Data(uint8_t cmd,uint8_t data)
{
LCD12864_Write_Byte(cmd);
LCD12864_Write_Byte(data&0xf0); //根據(jù)時序圖,傳入數(shù)據(jù)的高4位變成發(fā)送數(shù)據(jù)的高4位,發(fā)送的數(shù)據(jù)低4位為0。例0x38 0011 1000 & 1111 0000
LCD12864_Write_Byte((data<<4)&0xf0); //再取傳入數(shù)據(jù)的低4位,變成發(fā)送數(shù)據(jù)的高4位,發(fā)送的數(shù)據(jù)低4位為0。例0x38<<4 1000 & 1111 0000
Delay_ms(2); //設置傳輸延時
}
/*LCD12864上電初始化流程*/
void LCD12864_Write_Init(void)
{
PSB_LOW; //設置串行通訊
LCD12864_Write_CMD_Data(CMD,0x30); //功能設定,8位MCU接口,基本指令集
LCD12864_Write_CMD_Data(CMD,0x06); //顯示數(shù)據(jù)的讀寫時,設定游標方向右移,DDRAM地址計數(shù)器加1
LCD12864_Write_CMD_Data(CMD,0x0C); //開顯示,關閉光標
LCD12864_Write_CMD_Data(CMD,0x01); //清除顯示
LCD12864_Write_CMD_Data(CMD,0x80); //設置啟動位置
}
/*屏幕開顯示*/
void LCD12864_Open(void)
{
LCD12864_Write_CMD_Data(CMD,0x0C);
}
/*屏幕關顯示,進入睡眠*/
void LCD12864_Shut(void)
{
LCD12864_Write_CMD_Data(CMD,0x08); //進入睡眠模式
}
/*LCD12864寫文字*/
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure)
{
uint8_t LWWi;
LCD12864_Write_CMD_Data(CMD,LCD_InitStructure.com); //寫指令:寫入地址
for(LWWi=0;LWWi<LCD_InitStructure.num;LWWi++)
{
LCD12864_Write_CMD_Data(DAT,*LCD_InitStructure.dat++); //根據(jù)數(shù)據(jù)長度寫入字節(jié)
Delay_ms(200);
}
}
/*LCD12864寫數(shù)字*/
void LCD12864_Write_Number(uint8_t com,uint8_t num)
{
const uint8_t number[] = {"0123456789"};
LCD12864_Write_CMD_Data(CMD,com); //寫地址
LCD12864_Write_CMD_Data(DAT,number[num/1000]); //1234 1
LCD12864_Write_CMD_Data(DAT,number[num%1000/100]); //1234 2
LCD12864_Write_CMD_Data(DAT,number[num%100/10]); //1234 3
LCD12864_Write_CMD_Data(DAT,number[num%100%10]); //1234 4
}
main.c文章來源地址http://www.zghlxwxcb.cn/news/detail-447824.html
#include "stm32f10x.h" // Device header
#include "lcd12864.h"
#include "Delay.h"
LCD_InitTypeDef LCD_InitStructure;
int main(void)
{
LCD12864_UserConfig(); //LCD12864用戶配置初始化
LCD12864_Write_Init(); //LCD12864流程初始化
LCD_InitStructure.com = 0x80; //0x80-0x87 16 8
LCD_InitStructure.num =16;
LCD_InitStructure.dat = (u8*)&"桃之夭夭灼灼其華";
LCD12864_Write_Word(LCD_InitStructure);
LCD_InitStructure.com = 0x90; //0x90-0x97 16 8
LCD_InitStructure.num =16;
LCD_InitStructure.dat = (u8*)&"之子于歸宜其室家";
LCD12864_Write_Word(LCD_InitStructure);
LCD_InitStructure.com = 0x88; //0x88-0x8F 16 8
LCD_InitStructure.num =16;
LCD_InitStructure.dat = (u8*)&"桃之夭夭有蕡其實";
LCD12864_Write_Word(LCD_InitStructure);
LCD_InitStructure.com = 0x98; //0x98-0x9F 16 8
LCD_InitStructure.num =16;
LCD_InitStructure.dat = (u8*)&"之子于歸宜其家室";
LCD12864_Write_Word(LCD_InitStructure);
Delay_ms(500); //等待500ms
LCD12864_Write_CMD_Data(CMD,0x01); //清屏
while(1)
{
uint8_t i;
for(i=0;i<200;i++)
{
LCD12864_Write_Number(0x90,i); //第二行顯示動態(tài)的數(shù)字
Delay_ms(200);
}
}
}
到了這里,關于STM32 使用LCD12864顯示屏(串行方式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!