STM32F103控制1602液晶,亲测可用,不行联系

1、液晶买3.3V电源的,液晶的第三脚对比度要用103的电位器,这样可以调节对比度,不然看不到的

     RS:PB5  RW:PB6;  EN:PB7    DB0~DB7PA0~PA7;  VO拉电位器,1VSSGND,2VDD3.3V15脚接3.3V,16脚接GND.


2、 "sys.h"文件

#ifndef __SYS_H
#define __SYS_H
#include "stm32f10x.h"


#define SYSTEM_SUPPORT_UCOS 0

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    


#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
 

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  


#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n) 


#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  


#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  


#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n) 


#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  


#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)

void NVIC_Configuration(void);


2、 "sys.c"文件

#include "sys.h"

void NVIC_Configuration(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

}

3、1602.h文件

#ifndef __LCD1602_H
#define __LCD1602_H  
#include "sys.h"
#define LCD_RS_Set() GPIO_SetBits(GPIOB, GPIO_Pin_5)
#define LCD_RS_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_5)
#define LCD_RW_Set() GPIO_SetBits(GPIOB, GPIO_Pin_6)
#define LCD_RW_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_6)
#define LCD_EN_Set() GPIO_SetBits(GPIOB, GPIO_Pin_7)
#define LCD_EN_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_7)
#define DATAOUT(x) GPIO_Write(GPIOA, x)


void GPIO_Configuration(void);
void LCD1602_Wait_Ready(void);
void LCD1602_Write_Cmd(u8 cmd);
void LCD1602_Write_Dat(u8 dat);
void LCD1602_ClearScreen(void);
void LCD1602_Set_Cursor(u8 x, u8 y);
void LCD1602_Show_Str(u8 x, u8 y, u8 *str);
void LCD1602_Init(void);
#endif

4、1602.c文件

#include"1602.h"
#include"sys.h"
#include "delay.h"
#include "stdio.h"


void GPIO_Configuration(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);  
 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
     GPIO_Init(GPIOB, &GPIO_InitStructure);  
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void LCD1602_Wait_Ready(void)
{
u8 sta;

DATAOUT(0xff);
LCD_RS_Clr();
LCD_RW_Set();
do
{
LCD_EN_Set();
delay_ms(5);
  sta = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7);
LCD_EN_Clr();
}while(sta & 0x80);
}



void LCD1602_Write_Cmd(u8 cmd)
{
LCD1602_Wait_Ready();
LCD_RS_Clr();
LCD_RW_Clr();
DATAOUT(cmd);
LCD_EN_Set();
LCD_EN_Clr();
    //printf("%d",cmd);
}



void LCD1602_Write_Dat(u8 dat)
{
LCD1602_Wait_Ready();
LCD_RS_Set();
LCD_RW_Clr();
DATAOUT(dat);
LCD_EN_Set();
LCD_EN_Clr();
}



void LCD1602_ClearScreen(void)
{
LCD1602_Write_Cmd(0x01);
}



void LCD1602_Set_Cursor(u8 x, u8 y)
{
u8 addr;

if (y == 0)
addr = 0x00 + x;
else
addr = 0x40 + x;
LCD1602_Write_Cmd(addr | 0x80);
}



void LCD1602_Show_Str(u8 x, u8 y, u8 *str)
{
LCD1602_Set_Cursor(x, y);
while(*str != '\0')
{
LCD1602_Write_Dat(*str++);
}
}



void LCD1602_Init(void)
{
        GPIO_Configuration();
LCD1602_Write_Cmd(0x38); //16*2ÏÔʾ£¬5*7µãÕó£¬8λÊý¾Ý¿Ú
LCD1602_Write_Cmd(0x0c); //¿ªÏÔʾ£¬¹â±ê¹Ø±Õ
LCD1602_Write_Cmd(0x06); //ÎÄ×Ö²»¶¯£¬µØÖ·×Ô¶¯+1
LCD1602_Write_Cmd(0x01); //ÇåÆÁ
  
}

void delay_us(u16 us)
{
  u16 i;

do
  {
    i = 6;
while(i--)__nop();
  } while (--us);

}

void delay_ms(u16 ms)
{
  do
  {
    delay_us(250);
    delay_us(250);
    delay_us(250);
    delay_us(250);
  } while (--ms);
}

  • 17
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
### 回答1: STM32F103 和 LCD1602 都是常见的嵌入式系统中使用的组件。 STM32F103 是一款由意法半导体(STMicroelectronics)公司生产的32位ARM Cortex-M3内核的微控制器。它具有高性能、低功耗和丰富的外设接口,适合用于各种嵌入式应用。 LCD1602 是一种字符型液晶显示器,具有16个字符和2行显示的能力。它采用HD44780 控制器芯片,可以通过并行接口和微控制器进行通信。LCD1602 具有显示文本、数字和符号的功能,被广泛应用于各种电子设备中。 STM32F103 可以与 LCD1602 进行连接和通信,通过指令和数据的传输,实现在 LCD1602 上显示各种内容。通常需要使用GPIO(通用输入输出端口)来建立连接,将STM32的数据引脚与LCD1602的数据引脚相连,并通过GPIO的控制来进行数据的传输和显示的操作。 在使用STM32F103和LCD1602之前,首先需要了解LCD1602的工作原理,并编写相应的代码来控制STM32F103与LCD1602的通信。通过配置STM32F103的GPIO,将对应的引脚设置为输出模式,并将数据发送给LCD1602的数据引脚,再通过控制LCD1602的使能引脚(Enable)来进行数据的读取和显示。 通过对LCD1602控制命令和数据的传输,可以在屏幕上显示各种文本、数字和符号,实现简单的用户界面和信息显示。除了基本的显示功能之外,还可以通过添加其他的模块来扩展功能,如按键输入、显示内容的更新和动态刷新等。 总之,STM32F103 和 LCD1602 是常见的嵌入式系统组件,通过合理的连接和编程,可以实现在LCD1602 上显示各种内容,为嵌入式设备提供显示和用户交互的功能。 ### 回答2: STM32F103是意法半导体(STMicroelectronics)生产的一款32位ARM Cortex-M3微控制器,它具有高性能和低功耗的特点。而LCD1602则是一种常见的液晶显示器,具有16列2行的字符显示区域。 STM32F103和LCD1602可以配合使用,实现用STM32F103控制LCD1602显示字符。为了实现这个功能,我们需要连接STM32F103和LCD1602的引脚。 具体来说,STM32F103的GPIO口可以与LCD1602的RS、RW、E、DB0-DB7引脚相连。GND和VSS是电源接地和电源负极,VCC是电源正极,可接3.3V电源,V0是液晶偏压,可接可变电阻器调节。连接完成后,我们可以通过STM32F103的程序控制LCD1602进行字符的显示。 在编写程序时,我们需要使用相应的库函数或编写驱动程序来控制LCD1602显示字符。首先,我们需要初始化STM32F103的GPIO口和串行通信接口(SPI/I2C)等,然后配置LCD1602的初始化参数,包括显示模式、光标设置、显示内容等。最后,我们可以通过STM32F103的程序输出指令和字符数据到LCD1602,以实现特定的显示效果。 总之,通过STM32F103和LCD1602的组合,我们可以实现控制液晶显示器显示字符的功能。这对于很多嵌入式系统和电子产品来说非常重要,例如电子表、温湿度计、计时器等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值