stm32 LCD1602显示
生活随笔
收集整理的這篇文章主要介紹了
stm32 LCD1602显示
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
LCD1602.c
#include "LCD1602.h" #include "delay.h"void GPIO_INIT(void) { //GPIO初始化GPIO_InitTypeDef GPIO;GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁用jtag,不然寫入程序和程序執(zhí)行都會受影響RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打開GPIOA~CRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO.GPIO_Pin = EN|RW|RS;GPIO.GPIO_Mode = GPIO_Mode_Out_PP;GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO);GPIO.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;GPIO.GPIO_Mode = GPIO_Mode_Out_PP;GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO);}void LCD_INIT(void) { //初始化GPIO_INIT(); GPIO_Write(GPIOA, 0x0000); GPIO_Write(GPIOC, 0x0000);delay_us(500);LCD_WRITE_CMD(0x38);LCD_WRITE_CMD(0x0d); //開啟光標和閃爍LCD_WRITE_CMD(0x06);LCD_WRITE_CMD(0x01); }void LCD_WRITE_CMD(char CMD) {//寫入命令函數(shù)ReadBusy();GPIO_ResetBits(GPIOC, RS);GPIO_ResetBits(GPIOC, RW);GPIO_ResetBits(GPIOC, EN);GPIO_Write(GPIOA, CMD); //GPIO_SetBits(GPIOC, EN);GPIO_ResetBits(GPIOC, EN); }void LCD_WRITE_ByteDATA(char ByteData) { //寫入單個Byte函數(shù)ReadBusy();GPIO_SetBits(GPIOC, RS);GPIO_ResetBits(GPIOC, RW);GPIO_ResetBits(GPIOC, EN);GPIO_Write(GPIOA, ByteData);GPIO_SetBits(GPIOC, EN);GPIO_ResetBits(GPIOC, EN); }void LCD_WRITE_StrDATA(char *StrData,char row, char col) {//寫入字符串char baseAddr = 0x00; //定義256位地址if (row){baseAddr = 0xc0;}else{baseAddr = 0x80; } baseAddr += col;while (*StrData != '\0'){LCD_WRITE_CMD(baseAddr);LCD_WRITE_ByteDATA(*StrData);baseAddr++; StrData++;} }void ReadBusy(void) { //讀忙函數(shù),讀忙之前記得更改引腳的工作方式!!!因為STM32的IO不是準雙向IOGPIO_InitTypeDef GPIO;GPIO_Write(GPIOA, 0x00ff); GPIO.GPIO_Pin = GPIO_Pin_7; //選定GPIOA的第七PinGPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING; //第七Pin的工作方式為浮空輸入模式,用于檢測LCD1602的忙狀態(tài)GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO);GPIO_ResetBits(GPIOC, RS);//RS拉低GPIO_SetBits(GPIOC, RW);//RW拉高GPIO_SetBits(GPIOC, EN); //使能開while( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_7 ) ); //讀第七Pin狀態(tài),如果一直為1則循環(huán)等待GPIO_ResetBits(GPIOC, EN);//使能關(guān)GPIO.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; //使GPIOA的狀態(tài)還原成推挽模式GPIO.GPIO_Mode = GPIO_Mode_Out_PP;GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO); }void WUserImg(char pos,char *ImgInfo) { //寫入用戶自定義圖像char cgramAddr; //CGRAM的用戶自定義字符位if( pos <= 1 ) cgramAddr = 0x40; // if( pos > 1 && pos <= 3 ) cgramAddr = 0x50;if( pos > 3 && pos <= 5 ) cgramAddr = 0x60;if( pos > 5 && pos <= 7 ) cgramAddr = 0x70;LCD_WRITE_CMD( (cgramAddr + (pos%2) * 8) ); //指定字模寫入的地址,一般從0x40開始,0x78結(jié)束while( *ImgInfo != '\0' ){ //循環(huán)寫入tem數(shù)據(jù),即用戶取模的數(shù)據(jù)LCD_WRITE_ByteDATA( *ImgInfo );ImgInfo++;} }LCD1602.h
#ifndef LCD1602_H #define LCD1602_H#include "sys.h"#define BUSY 0x80 //忙標志 #define RS GPIO_Pin_13 //設(shè)置PC13為RS #define RW GPIO_Pin_14 //PC14為RW #define EN GPIO_Pin_15 //PC15為EN使能void ReadBusy(void); void LCD_WRITE_CMD(char CMD); void LCD_WRITE_StrDATA(char *StrData, char row, char col); void LCD_WRITE_ByteDATA(char ByteData); void LCD_INIT(void); void GPIO_INIT(void); void WUserImg(char pos,char *ImgInfo);#endif總結(jié)
以上是生活随笔為你收集整理的stm32 LCD1602显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java技术:Optional 相关用法
- 下一篇: 分享9个实用的电脑维修技巧,赶紧收藏吧!