wenyangzeng 发表于 2014-3-30 19:36:32

【MCU实战经验】STM32F1系列3.3V驱动5V供电LCD

  
  参考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
 
页: [1]
查看完整版本: 【MCU实战经验】STM32F1系列3.3V驱动5V供电LCD