完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
一、概述 1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不可以显示汉字,内置1128个字符的ASCII字符集,并行通信方式。本验是通过STM32F103C8T6最小系统驱动液晶显示一串字符。 二、实验材料 1、STM32F103C8T6最小系统 2、LCD1602液晶 3、杜邦线若干 三、基本操作时序 [tr]状态输入输出[/tr]
五、程序代码 1、GPIO初始化 void Lcd1602_Pin_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | 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_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruct); } 2、LCD1602初始化 void Lcd1602_Init(void) { Lcd1602_Pin_Init(); delay_ms(15); Lcd1602_Write_Cmd(0X38); Lcd1602_Write_Cmd(0X0C);//开显示不显示光标 Lcd1602_Write_Cmd(0X06);//写一个指针加1 Lcd1602_Write_Cmd(0X01);//清屏 Lcd1602_Write_Cmd(0X80);//设置数据指针起点 } 3、检测忙碌状态 void Lcd1602_Check_Busy(void) { u8 signal; LCD_RS = 0; LCD_RW = 1; do { LCD_EN = 1; signal = LCD_BUSY; LCD_EN = 0; }while(signal); } 4、写指令 void Lcd1602_Write_Cmd(int cmd) { Lcd1602_Check_Busy();//检测忙碌状态 LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; cmd=cmd<<8; GPIOB->ODR=((GPIOB->ODR & 0x00FF)|(cmd&0xFF00));//PB15-8是数据位,PB0-7的数据不能变 delay_us(2); LCD_EN = 1; delay_us(2); LCD_EN = 0; delay_ms(15); } 5、写数据 void Lcd1602_Write_Data(int data) { Lcd1602_Check_Busy();//检测忙碌状态 LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; data<<= 8; GPIOB->ODR = ((GPIOB->ODR & 0X00FF) | (data& 0XFF00)); delay_us(2); LCD_EN = 1; delay_us(2); LCD_EN = 0; delay_ms(15); } 6、显示字符 // @u8 row:行 // @u8 col:列 // @int ch:字符 void Lcd1602_DisplayChar(u8 row,u8 col,int ch) { //显示位置 int add = 0; //判断是那一行 if(row == 2) { //第二行的首地址 0x40 add += 0x40; } //第一行的首地址 0x80 add += 0x80 + col - 1; Lcd1602_Write_Cmd(add); //显示内容 Lcd1602_Write_Data(ch); } 7、显示字符串 // @u8 row:行 // @u8 col:列 // @u8 *str:字符串首地址 void Lcd1602_DisplayString(u8 row,u8 col,u8 *str) { while(*str != ' |