在线时间1853 小时
UID45393
ST金币0
蝴蝶豆82
注册时间2008-5-4
社区小助手
- 最后登录
- 2020-12-9
|
a0a.1 0b0c
参考STM32数据手册可知,工作电压为3.3V的STM32F103的I/O口可以驱动5V的外设器件。但并不是所有I/O都有该功能,条件是必须符合手册中引脚定义的I/O电平具备“FT”项的,见《数据手册》表5。LCD选用1片5V工作电压的12864液晶模块来应用,以体验STM32F103在3.3V工作条件下驱动5V器件的能力。分析ARM开发板的I/O扩展口,发现GPIO_D的PIN8-PIN15同在一组排针顺序引出,用它来做LCD的数据口正合适,顺便PD口上方的PB13-PB15和下方的PG2-PG4刚好用做控制口。接法见图1。
关于12684LCD的源代码网上到处都可以Download,你可以自己移植一下就OK了。因篇幅关系,我就不全部上传了,只上传部分供参考。比如在判断LCD忙的代码段,我用了直接寄存器操作方式来改变GPIOD_15的输入、输出工作模式,这样运行速度比用库操作方式快,能满足LCD12864的时序要求。
图1
主函数:
#include "stm32f10x.h"
#include "LCD.C"
u16 speed=2000;
u16 Count=0;
RCC_ClocksTypeDef RCC_ClockFreq;
void GPIO_Configuration(void) ;
void Delay(u16 speed);
int main(void)
{
SystemInit();
RCC_GetClocksFreq(&RCC_ClockFreq);
GPIO_Configuration();
LcdInit();
Clr_Scr();
byte_disp(1,1,'A');
byte_disp(1,2,'R');
byte_disp(1,3,'M');
word_disp(0,2,Kai);
word_disp(0,3,Fa);
word_disp(0,4,Ban);
byte_disp(1,13,'D');
byte_disp(1,14,'I');
byte_disp(1,15,'Y');
byte_disp(3,1,'S');
byte_disp(3,2,'T');
byte_disp(3,3,'M');
byte_disp(3,4,'3');
byte_disp(3,5,'2');
byte_disp(3,6,'F');
byte_disp(3,7,'1');
byte_disp(3,8,'0');
byte_disp(3,9,'3');
byte_disp(3,11,'3');
byte_disp(3,12,'.');
byte_disp(3,13,'3');
byte_disp(3,14,'v');
word_disp(4,1,Qu);
word_disp(4,2,Dong);
byte_disp(5,8,'5');
byte_disp(5,9,'V');
byte_disp(5,11,'L');
byte_disp(5,12,'C');
byte_disp(5,13,'D');
byte_disp(7,1,'W');
byte_disp(7,2,'e');
byte_disp(7,3,'n');
byte_disp(7,4,'y');
byte_disp(7,5,'a');
byte_disp(7,6,'n');
byte_disp(7,7,'g');
byte_disp(7,8,'z');
byte_disp(7,9,'e');
byte_disp(7,10,'n');
byte_disp(7,11,'g');
word_disp(6,5,Jin);
word_disp(6,6,Cheng);
while (1)
{ ;
}
}
//-----------------------------
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_SetBits(GPIOD, GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11
|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
GPIO_SetBits(GPIOG, GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_SetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
直接寄存器操作函数
//------------------------
//函数名:CheckState()
//功能:等待LCD不忙
//-------------------
void CheckState()
{
GPIOD->CRH &=0X0FFFFFFF;
GPIOD->CRH |=0X40000000;
RS_L;
RW_H;
EN_H;
while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_15)) ;
EN_L;
GPIOD->CRH &=0X0FFFFFFF;
GPIOD->CRH |=0X10000000;
}
显示效果见图2
图2
|
|