参考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 |
【MCU实战经验】基于STM32F103C8T6的hart总线调试器设计
求教STM32F103进入STOP模式后用外部中断唤醒的问题
基于STM32F103RCT6的无源蜂鸣器音乐播放(生日快乐歌)
STM32F103c8t6有没有DAC 功能?
STM32F103x中文数据手册
新手求教,为何在我电脑上找不到STM32F1Xx.h文件
金龙107例程汇总(STM32F107)
万利STM32F107VC 原理图
STM32F103 ADC多通道检测必须要DMA吗?
【官方例程】STM32F107以太网官方例程