概述
LCD1602驱动要点:1. STM32的GPIO不是51单片机一样的准双向IO,读忙时需要设置。
平台:STM32F103RCT6
使用的GPIO:PB5,PB6,PB7 ;PA0~PA7,具体的配置程序中有详情
例程下载:点我去下载
贴代码:
main.c
#include "stm32f10x.h"
#include "LCD1602.h"
unsigned char tem[] = {0x1C,0x14,0x1F,0x09,0x08,0x08,0x09,0x0F}; //摄氏度符号“℃”的字模
int main(){
LCD_INIT(); //LCD1602初始化
LCD_WRITE_StrDATA( "HELLO",0,5 ); //向屏幕第一行第五列输出HELLO
LCD_WRITE_StrDATA( "W O R L D !",1,3 ); //向屏幕第一行第三列输出W O R L D !
WUserImg( 0, tem ); //写入用户自定义字符到第一个用户自定义字符位
LCD_WRITE_CMD( 0x80 ); //指定屏幕第一行第一列输出
LCD_WRITE_ByteDATA( 0x00 ); //输出第一个用户自定义字符
}
LCD.c
#include "LCD1602.h"
#include "stm32f10x_rcc.h"
void delay_us(unsigned int us){
unsigned int i;
do{
i = 10;
while(i--) __nop();
} while (--us);
}
/***********************************GPIO初始化********************************************/
void GPIO_INIT(void){ //GPIO初始化
GPIO_InitTypeDef PB;
GPIO_InitTypeDef PA;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁用jtag,不然写入程序和程序执行都会受影响
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //打开GPIOA~B
//RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
PB.GPIO_Pin = EN|RW|RS;
PB.GPIO_Mode = GPIO_Mode_Out_PP;
PB.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &PB);
PA.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;
PA.GPIO_Mode = GPIO_Mode_Out_PP;
PA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &PA);
}
/***********************************GPIO初始化********************************************/
/***********************************LCD初始化********************************************/
void LCD_INIT(void){ //初始化
GPIO_INIT(); //GPIO的初始化,在LCD_INIT被调用时自动调用
GPIO_Write( GPIOA, 0x0000 ); //初始化GPIOA和GOIOB的值为0x0000,可以不用,个人习惯
GPIO_Write( GPIOB, 0x0000 );
delay_us(500);
LCD_WRITE_CMD( 0x38 );
LCD_WRITE_CMD( 0x0d ); //开启光标和闪烁
LCD_WRITE_CMD( 0x06 );
LCD_WRITE_CMD( 0x01 );
}
/***********************************LCD初始化********************************************/
/***********************************写入命令函数********************************************/
void LCD_WRITE_CMD( unsigned char CMD ){ //写入命令函数
ReadBusy();
GPIO_ResetBits( GPIOB, RS );
GPIO_ResetBits( GPIOB, RW );
GPIO_ResetBits( GPIOB, EN );
GPIO_Write( GPIOA, CMD ); //
GPIO_SetBits( GPIOB, EN );
GPIO_ResetBits( GPIOB, EN );
}
/***********************************写入命令函数********************************************/
/***********************************写入单个Byte函数********************************************/
void LCD_WRITE_ByteDATA( unsigned char ByteData ){ //写入单个Byte函数
ReadBusy();
GPIO_SetBits( GPIOB, RS );
GPIO_ResetBits( GPIOB, RW );
GPIO_ResetBits( GPIOB, EN );
GPIO_Write( GPIOA, ByteData );
GPIO_SetBits( GPIOB, EN );
GPIO_ResetBits( GPIOB, EN );
}
/***********************************写入单个Byte函数********************************************/
/***********************************写入字符串函数********************************************/
void LCD_WRITE_StrDATA( unsigned char *StrData, unsigned char row, unsigned char col ){//写入字符串
unsigned char baseAddr = 0x00; //定义8位地址
if ( row ){
baseAddr = 0xc0;
}else{
baseAddr = 0x80;
} //row为1用户选择第二行
//row为0用户选择第一行
baseAddr += col;
while ( *StrData != '