你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
wenyangzeng 提问时间:2014-3-30 19:36 /
  
  参考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。
图1.jpg
                                               
        关于12684LCD的源代码网上到处都可以Download,你可以自己移植一下就OK了。因篇幅关系,我就不全部上传了,只上传部分供参考。比如在判断LCD忙的代码段,我用了直接寄存器操作方式来改变GPIOD_15的输入、输出工作模式,这样运行速度比用库操作方式快,能满足LCD12864的时序要求。
图2.JPG
 
                                                         图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

图3.jpg
                             图2
 
收藏 1 评论0 发布时间:2014-3-30 19:36

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版