G
N
I
D
A
O
L

STM8四线驱动LCD1602

使用软件:IAR FOR STM8

编程方式:固件库

硬件配套:STM8S105K4T6最小系统板

这是我在做课设时摸索出来的代码,现记录如下:

1. LCD1602.h

#ifndef __LCD1602_H
#define __LCD1602_H

/***********LCD1602 四线驱动***********/

#include "stm8s.h"
#include "delay.h"

/***********Definition***********/
#define LINE0   0x80
#define LINE1   0xC0

#define Rx_PORT (GPIOB)
#define RS_PIN (GPIO_PIN_4) /* PB4 */
#define RW_PIN (GPIO_PIN_3) /* PB3 */ /* NOT USE(RW接地) */
#define EN_PIN (GPIO_PIN_5) /* PB5 */
#define Rx_FOUR_PINS (RS_PIN | EN_PIN)
#define Rx_ALL_PINS (RS_PIN | RW_PIN | EN_PIN) /* NOT USE */

#define Dx_PORT (GPIOC)
#define D0_PIN (GPIO_PIN_0) /* PC0 */ /* NOT USE */
#define D1_PIN (GPIO_PIN_1) /* PC1 */ /* NOT USE */
#define D2_PIN (GPIO_PIN_2) /* PC2 */ /* NOT USE */
#define D3_PIN (GPIO_PIN_3) /* PC3 */ /* NOT USE */
#define D4_PIN (GPIO_PIN_4) /* PC4 */
#define D5_PIN (GPIO_PIN_5) /* PC5 */
#define D6_PIN (GPIO_PIN_6) /* PC6 */
#define D7_PIN (GPIO_PIN_7) /* PC7 */
#define Dx_FOUR_PINS (D4_PIN | D5_PIN | D6_PIN | D7_PIN)
#define Dx_ALL_PINS (D0_PIN | D1_PIN | D2_PIN | D3_PIN | D4_PIN | \
                     D5_PIN | D6_PIN | D7_PIN) /* NOT USE */

#define RS_LOW  GPIO_WriteLow (Rx_PORT, RS_PIN)
#define RS_HIGH GPIO_WriteHigh(Rx_PORT, RS_PIN)
#define EN_LOW  GPIO_WriteLow (Rx_PORT, EN_PIN)
#define EN_HIGH GPIO_WriteHigh(Rx_PORT, EN_PIN)
#define Dx_CLR  GPIO_Write(Dx_PORT, 0x00)

/***********Function***********/
static void LCD1602_Cmd(uint8_t cmd);
static void LCD1602_Data(uint8_t data);
void LCD1602_Init(void);
static void LCD1602_SetCursor(uint8_t x, uint8_t y);
void LCD1602_PrintStr(uint8_t x, uint8_t y, uint8_t *str);

#endif /* __LCD1602_H */

2. LCD1602.c

#include "lcd1602.h"

/******发送命令******/
static void LCD1602_Cmd(uint8_t cmd)
{ 
  //Delay_us(30);
  EN_LOW;
  RS_LOW; /* RS=0,写入命令 */
  
  GPIO_Write(Dx_PORT, cmd);     /* 接收高四位命令 */
  EN_HIGH; 
  Delay_ms(15);
  EN_LOW;
  
  GPIO_Write(Dx_PORT, cmd<<4); /* 接收低四位命令 */
  EN_HIGH;
  Delay_ms(15);
  EN_LOW;
}

/******发送数据******/
static void LCD1602_Data(uint8_t data)
{  
  //Delay_us(30);
  EN_LOW;
  RS_HIGH; /* RS=1,写入数据 */
  
  GPIO_Write(Dx_PORT, data);     /* 接收高四位数据 */
  EN_HIGH; 
  Delay_ms(15);
  EN_LOW;
  
  GPIO_Write(Dx_PORT, data<<4); /* 接收低四位数据 */
  EN_HIGH; 
  Delay_ms(15);
  EN_LOW;
}

/******LCD初始化******/
void LCD1602_Init(void)
{
  GPIO_Init(Dx_PORT, (GPIO_Pin_TypeDef)Dx_FOUR_PINS, GPIO_MODE_OUT_PP_HIGH_FAST);
  GPIO_Init(Rx_PORT, (GPIO_Pin_TypeDef)Rx_FOUR_PINS, GPIO_MODE_OUT_PP_HIGH_FAST);
  
  /*LCD1602_Cmd(0x20); 
  LCD1602_Cmd(0x32); 
  Delay_ms(5);
  LCD1602_Cmd(0x28);  // 最后发0x28,进入4线模式,设置16*2显示,115*7点阵,4位数据接口 
  Delay_ms(5);
  LCD1602_Cmd(0x28);
  Delay_ms(5);
  EN_HIGH;
  LCD1602_Cmd(0x28);
  EN_LOW;*/
  
  LCD1602_Cmd(0x20);
  Delay_ms(20);
  LCD1602_Cmd(0x28);
  Delay_ms(20);
  LCD1602_Cmd(0x01); /* 清屏 */
  LCD1602_Cmd(0x06); /* 写入数据光标右移,写入新数据显示屏不移动 */
  LCD1602_Cmd(0x0C); /* 开显示,有光标,光标闪烁 */
  //LCD1602_Cmd(0x80);
}

/* 0x80和0xC0分别是两行的开始地址,将字符的序号加上行的地
   址作为命令发送给LCD1602会让下一个字符输出在指定的位置  */
/******发送地址******/
static void LCD1602_SetCursor(uint8_t x, uint8_t y) // x:列坐标 y:行坐标
{
  LCD1602_Cmd(x + (y ? LINE1:LINE0));
}

/******连续发送数据******/
void LCD1602_PrintStr(uint8_t x, uint8_t y, uint8_t *str)
{
  LCD1602_SetCursor(x, y);
  while(*str != '\0')
  {
    LCD1602_Data(*str++);
  }
}

3. delay.h

#ifndef __DELAY_H
#define __DELAY_H 

#include "stm8s.h"

void Delay_ms(uint16_t nCount);
void Delay_us(uint16_t nCount);

#endif /* __DELAY_H */

4. delay.c

#include "delay.h"

//ms级别延时
void Delay_ms(uint16_t nCount)
{
  while(nCount--)
  {
    Delay_us(1000);
  }
}

//us级别延时
void Delay_us(uint16_t nCount)
{
  nCount *= 2;
  while(--nCount);
}

5. main.c

#include "stm8s.h"
#include "lcd1602.h"

void SystemInit_CLK(void);

void main(void)
{
  SystemInit_CLK();
  LCD1602_Init();
  LCD1602_PrintStr(1, 0, "Hello World!"); // 第0行第1列
    
  while (1)
  {
    //LCD1602_PrintStr(0, 0, "Hello!");
    //Delay_us(0xFFF);
  }
}

void SystemInit_CLK(void)
{
  CLK_DeInit();
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); // 16MHz
  CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
  CLK_HSICmd(ENABLE);
}

#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{ 
  while (1)
  {
  }
}
#endif

/****END OF FILE****/
posted @ 2021-12-17 10:42  漫舞八月(Mount256)  阅读(329)  评论(0编辑  收藏  举报