久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > LCD1602驅動顯示實驗STM32

LCD1602驅動顯示實驗STM32

作者: 時間:2016-12-01 來源:網絡 收藏
聲明:本文是在網友追夢的程序基本上修改而來。程序移植性強,可讀性強,特此感謝追夢同學。

/**************************************************************************
**文件名稱:LCD1602.h for STM32
**************************************************************************/
#ifndef LCD1602_STM32_H
#define LCD1602_STM32_H

本文引用地址:http://cqxgywz.com/article/201612/324328.htm

#define LCD_RS_1 GPIOE->BSRR=GPIO_Pin_0 //PE.0--(LCD)RS
#define LCD_RS_0 GPIOE->BRR =GPIO_Pin_0
#define LCD_RW_1 GPIOE->BSRR=GPIO_Pin_1 //PE.1--(LCD)RW
#define LCD_RW_0 GPIOE->BRR =GPIO_Pin_1
#define LCD_EN_1 GPIOE->BSRR=GPIO_Pin_2 //PE.2--(LCD)E
#define LCD_EN_0 GPIOE->BRR =GPIO_Pin_2
#define DATAOUT GPIOD->ODR //PD[0..7]--(LCD)D0~D7

#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif

extern void delay_nms(unsigned long n);
extern void delay_nus(unsigned long n);

uint8_t LCD_busy(void); //讀LCD忙碌狀態,直到LCD1602不忙為止
void Wait_Leisure(void);//一直等待到LCD1602空閑
void LCD_WriteInitcmd(uchar cmd);//寫入LCD初始化時的命令,不可以檢測忙狀態
void LCD_Writecmd(uchar cmd);//寫指令到LCD1602,指令數據占一個字節
void LCD_Writedata(uchar dat);//寫一字節數據到LCD1602
void LCD_pos(uchar pos);//設定顯示位置 00h~27h,40h~47h
void LCD_Setpos(uchar row,uchar col);//根據習慣設定顯示位置
void LCD_DispChar(char ch);//顯示一個字符
void LCD_Setpos_DispChar(uchar row,uchar col,char ch);//在指定位置顯示一個字符
void LCD_DispString(char str[]);//使LCD1602顯示一個字符串,顯示位置需提前設定
void LCD_Setpos_DispString(uchar row,uchar col,char str[]);//使LCD1602從指定位置開始顯示一個字符串
void LCD_Dispnum(uint32_t num);//顯示一個不超過8位的整數,顯示位置需提前設置
void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num);//在指定位置顯示一個不超過8位的整數
void LCD_DispDecimal(uint32_t num,uchar dot);//顯示一個有效位不超過8位的浮點數,顯示位置需要提前設定
//在指定位置顯示一個有效位不超過8位的浮點數
void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot);
//顯示日歷,顯示日期與時間
void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec);
//顯示秒表,顯示時,分,秒,10毫秒,精確到10ms
void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms);
//顯示頻率計,動態自動調整頻率顯示
void LCD_DispFreq(uint32_t freq);
void LCD_ShiftLeft(void);//屏幕整體左移一格,用于滾動顯示
void LCD_ShiftRight(void);//屏幕整體右移一格,用于滾動顯示
void LCD_Clear(void);//清屏,清除顯示
void LCD_Return(void);//使光標還回原點位置
void LCD_Close(void);//關顯示
void LCD_Open(void);//開顯示
void LCD_FlickerChar(uchar row,uchar col);//使指定位置字符閃爍,不顯示光標
void LCD_CloseFlicker(void);//關閉字符閃爍
void LCD_FlickerScreen(void);//屏幕秒閃爍一次
/*********************************************************************
*名 稱:LCD_Init()
*功 能:初始化LCD1602
*入口參數:無
*出口參數:無
*常用命令:0x38:16*2顯示,5*&點陣顯示字符,8位數據;指令執行時間40us
* 0x0C:開顯示,關光標 40us
* 0x08:關顯示,關光標 40us
* 0x0D:字符閃爍,關光標,接著設定位置,閃爍周期0.4ms左右
* 0x0F:字符閃爍,開光標
* 0x06:寫完數據自動右移光標,普通情形,從左向右顯示 40us
* 0x04:寫完數據自動左移光標,可以從右向左顯示 40us
* 0x01:清除顯示內容,即清屏 1.64ms
* 0x02:使光標還回起始位置 1.64ms
* 0x18:屏幕上所有字符同時左移一格,適合滾動顯示 40us
* 0x1C:屏幕上所有字符同時右移一格,適合滾動顯示 40us
*********************************************************************/
void LCD_Init(void);

#endif

/*********************************************************************
* 文件名稱:LCD1602.C
* 功能:為51單片機提供LCD1602驅動程序,解決LCD1602與上層軟件的隔離問題
*********************************************************************/
#include "stm32f10x.h"
#include "LCD1602.h"
#ifndef LCD1602_STM32_C
#define LCD1602_STM32_C

/*********************************************************************
*名 稱:LCD_busy()
*功 能:讀LCD忙碌狀態,直到LCD1602不忙為止
*入口參數:無
*出口參數:無符號字節類型,返回0表示LCD已經操作完畢,空閑。
*說 明:一般在寫入新命令或數據之前用while(LCD_busy())語句等待LCD就緒
*********************************************************************/
uint8_t LCD_busy(void)
{
LCD_RS_0;
delay_nus(1);
LCD_RW_1;
delay_nus(1);
do
{
LCD_EN_0;
delay_nus(200);
LCD_EN_1;
delay_nus(200);
}
while(GPIOD->IDR & 0x80);
LCD_EN_0;
return (uint8_t)0;
}
/*********************************************************************
*功 能:一直等待到LCD1602空閑
*********************************************************************/
void Wait_Leisure(void)
{
LCD_busy();
}
/*********************************************************************
*功 能:寫入LCD初始化時的命令,不可以檢測忙狀態
*********************************************************************/
void LCD_WriteInitcmd(uchar cmd)
{
LCD_RS_0;
delay_nus(1);
LCD_RW_0;
delay_nus(1);
DATAOUT = cmd;
LCD_EN_0;
delay_nus(300);
LCD_EN_1;
delay_nus(300);
LCD_EN_0;
delay_nms(2);
}
/*********************************************************************
*名 稱:LCD_Writecmd()
*功 能:寫指令到LCD1602,指令數據占一個字節
*入口參數:cmd:待寫入的指令
*出口參數:無
*********************************************************************/
void LCD_Writecmd(uchar cmd)
{
while(LCD_busy());
LCD_RS_0; //對同一個寄存器的兩次寫入,中間延時一會
delay_nus(1);
LCD_RW_0;
delay_nus(1);
LCD_EN_0;
delay_nus(300);//產生脈沖
DATAOUT = cmd;
LCD_EN_1;
delay_nus(300);//必要的延時
LCD_EN_0; //下降沿,LCD1602開始工作
}


上一頁 1 2 3 4 下一頁

評論


技術專區

關閉