欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機控制LCD1602液晶屏之模塊化編程
[打印本頁]
作者:
engineerarui
時間:
2021-4-20 09:39
標題:
單片機控制LCD1602液晶屏之模塊化編程
這里將我寫的STC12C5A60S2控制LCD1602的程序共享一下,如有不足,敬請指出!
1.jpg
(63.41 KB, 下載次數: 54)
下載附件
2021-4-20 16:26 上傳
代碼結構圖:
2.png
(8.47 KB, 下載次數: 63)
下載附件
2021-4-20 16:26 上傳
程序下載鏈接:
https://download.csdn.net/download/yagnruinihao/16676666
Proteus仿真圖下載鏈接:
https://download.csdn.net/download/yagnruinihao/16676677
————————————————
單片機測試程序:LCD1602測試.c
#include <string.h>
#include "common.h"
#include "LCD1602.h"
void main(void)
{
unsigned char i ;
unsigned char author[] = "Author:YangRui" ;
LCD1602_Init();
for(i=0 ; i<strlen(author) ; i++)
{
LCD1602_AddressWriteByte(LCD1602_ROW0,i,author[i]);
}
LCD1602_AddressWriteString(LCD1602_ROW1,0,"QQ:279729201") ;
while(1);
}
復制代碼
/*################LCD1602.h ################*/
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include "common.h"
//硬件接口定義,與硬件電路相對應
sbit LCD1602_RS_Bit = P2^6;//LCD1602的RS端口,高電平表示數據、低電平表示命令
sbit LCD1602_RW_Bit = P2^5;//LCD1602的RW端口,高電平表示讀操作、低電平表示寫操作
sbit LCD1602_EN_Bit = P2^7;//LCD1602的EN端口,高電平表示讀狀態或讀數據、高脈沖表示寫指令或寫數據
#define LCD1602_DATA_PORT P0//LCD1602的數據口D0~D7,其中Px^0端口接DB0,Px^7端口接DB7,其他接口以此類推
/* RS與RW的設置:
RS Rw
0 0 ---->寫命令
0 1 ---->讀狀態
1 0 ---->寫數據
1 1 ---->讀數據
*/
//LCD1602的RS端口選擇
#define LCD1602_DATA_OPERATION 1//數據模式
#define LCD1602_COMMAND_OPERATION 0//命令模式
//LCD1602的RW端口選擇
#define LCD1602_READ_OPERATION 1//讀操作
#define LCD1602_WRITE_OPERATION 0//寫操作
//LCD1602的EN端口選擇
#define LCD1602_ENABLE 1//允許操作LCD1602
#define LCD1602_DISABLE 0//禁止操作LCD1602
//顯示模式:16X2個字符, 5X7點陣,8位數據口
#define LCD1602_DEFAULT_DISPALY_MODE 0x38
/*
====================================================
LCD1602設置:顯示允許或禁止、光標顯示或禁止、光標閃爍或禁止
====================================================
/*
0 0 0 0 1 D C B
| | |------光標閃爍 : 1-->允許 ; 0-->禁止
| |----------光標顯示 : 1-->允許 ; 0-->禁止
|-------------液晶屏顯示 : 1-->允許 ; 0-->禁止
*/
#define LCD1602_DISPLAY_ENABLE 0X04 //允許液晶顯示
#define LCD1602_DISPLAY_DISABLE (0X04 & (~(0x01<<2)))//禁止液晶顯示
#define LCD1602_CURSOR_DISPLAY_ENABLE 0X02 //允許光標顯示
#define LCD1602_CURSOR_DISPLAY_DISABLE (0X02 & (~(0x01<<1)))//禁止光標顯示
#define LCD1602_CURSOR_BLINK_ENABLE 0X01 //允許光標閃爍
#define LCD1602_CURSOR_BLINK_DISABLE (0X01 & (~(0x01<<0)))//禁止光標閃爍
//默認設置:lcd顯示,光標不顯示,光標不閃爍
#define LCD1602_DEFAULT_DISPLAY_AND_CURSOR_MODE 0x08 | \
LCD1602_DISPLAY_ENABLE | \
LCD1602_CURSOR_DISPLAY_DISABLE | \
LCD1602_CURSOR_BLINK_DISABLE
/*
====================================================
LCD1602設置:指針加一或減一、光標位置加一或減一
====================================================
0 0 0 0 0 1 N S
| |----- 屏幕移動:1-->允許 ; 0-->禁止
|--------- N=1:讀或者寫一個字符后地址指針加1,且光標加1
N=0:讀或者寫一個字符后地址指針減1,且光標減1
當S=1時 :
若N=1,整屏幕左移
N=0,整屏幕右移
以達到光標不移動,而整個屏幕移動的效果
*/
#define LCD1602_POINT_AND_CURSOR_PLUS 0X02 //指針加一、光標加一
#define LCD1602_POINT_AND_CURSOR_MINUS (0X02 & (~(0X01<<1)))//指針減一、光標減一
#define LCD1602_SCREEN_MOVE_ENABLE 0x01 //允許屏幕移動
#define LCD1602_SCREEN_MOVE_DISABLE (0x01 & (~(0X01<<0)))//禁止屏幕移動
//默認設置:光標和指針加一,屏幕不移動
#define LCD1602_DEFAULT_POINT_AND_POINT_ADDRESS_MODE 0X04 | \
LCD1602_POINT_AND_CURSOR_PLUS| \
LCD1602_SCREEN_MOVE_DISABLE
//行位置參數,注意行地址從0開始
#define LCD1602_ROW0 0 //第0行
#define LCD1602_ROW1 1 //第1行
#define LCD1602_MIN_ROW LCD1602_ROW0//行數的最小值,為LCD1602_ROW0,即0*/
#define LCD1602_MAX_ROW LCD1602_ROW1//行數的最大值,為LCD1602_ROW1,即1*/
//列位置參數,注意列地址從0開始
#define LCD1602_ROW_LENGHT 0x28 //每一行的長度為0x28,即40
#define LCD1602_MIN_COLUMN 0 //列數的最小值,為0
#define LCD1602_MAX_COLUMN (LCD1602_ROW_LENGHT-1)//列數的最大值,為39
//每一行的起始地址*/
#define LCD1602_ROW0_ADDRESS_START 0x80 //第0行起始地址
#define LCD1602_ROW1_ADDRESS_START (0x80+0x40) //第1行起始地址
/*每一行的結束地址*/
#define LCD1602_ROW0_ADDRESS_END (LCD1602_ROW0_ADDRESS_START+LCD1602_ROW_LENGHT)//第0行結束地址
#define LCD1602_ROW1_ADDRESS_END (LCD1602_ROW1_ADDRESS_START+LCD1602_ROW_LENGHT)//第1行結束地址
//命令集指令
#define LCD1602_CLEAN_ALL_DISPALY 0x01//清屏指令
#define LCD1602_CURSOR_RETURN_TO_ORIGIN 0x02//光標歸位指令
/*****************外部接口函數******************/
//LCD1602初始化函數
extern void LCD1602_Init(void) ;
//清屏操作
extern void LCD1602_CleanAll(void) ;
//光標歸位操作
extern void LCD1602_CursorHoming(void);
//LCD1602地址寫字節操作
extern char LCD1602_AddressWriteByte(unsigned char Row,unsigned char Column,unsigned char DataValue);
//LCD1602地址寫字符串操作
extern char LCD1602_AddressWriteString(unsigned char Row,unsigned char Column,unsigned char *String);
//寫命令操作
extern void LCD1602_WriteCommand(unsigned char CommandValue);
//寫數據操作
extern void LCD1602_WriteData(unsigned char DataValue);
/**********************************************/
#endif /*__LCD1602_H__*/
復制代碼
/*################ LCD1602.c################*/
/***************************************************************************
模 塊:LCD1602.c
說 明:LCD1602驅動程序
版 本:Version3.0 2021/01/01 06:00
編譯環境:Keil_C51 V9.55
主控芯片:STC12C5A60S2 @11.0592MHZ
STC89C52RC @11.0592MHZ
AT89C51 @11.0592MHZ @Proteus8.9仿真
作 者:楊瑞
聯系方式:【 QQ 】279729201
【郵箱】279729201@qq.com
yangrui90s@163.com
【電話】13630279531
修改記錄:
=================
2021/01/01 06:06
記錄:
1.規范部分函數。
2.取消Delay80usForLcd1602(),調用函數Delay_SomeNop(10)代替消Delay80usForLcd1602()函數。
3.增加ST89C52RC @11.0592MHZ 和AT89C51 @11.0592MHZ @Proteus8.9仿真測試,經測試此代碼
均可適用。
=================
=================
2017/01/6 12:08
記錄:
1.增加中文注釋。
2.修改函數名稱模式,由"模塊名稱"(大寫)+"_"+功能函數名稱構成,例如lcd1602ReadStatus修改為LCD1602_ReadStatus.
3.修改延時函數,將Delay1msForLcd1602函數修改為Delay80usForLcd1602函數。注意,這兩個函數都是
由STC-ISP生成,Delay80usForLcd1602函數由STC-ISP V6.85Q的“軟件延時計算器”針對STC-Y3指令集
@11.0592MHZ自動生成。經過測試,延時59us可能會出現只書寫部分內容的情況,延時60us正好可以。
為了安全,也可以將此延時修改的更長。
=================
=================
2014/04/31 20:09
記錄:
1.解決大工程中,因未安裝LCD1602而導致的工程卡死在函數
lcd1602CheckBusy()的問題,將
do{
;
}while( (lcd1602ReadStatus()) & 0x80));
修改為
do{
i++;
}while( ((lcd1602ReadStatus()) & 0x80) && (i<10));
因為在未安裝LCD1602時,通過"讀狀態"函數lcd1602ReadStatus()讀回來的永遠是0xff,
如果采用第一種算法,會導致程序"卡死",不夠“安全”。
=================
=================
2014/02/24 23:44
記錄:
1.增加函數lcd1602AddressWriteString(...)
=================
=================
2014/02/24 15:00
記錄:
1.增加函數delay1msForLcd1602()
STC12C5A60S2單片機操作速度快比傳統8051快,某些操作延時必須足夠。
=================
***************************************************************************/
#include <string.h>
#include "lcd1602.h"
/*外部接口函數在lcd1602.h中聲明*/
/*****************內部函數******************/
unsigned char LCD1602_ReadStatus(void) ;
void LCD1602_CheckBusy(void) ;
/**********************************************/
/******************************************************************
- 函數名稱:LCD1602_ReadStatus
- 功能描述:讀取LCD1602狀態值
- 函數屬性:內部函數
- 參數說明:無
- 返回說明:LCD1602的狀態值
******************************************************************/
unsigned char LCD1602_ReadStatus(void)
{
unsigned char StatusCode ;
LCD1602_EN_Bit = LCD1602_DISABLE ; //禁止操作LCD1602
LCD1602_RS_Bit = LCD1602_COMMAND_OPERATION ;//命令模式
LCD1602_RW_Bit = LCD1602_READ_OPERATION ; //讀操作
LCD1602_DATA_PORT = 0xff ;
Delay_SomeNop(10); //注意:這里延時不能少,否則不會有效果
LCD1602_EN_Bit = LCD1602_ENABLE ; //允許操作LCD1602
Delay_SomeNop(10); //注意:這里延時不能少,否則不會有效果
StatusCode = LCD1602_DATA_PORT ; //讀取狀態值*/
LCD1602_EN_Bit = LCD1602_DISABLE ; //禁止操作LCD1602
return StatusCode ;
}
/******************************************************************
- 函數名稱:LCD1602_CheckBusy
- 功能描述:判斷LCD1602是否忙碌:若忙碌則等待;若空閑則執行任務
- 函數屬性:內部函數
- 參數說明:無
- 返回說明:無
- 注 :當LCD1602_DATA_PORT[7]等于1,表示LCD1602忙碌,則需要等待一會兒
當LCD1602_DATA_PORT[7]等于0,表示LCD1602空閑,則可以繼續執行后面的任務
- 補 充:這里的“10”是經過測試的,測試中,利用串口打印i的值為1,這里寫10已經足夠大了。
******************************************************************/
void LCD1602_CheckBusy(void)
{
unsigned char i=0;
do{
i++;
}while( ((LCD1602_ReadStatus()) & 0x80) && (i<10));
}
/******************************************************************
- 函數名稱:LCD1602_WriteCommand
- 功能描述:LCD1602寫命令
- 函數屬性:外部函數,供用戶調用
- 參數說明:CommandValue,需要發送給LCD1602的指令值
- 返回說明:無
******************************************************************/
void LCD1602_WriteCommand(unsigned char CommandValue)
{
LCD1602_CheckBusy();
LCD1602_EN_Bit = LCD1602_DISABLE ; /*禁止操作LCD1602*/
LCD1602_RS_Bit = LCD1602_COMMAND_OPERATION ;/*命令模式*/
LCD1602_RW_Bit = LCD1602_WRITE_OPERATION ; /*寫操作*/
LCD1602_DATA_PORT = CommandValue ; /*發送指令值*/
//Delay_SomeNop(10);
LCD1602_EN_Bit = LCD1602_ENABLE ; /*允許操作LCD1602*/
//Delay_SomeNop(10);
LCD1602_EN_Bit = LCD1602_DISABLE ; /*禁止操作LCD1602*/
}
/******************************************************************
- 函數名稱:LCD1602_WriteData
- 功能描述:LCD1602寫數據
- 函數屬性:外部函數,供用戶調用
- 參數說明:DataValue,需要發送給LCD1602的數據
- 返回說明:無
******************************************************************/
void LCD1602_WriteData(unsigned char DataValue)
{
LCD1602_CheckBusy() ;
LCD1602_EN_Bit = LCD1602_DISABLE ; /*禁止操作LCD1602*/
LCD1602_RS_Bit = LCD1602_DATA_OPERATION ; /*數據模式*/
LCD1602_RW_Bit = LCD1602_WRITE_OPERATION ; /*寫操作*/
LCD1602_DATA_PORT = DataValue; /*發送數據*/
//Delay_SomeNop(10);
LCD1602_EN_Bit = LCD1602_ENABLE ; /*允許操作LCD1602*/
//Delay_SomeNop(10);
LCD1602_EN_Bit = LCD1602_DISABLE ; /*禁止操作LCD1602*/
}
/******************************************************************
- 函數名稱:LCD1602_CleanAll
- 功能描述:清除屏幕顯示
- 函數屬性:外部函數,供用戶調用
- 參數說明:無
- 返回說明:無
- 注 :清除屏幕顯示,光標歸位(左上角),地址計數器AC設為0
******************************************************************/
void LCD1602_CleanAll(void)
{
LCD1602_WriteCommand(LCD1602_CLEAN_ALL_DISPALY);
}
/******************************************************************
- 函數名稱:LCD1602_CursorHoming
- 功能描述:光標歸位
- 函數屬性:外部函數,供用戶調用
- 參數說明:無
- 返回說明:無
- 注 :光標歸為,當屏幕移動顯示時,lcd1602顯示所有數據后,
調用此函數,屏幕顯示的所有東西都會歸位。光標在第一
個位置(0x80)。
******************************************************************/
void LCD1602_CursorHoming(void)
{
LCD1602_WriteCommand(LCD1602_CURSOR_RETURN_TO_ORIGIN);
}
/******************************************************************
- 函數名稱:LCD1602_Init
- 功能描述:LCD1602初始化
- 函數屬性:外部函數,供用戶調用
- 參數說明:無
- 返回說明:無
- 注 :設置(1)顯示模式
(2)液晶顯示允許或禁止、光標顯示允許或禁止、光標閃爍允許或禁止
(3)地址指針加一或減一、光標指針加一或減一、屏幕左移或右移
可通過修改LCD1602.H中的LCD1602_DEFAULT_DISPALY_MODE、LCD1602_DEFAULT_DISPLAY_AND_CURSOR_MODE、
LCD1602_DEFAULT_POINT_AND_POINT_ADDRESS_MODE達到不同的顯示效果。
******************************************************************/
void LCD1602_Init(void)
{
LCD1602_CleanAll();
LCD1602_WriteCommand(LCD1602_DEFAULT_DISPALY_MODE);
LCD1602_WriteCommand(LCD1602_DEFAULT_DISPLAY_AND_CURSOR_MODE);
LCD1602_WriteCommand(LCD1602_DEFAULT_POINT_AND_POINT_ADDRESS_MODE);
/*可忽略,在LCD1602_CleanAll()中隱含了該功能*/
LCD1602_CursorHoming();
}
/******************************************************************
- 函數名稱:LCD1602_AddressWriteByte
- 功能描述:在LCD1602的Row行Column列寫入數DataValue
- 函數屬性:外部函數,供用戶調用
- 參數說明:Row-->行地址,有效值為LCD1602_ROW0或LCD1602_ROW1
Column-->列地址,有效值為0~39之間的整數
DataValue-->需要寫入的數據。
- 返回說明:0(成功)或者-1(失敗)
- 注 :1.行地址和列地址都是從0開始的。
需要在LCD1602的第0行第2列顯示阿里伯數字5,調用方式為
LCD1602_AddressWriteByte(LCD1602_ROW0,2,‘5’);
2.在DEBUG模式下,會對入參進行有效性判斷,協助分析。調試后期可通過
屏蔽common.h中的"#define DEBUG 1"減小目標文件的大小。
******************************************************************/
char LCD1602_AddressWriteByte(unsigned char Row,unsigned char Column,unsigned char DataValue)
{
#ifdef DEBUG
if((Column< LCD1602_MIN_COLUMN)|| (Column > LCD1602_MAX_COLUMN)|| \
( (Row != LCD1602_ROW0) &&(Row != LCD1602_ROW1)))
return -1 ;
#endif
if(LCD1602_ROW0 == Row) //注意這里==的兩邊順序,技巧!
LCD1602_WriteCommand(LCD1602_ROW0_ADDRESS_START+Column) ;
else if(LCD1602_ROW1 == Row)//注意這里==的兩邊順序,技巧!
LCD1602_WriteCommand(LCD1602_ROW1_ADDRESS_START+Column) ;
LCD1602_WriteData(DataValue);
return 0;
}
/******************************************************************
- 函數名稱:LCD1602_AddressWriteString
- 功能描述:從LCD1602的Row行Column列開始寫入字符串String
- 函數屬性:外部函數,供用戶調用
- 參數說明:Row-->行地址,有效值為LCD1602_ROW0或LCD1602_ROW1
Column-->列地址,有效值為0~39之間的整數
String-->需要寫入的字符串。
- 返回說明:0(成功)或者-1(失敗)
- 注 :行地址和列地址都是從0開始的。
想在LCD1602的第0行第2列顯示"test",調用方式為
LCD1602_AddressWriteString(LCD1602_ROW0,2,"test");
這里使用的是strlen,而不是sizeof。
在DEBUG模式下,會對入參進行有效性判斷,協助分析。調試后期可通過
屏蔽common.h中的"#define DEBUG 1"減小目標文件的大小。
******************************************************************/
char LCD1602_AddressWriteString(unsigned char Row,unsigned char Column,unsigned char *String)
{
unsigned char length = strlen(String) ;
#ifdef DEBUG
if(Column< LCD1602_MIN_COLUMN|| (Column+strlen(String)-1) > LCD1602_MAX_COLUMN|| \
( (Row != LCD1602_ROW0) &&(Row != LCD1602_ROW1)))
return -1 ;
#endif
if(LCD1602_ROW0 == Row) //注意這里==的兩邊順序,技巧!
LCD1602_WriteCommand(LCD1602_ROW0_ADDRESS_START+Column) ;
else if(LCD1602_ROW1 == Row)//注意這里==的兩邊順序,技巧!
LCD1602_WriteCommand(LCD1602_ROW1_ADDRESS_START+Column) ;
while(length--)
LCD1602_WriteData(*String++);
return 0;
}
復制代碼
/*################common.h################*/
#ifndef __COMMON_H__
#define __COMMON_H__
#include <reg51.h>
#define DEBUG 1 //用于前期調試,后期可以屏蔽本行代碼,達到減少目標文件大小的目標
/*****************外部接口函數******************/
//延時(不精準延時)函數
void Delay_SomeNop(long time);
#endif /*__COMMON_H__*/
復制代碼
/*################common.c################*/
#include <intrins.h>
#include "common.h"
/******************************************************************
- 函數名稱:Delay_SomeNop
- 功能描述:延時函數(不精準延時)
- 函數屬性:外部函數,供用戶調用
- 參數說明:time需要延時時間
- 返回說明:無
- 注 :無
******************************************************************/
void Delay_SomeNop(long time)
{
while(time--)
{
_nop_();
}
}
復制代碼
版權聲明:本文為CSDN博主「刺客阿瑞」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/yagnruinihao/article/details/18559309
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1