STM32F103驅動LCD1602 (4線) 函式超級詳細
STM32F103驅動LCD1602 採用的四線模式
/*1602.h 檔案*/
#ifndef __LCD1602_H
#define __LCD1602_H
#include "stm32f10x.h"
#define LCD_DATA_PORT GPIOA
//1602指令/資料 引腳
#define LCD_RS_Set() GPIO_SetBits(GPIOB, GPIO_Pin_0)
#define LCD_RS_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_0)
//1602讀寫引腳
#define LCD_RW_Set() GPIO_SetBits(GPIOB, GPIO_Pin_1)
#define LCD_RW_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_1)
//1602使能引腳
#define LCD_EN_Set() GPIO_SetBits(GPIOB, GPIO_Pin_2)
#define LCD_EN_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_2)
//1602資料埠 PD4~7
#define DATAOUT(x) GPIO_Write(LCD_DATA_PORT, x)
#define u8 unsigned char
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
/*
1602.C檔案
1602採用四線傳輸
*/
#include "lcd1602.h"
#include "Systick.h"
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);//開啟時鐘
//dataIO GPIOA4~7 初始化
GPIO_InitStructure.GPIO_Pin = 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(LCD_DATA_PORT, &GPIO_InitStructure);
// RS RW E IO初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/* 檢測液晶忙不忙 */
void LCD1602_Wait_Ready(void)
{
int8_t sta;
DATAOUT(0xff); //PA埠全部置1
LCD_RS_Clr(); //RS 0
LCD_RW_Set(); //RW 1
do
{
LCD_EN_Set(); //EN 1
SysTick_Delay_Ms(5); //延時5MS
sta = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7);//讀取狀態字
LCD_EN_Clr(); //EN 0
}while(sta & 0x80);//bit7等於1表示忙,重複檢測到其為0停止
}
/*向1602寫入一位元組命令,cmd-待寫入命令 */
//寫入指令PA4-7 RS-0 RW-0
void LCD1602_Write_Cmd(u8 cmd)
{
LCD1602_Wait_Ready(); //判斷忙不忙
LCD_RS_Clr();
LCD_RW_Clr();
DATAOUT(cmd); //先傳高四位
LCD_EN_Set();
LCD_EN_Clr();
DATAOUT(cmd<<4); //低四位左移到高四位
LCD_EN_Set();
LCD_EN_Clr();
}
/* 向1602寫入一位元組資料*/
void LCD1602_Write_Dat(u8 dat)
{
LCD1602_Wait_Ready(); //判斷忙不忙
LCD_RS_Set(); //1
LCD_RW_Clr(); //0
DATAOUT(dat); //先傳高四位
LCD_EN_Set();
LCD_EN_Clr();
DATAOUT(dat<<4); //低四位左移到高四位
LCD_EN_Set();
LCD_EN_Clr();
}
/*清屏*/
void LCD1602_ClearScreen(void)
{
LCD1602_Write_Cmd(0x01);
}
/* 設定RAM其實地址,即游標位置,(X,Y)對應螢幕上的字元座標 */
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);
}
/* 在液晶上顯示字串,(X,Y)-對應螢幕上的其實座標,str-字串指標 */
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)
{
LCD1602_Write_Cmd(0x28); //16*2顯示,5*7點陣,4位資料口
LCD1602_Write_Cmd(0x0C); //開顯示,游標關閉
LCD1602_Write_Cmd(0x06); //文字不動,地址自動+1
LCD1602_Write_Cmd(0x01); //清屏
}
/*Systick.h*/
#include "stm32f10x.h"
#include "Systick.h"
#include "core_cm3.h" //Systick 是核心片上外設
/*
啟動滴答定時器
*/
// 1微妙延時
void SysTick_Delay_Us( unsigned int us)
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000000);
for(i=0;i<us;i++)
{
while( !((SysTick->CTRL)&(1<<16)) );
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
//1毫秒延時
void SysTick_Delay_Ms( unsigned int ms)
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000);
for(i=0;i<ms;i++)
{
while( !((SysTick->CTRL)&(1<<16)) );
}
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
/* Systick.h*/
#ifndef __SYSTICK_H__
#define __SYSTICK_H__
void SysTick_Delay_Us( unsigned int us) ;
void SysTick_Delay_Ms( unsigned int ms);
#endif
/*mian 主函式*/
#include "Systick.h"
#include "led.h"
#include "lcd1602.h"
int main(void)
{
u8 str[] = "ATOM@ALIENTEK";
GPIO_Configuration();
LCD1602_Init();
LCD1602_ClearScreen();
LCD1602_Show_Str(2, 0, str);
LCD1602_Show_Str(2, 1, "I love STM32");
}
相關文章
- Arduino A4950 驅動直流電機 超詳細版UI
- Spring AOP全面詳解(超級詳細)Spring
- Java註解最全詳解(超級詳細)Java
- 詳細講解函式呼叫原理函式
- 【科普】Tomcat使用方法(超級詳細)Tomcat
- Android Studio安裝教程(超級詳細)Android
- vue3函式setUp和reactive函式詳細講解Vue函式React
- 超級詳細的react筆記(三)jsxReact筆記JS
- phpRedis函式使用總結【分類詳細】PHPRedis函式
- Rxjs 裡 subscribeToArray 工具函式的詳細分析JS函式
- :SpringBoot專案接入ELK超級版(超詳細圖文教程)Spring Boot
- Duboo整合SpringBoot超級詳細例子(附原始碼)Spring Boot原始碼
- Cobbler 自動部署裝機(超詳細)
- useRoute 函式的詳細介紹與使用示例函式
- A*演算法(超級詳細講解,附有舉例的詳細手寫步驟)演算法
- java集合梳理【10】— Vector超級詳細原始碼分析Java原始碼
- springboot超級詳細的日誌配置(基於logback)Spring Boot
- AlphaFold2無痛安裝教程(超級詳細)
- JWT 超詳細分析JWT
- pandas agg函式的詳細介紹與應用函式
- MySQL之儲存函式詳細介紹艹籟MySql儲存函式
- Node.js非同步程式設計~超級詳細哦Node.js非同步程式設計
- 顯示卡驅動有必要更新嗎 顯示卡驅動怎麼更新詳細教程
- python函式超時怎麼自動退出?Python函式
- Vue 超詳細手記Vue
- web259(超詳細)Web
- MyBatis Generator 超詳細配置MyBatis
- Vue 指令大全(超詳細)Vue
- 超詳細的IIS部署
- python使用xpath(超詳細)Python
- Maven筆記---超詳細Maven筆記
- java運算子(超詳細!!!)Java
- 超詳細Python正規表示式操作指南(re使用),一Python
- python進階(20) 正規表示式的超詳細使用Python
- Treevalue(0x03)——函式樹化詳細解析(下篇)函式
- Treevalue(0x02)——函式樹化詳細解析(上篇)函式
- tf.gfile函式和gfile.MakeDirs(FLAGS.train_dir)函式的詳細說明函式AI
- win10ahci驅動怎麼安裝_win10安裝ahci驅動詳細教程Win10