STM32
直播中

南风一号

8年用户 955经验值
擅长:EMC/EMI设计
私信 关注
[问答]

如何通过STM32F103C8T6最小系统驱动液晶显示一串字符?

如何通过STM32F103C8T6最小系统驱动液晶显示一串字符?

回帖(1)

杨会

2021-12-15 11:10:29
一、概述

1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不可以显示汉字,内置1128个字符的ASCII字符集,并行通信方式。本验是通过STM32F103C8T6最小系统驱动液晶显示一串字符。
二、实验材料

1、STM32F103C8T6最小系统
2、LCD1602液晶
3、杜邦线若干
三、基本操作时序

[tr]状态输入输出[/tr]
读状态RS=L,RW=H,E=HD0-D7=状态
写指令RS=L,RW=L,D0-D7=指令码,E=高脉冲
读数据RS=H,RW=H,E=HD0-D7=数据
写数据RS=H,RE=L,D0-D7=数据,E=高脉冲
四、硬件连接







五、程序代码
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 != '')
        {
                Lcd1602_DisplayChar(row,col,*str);
                col += 1;
                str++;
        }
}


8、主程序


int main(void)
{
        u8 buf[] = {"I Love You!"};
        u8 date[] = {"2021/2/7"};
        u8 author[] = {"Qing"};
       
        Sys_Delay_Init();
        Lcd1602_Init();
       
        //单个字符
//        Lcd1602_DisplayChar(2,2,'A');
        //字符串
        Lcd1602_DisplayString(1,1,buf);
        Lcd1602_DisplayString(2,1,date);
        Lcd1602_DisplayString(2,13,author);
       
        while(1)
        {
               
        }
}


六、实验效果


六、实验效果



举报

更多回帖

发帖
×
20
完善资料,
赚取积分