STM32与XY12864屏幕(ST7920中文显示模块)
一前期準(zhǔn)備
準(zhǔn)備一個XY12864中文顯示屏,有些屏幕是不帶中文字庫的,有些屏幕是帶有中文字庫,我選擇的是ST7920中文驅(qū)動器
二繪制電路板
第一張就是基礎(chǔ)的stm32最小系統(tǒng)圖,USB轉(zhuǎn)5v,然后轉(zhuǎn)3.3v,圖中還有DBT-18藍(lán)牙模塊,暫時沒做處理,我加入藍(lán)牙模塊是為了發(fā)送數(shù)據(jù),
這是xy12864屏幕引腳圖和我使用STM32引腳控制的連接圖,其中3號引腳V0是連接10k電位器
三ST7920使用
電源5v
RS RW 功能說明
L L :MPU寫指令到指令寄存器IR
LH:讀忙碌標(biāo)志(BF)及地址計數(shù)器(AC)狀態(tài)
HL:MPU寫入資料到資料寄存器(DR)
HH:MPU從資料寄存器(DR)中讀出資料
而我只用到寫數(shù)據(jù)和寫資料,
引腳17,(REST)復(fù)位引腳,低電平有效
引腳15(PSB)串行/并行選擇,高電位并行信號,低電位串行信號,我用的是并行指令輸入
復(fù)位引腳我接入PA8,PSB引腳我接入PB11,兩個引腳全拉高,
現(xiàn)在要考慮如何輸入正確的指令給屏幕,首先看時序圖,
有圖可以看出,配置好指令的時候,需要將RE引腳拉高,延時輸入指令,在拉低;寫入指令的時序
比如清除指令,:
RS/RW/DB7/DB6/DB5/DB4/DB3/DB2/DB1/DB0
0/0/0/0/0/0/0/0/0/1
程序里配置,先拉低RS和RW代表寫入指令,在配置DB7-DB0的電位,(0低電位,1高電位),然后拉高RE,延時,在拉低RE,便能寫入指令,寫入數(shù)據(jù)也是同樣操作,寫完一個指令要留有一定的延時,給屏留時間接受指令并工作,清屏留的時間長,其他指令時間短一些;
四程序解析
#include “stm32f10x.h”
#include “stm32f10x_flash.h”
#include “stm32f10x_tim.h”
#include “stm32f10x_usart.h”
#include “stm32f10x_adc.h”
#include “delay.h”
int A1; int i7=0,i6=0,i5=0,i4=0,i3=0,i2=0,i1=0,i0=0,n=0,m=0;
int B7,B6,B5,B4,B3,B2,B1,B0;
void RCC_Configuration(void);
void GPIO_Configuration(void);
void Qidong(void);
void Shangdian(void);
void Xianshi(void);
void FenJie(int A1); 制作函數(shù)分解DB7-DB0
void ZhiShi(int RSFlag);制作函數(shù)控制寫入數(shù)據(jù)還是寫入指令
void ShiNeng(int Sneng);制作函數(shù)控制使能寫入
void TIM_Configuration(void);
void NVIC_Configuration(void);
int main()
{
delay_init(72);
RCC_Configuration();
GPIO_Configuration();
GPIO_SetBits(GPIOA,GPIO_Pin_8); 置高復(fù)位引腳
GPIO_SetBits(GPIOB,GPIO_Pin_11); 置高選擇8位并行
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
Qidong(); 配置屏幕基礎(chǔ)
Shangdian(); 上電顯示:JX:
while(1);
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus=RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO
|RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
}
void Qidong(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_0); 拉低RE
ZhiShi(0); 寫入指令
FenJie(0X01); 指令01(00000001)DB7-DB0,清屏
ShiNeng(1); 使能下載指令至屏
delay_ms(100); 延時100ms
ZhiShi(0); 寫入指令
FenJie(0X02); 位址歸位指令02
ShiNeng(1); 使能下載指令至屏
delay_us(100);
delay_ms(10);
delay_ms(10);
ZhiShi(0); 寫入指令 FenJie(0X0C); 整體顯示,游標(biāo)關(guān),反白關(guān)指令0C ShiNeng(1); 使能下載指令至屏 delay_us(100);delay_ms(10);
ZhiShi(0); 寫入指令 FenJie(0X14); 游標(biāo)右移,AC+1,指令14 ShiNeng(1); 使能下載指令至屏 delay_us(100);delay_ms(10);
ZhiShi(0); 寫入指令 FenJie(0X30); 設(shè)為8位并行指令30 ShiNeng(1); 使能下載指令至屏 delay_us(100);delay_ms(10);
ZhiShi(0); 寫入指令 FenJie(0X40); 設(shè)定CGRAM地址到AC ShiNeng(1); 使能下載指令至屏 delay_us(100);delay_ms(10);
ZhiShi(0); 寫入指令 FenJie(0X80); 設(shè)置DDRAM地址到AC ShiNeng(1); 使能下載指令至屏 delay_us(100);delay_ms(10);
ZhiShi(0); 寫入指令 FenJie(0X02); ShiNeng(1); 使能下載指令至屏 delay_us(100);delay_ms(10);
ZhiShi(0); FenJie(0X40); ShiNeng(1); delay_us(100); delay_ms(10);}
void Shangdian(void)
{
設(shè)置起始Y地址
ZhiShi(0);
FenJie(0X80);
ShiNeng(1);
delay_us(100);
設(shè)置起始X地址
ZhiShi(0);
FenJie(0X86);
ShiNeng(1);
delay_us(100);
開始寫入數(shù)據(jù)字,先寫高八位 //J字(A3CA)
ZhiShi(1);
FenJie(0XA3);
ShiNeng(1);
delay_us(100);
在寫入低八位 //J字(A3CA)
ZhiShi(1);
FenJie(0XCA);
ShiNeng(1);
delay_us(100);
X字高八位 //X(A3D8)
ZhiShi(1);
FenJie(0XA3);
ShiNeng(1);
delay_us(100);
X字低八位 //X(A3D8)
ZhiShi(1);
FenJie(0XD8);
ShiNeng(1);
delay_us(100);
}
void FenJie(int A1)
{ 做函數(shù)值配置DB7-DB0
i7=A1/128;
B6=A1-128i7; if(B6<0){B6=0;}
i6=B6/64;
B5=A1-128i7-i664; if(B5<0){B5=0;}
i5=B5/32;
B4=A1-128i7-i664-i532; if(B4<0){B4=0;}
i4=B4/16;
B3=A1-128i7-i664-i532-i416; if(B3<0){B3=0;}
i3=B3/8;
B2=A1-128i7-i664-i532-i416-i38; if(B2<0){B2=0;}
i2=B2/4;
B1=A1-128i7-i664-i532-i416-i38-i24; if(B1<0){B1=0;}
i1=B1/2;
B0=A1-128i7-i664-i532-i416-i38-i24-i12; if(B0<0){B0=0;}
i0=B0/1;
}
void ZhiShi(int RSFlag)
{ 0/1區(qū)分是寫入指令還是寫入數(shù)據(jù)
if(RSFlag0) //
{
GPIO_ResetBits(GPIOB,GPIO_Pin_10); //RS
GPIO_ResetBits(GPIOB,GPIO_Pin_1); //RW
}
if(RSFlag1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_10); //RS
GPIO_ResetBits(GPIOB,GPIO_Pin_1); //RW
}
}
void ShiNeng(int Sneng)
{ 使能下載指令或數(shù)據(jù)
if(Sneng1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_0);
delay_us(50);
GPIO_ResetBits(GPIOB,GPIO_Pin_0); ///E
delay_us(50);
}
if(Sneng0)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_0); ///E
}
}
我自己做的程序,如寫的錯誤,請大神指出,字庫對應(yīng)碼可以看手冊后面,也可以聯(lián)系我,我給你,可以到淘寶搜索店鋪“睢寧小孫”“”,,寫的不好,多多關(guān)照
總結(jié)
以上是生活随笔為你收集整理的STM32与XY12864屏幕(ST7920中文显示模块)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下载网页 TS视频并自动合成视频
- 下一篇: 多媒体计算机涉及的关键技术有什么,多媒体