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

查看: 7170|回复: 0

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

[复制链接]

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
发表于 2014-3-30 19:36:32 | 显示全部楼层 |阅读模式
  
  参考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
 
回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版