【51單片機零基礎-chapter6:LCD1602調試工具】

在這里插入圖片描述

實驗0-用顯示屏LCD驗證自己的猜想

如同c++的cout,前端的console.log()

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"
int var=0;
void main()
{LCD_Init();LCD_ShowNum(1,1,var+211,5);while(1){;}
}

在這里插入圖片描述

實驗1-編寫LCD1602液晶顯示屏驅動函數

LCD1602.c

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"sbit LCD_RS=P2^6;				//LCD1602 RS 數據/指令選擇
sbit LCD_RW=P2^5;				//LCD1602 RW 讀/寫選擇
sbit LCD_EN=P2^7;				//LCD1602 EN 使能 #define LCD_DataPort		P0	//LCD1602 D0~D7 數據端口/*** @brief  LCD1602延時函數,12MHz調用可延時1ms* @param  無* @retval 無*/
void LCD_Delay()		//@11.0592MHz 1ms
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}/*** @brief  LCD1602寫命令* @param  Command 要寫入的命令* @retval 無*/
void LCD_WriteCommand(unsigned Command)
{LCD_RS = 0;					//LCD1602指令LCD_RW = 0;					//LCD1602寫LCD_DataPort = Command;		//寫指令LCD_EN = 1;					//LCD1602 EN使能為高LCD_Delay();				//delay 1ms,防止時序太快LCD1602來不及執行LCD_EN = 0;					//LCD1602 EN使能為低LCD_Delay();				//delay 1ms
}/*** @brief  LCD1602寫數據* @param  Data 要寫入的數據* @retval 無*/
void LCD_WriteData(unsigned Data)
{LCD_RS = 1;				//LCD1602數據LCD_RW = 0;				//LCD1602寫LCD_DataPort = Data;	//寫數據LCD_EN = 1;				//LCD1602 EN使能為高LCD_Delay();			//delay 1ms,防止時序太快LCD1602來不及執行LCD_EN = 0;				//LCD1602 EN使能為低LCD_Delay();			//delay 1ms
}/*** @brief  LCD1602初始化函數* @param  無* @retval 無*/
void LCD_Init(void)
{LCD_WriteCommand(0x38);	//8位數據接口,兩行顯示,5*7點陣LCD_WriteCommand(0x0c);	//顯示開,光標關,閃爍關	LCD_WriteCommand(0x06);	//數據讀寫操作后,光標自動加1,畫面不動LCD_WriteCommand(0x01);	//清屏
}/*** @brief  LCD1602設置光標位置* @param  Line 行位置,范圍:1~2* @param  Column 列位置,范圍:1~16* @retval 無*/
void LCD_SetCursor(unsigned char Line, unsigned char Column)
{unsigned char AC_DDRAM = 0;/* 計算寫入到DDRAM(顯示區)的光標AC的位置 */if(Line == 1){AC_DDRAM = 0x00 + (Column - 1);AC_DDRAM |= 0x80;}else if(Line == 2){AC_DDRAM = 0x40 + (Column - 1);AC_DDRAM |= 0x80;}LCD_WriteCommand(AC_DDRAM);	//設置光標地址
}/*** @brief  在LCD1602指定位置上顯示一個字符* @param  Line 行位置,范圍:1~2* @param  Column 列位置,范圍:1~16* @param  Char 要顯示的字符* @retval 無*/
void LCD_ShowChar(unsigned char Line, unsigned char Column, char Char)
{LCD_SetCursor(Line, Column);	//設置光標位置LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置上顯示一個字符* @param  Line 行位置,范圍:1~2* @param  Column 列位置,范圍:1~16* @param  Char 要顯示的字符* @retval 無*/
void LCD_ShowString(unsigned char Line, unsigned char Column, char *String)
{unsigned char i = 0;LCD_SetCursor(Line, Column);	//設置光標位置/* 打印字符串 */i = 0;while(String[i] != '\0'){LCD_WriteData(String[i]); //光標AC每次自動加1i++;}
}/*** @brief  返回值=X的Y次方*/
signed int LCD_Power(int x, int y)
{int result = 1;while(y > 0){result *= x;y--;}return result;
}/*** @brief  在LCD1602指定位置開始顯示所給數字* @param  Line 起始行位置,范圍:1~2* @param  Column 起始列位置,范圍:1~16* @param  Number 要顯示的數字,范圍:0~65535* @param  Length 要顯示數字的長度,范圍:1~5* @retval 無*/
void LCD_ShowNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length)
{unsigned char i = 0;unsigned char Chr;LCD_SetCursor(Line, Column);	//設置光標位置for(i=Length; i>0; i--){Chr = Num/LCD_Power(10,i-1)%10;if(Chr >=0 && Chr <= 9){Chr += 0x30;}LCD_WriteData(Chr);}
}/*** @brief  在LCD1602指定位置開始以有符號十進制顯示所給數字* @param  Line 起始行位置,范圍:1~2* @param  Column 起始列位置,范圍:1~16* @param  Number 要顯示的數字,范圍:-32768~32767* @param  Length 要顯示數字的長度,范圍:1~5* @retval 無*/
void LCD_ShowSignedNum(unsigned char Line, unsigned char Column, int Num, unsigned char Length)
{unsigned char i = 0;unsigned char SingleNum;unsigned char Number1;LCD_SetCursor(Line, Column);	//設置光標位置if(Num>=0){LCD_WriteData('+');Number1 = Num;}else{LCD_WriteData('-');Number1 = -Num;			//-32768 轉為32768之后可能會溢出}for(i=Length; i>0; i--){SingleNum = Number1/LCD_Power(10,i-1)%10;if(SingleNum >=0 && SingleNum <= 9){SingleNum += 0x30;}LCD_WriteData(SingleNum);}
}/*** @brief  在LCD1602指定位置開始以十六進制顯示所給數字* @param  Line 起始行位置,范圍:1~2* @param  Column 起始列位置,范圍:1~16* @param  Number 要顯示的數字,范圍:0~0xFFFF* @param  Length 要顯示數字的長度,范圍:1~4* @retval 無*/
void LCD_ShowHexNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length)
{unsigned char i = 0;unsigned char SingleNum;LCD_SetCursor(Line, Column);	//設置光標位置for(i=Length; i>0; i--){SingleNum = Num/LCD_Power(16,i-1)%16;if(SingleNum >=0 && SingleNum <= 9){SingleNum += 0x30;				}else if(SingleNum >=10 && SingleNum <= 15){SingleNum = SingleNum - 10 + 'A';		//16進制A,B,C,D,E,F}LCD_WriteData(SingleNum);}
}/*** @brief  在LCD1602指定位置開始以二進制顯示所給數字* @param  Line 起始行位置,范圍:1~2* @param  Column 起始列位置,范圍:1~16* @param  Number 要顯示的數字,范圍:0~1111 1111 1111 1111* @param  Length 要顯示數字的長度,范圍:1~16* @retval 無*/
void LCD_ShowBinaryNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length)
{unsigned char i = 0;unsigned char SingleNum;LCD_SetCursor(Line, Column);	//設置光標位置for(i=Length; i>0; i--){SingleNum = Num/LCD_Power(2,i-1)%2;SingleNum += 0x30;LCD_WriteData(SingleNum);}
}

LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__void LCD_Init(void);
void LCD_WriteCommand(unsigned Command)
void LCD_ShowChar(unsigned char Line, unsigned char Column, char Char);
void LCD_ShowString(unsigned char Line, unsigned char Column, char *String);
void LCD_ShowNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line, unsigned char Column, int Num, unsigned char Length);
void LCD_ShowHexNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length);
void LCD_ShowBinaryNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length);
#endif

main.c

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"void main()
{LCD_Init();LCD_ShowChar(1, 1, 'Y');//顯示一個字符:1行1列LCD_ShowString(1, 3, "POSTGRADUATE");//顯示一個字符串:1行3列開始LCD_ShowNum(2, 1, 985, 3);//2行1列顯示數字985,如果指定兩位則不顯示高位,為85,如果是四位則高位補零顯示,為0985//LCD_ShowSignedNum(2, 5, -5, 1);//顯示有符號數(符號不計入位數)//LCD_ShowHexNum(2, 8, 0xA8, 2);	//顯示十六進制LCD_ShowBinaryNum(2, 5, 0xAA, 8);//顯示二進制while(1){;}
}

比較核心的
在這里插入圖片描述
在這里插入圖片描述

實驗2-動態顯示

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
int var=0;
void main()
{LCD_Init();while(1){var++;Delay(1000);	LCD_ShowNum(1,1,var,3);Delay(1000);}
}

實驗3-滾動顯示

在這里插入圖片描述
在這里插入圖片描述

在Main.c中增加LCD1602移屏指令

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"
#include "Delay.h"
void main(){LCD_Init();while(1){LCD_ShowString(1, 16, "CONGRATULATIONS!");LCD_ShowString(2, 16, "WELCOME TO UESTC , WANG XIAO !");Delay(500);LCD_WriteCommand(0x18);//調用一次左移一次//LCD_WriteCommand(0x1c);//調用一次右移一次		Delay(500);}
}

在這里插入圖片描述
參考1:LCD顯示時期
參考2:筆記
參考3:筆記
參考4:lcd位移
參考5:lcd驅動程序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64942.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【網絡】ARP表、MAC表、路由表

ARP表 網絡設備存儲IP-MAC映射關系的表項&#xff0c;便于快速查找和轉發數據包 ARP協議工作原理 ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;地址解析協議&#xff0c;能夠將網絡層的IP地址解析為數據鏈路層的MAC地址。 1.主機在自己的ARP緩沖區中建…

Ubuntu22.04雙系統安裝記錄

1.Ubuntu24.04在手動分區時&#xff0c;沒有efi選項&#xff0c;需要點擊分區界面左下角&#xff0c;選擇efi的位置&#xff0c;然后會自動創建/boot/efi分區&#xff0c;改到2GB大小即可。 2.更新Nvidia驅動后&#xff0c;重啟電腦wifi消失&#xff0c;參考二選一&#xff1a…

Python Notes 1 - introduction with the OpenAI API Development

Official document&#xff1a;https://platform.openai.com/docs/api-reference/chat/create 1. Use APIfox to call APIs 2.Use PyCharm to call APIs 2.1-1 WIN OS.Configure the Enviorment variable #HK代理環境&#xff0c;不需要科學上網(價格便宜、有安全風險&#…

【Python其他生成隨機字符串的方法】

在Python中&#xff0c;除了之前提到的方法外&#xff0c;確實還存在其他幾種生成隨機字符串的途徑。以下是對這些方法的詳細歸納&#xff1a; 方法一&#xff1a;使用random.randint結合ASCII碼生成 你可以利用random.randint函數生成指定范圍內的隨機整數&#xff0c;這些整…

leetcode hot 100 跳躍游戲

55. 跳躍游戲 已解答 中等 相關標簽 相關企業 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則…

《Vue3實戰教程》40:Vue3安全

如果您有疑問&#xff0c;請觀看視頻教程《Vue3實戰教程》 安全? 報告漏洞? 當一個漏洞被上報時&#xff0c;它會立刻成為我們最關心的問題&#xff0c;會有全職的貢獻者暫時擱置其他所有任務來解決這個問題。如需報告漏洞&#xff0c;請發送電子郵件至 securityvuejs.org。…

01.02周二F34-Day44打卡

文章目錄 1. 這家醫院的大夫和護士對病人都很耐心。2. 她正跟一位戴金邊眼鏡的男士說話。3. 那個人是個圓臉。4. 那個就是傳說中的鬼屋。5. 他是個很好共事的人。6. 我需要一杯提神的咖啡。7. 把那個卷尺遞給我一下。 ( “卷尺” 很復雜嗎?)8. 他收到了她將乘飛機來的消息。9.…

Spring Boot項目中使用單一動態SQL方法可能帶來的問題

1. 查詢計劃緩存的影響 深入分析 數據庫系統通常會對常量SQL語句進行編譯并緩存其執行計劃以提高性能。對于動態生成的SQL語句&#xff0c;由于每次構建的SQL字符串可能不同&#xff0c;這會導致查詢計劃無法被有效利用&#xff0c;從而需要重新解析、優化和編譯&#xff0c;…

【Rust自學】10.2. 泛型

喜歡的話別忘了點贊、收藏加關注哦&#xff0c;對接下來的教程有興趣的可以關注專欄。謝謝喵&#xff01;(&#xff65;ω&#xff65;) 題外話&#xff1a;泛型的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整個第10章全都是Rust的重難點&#xff01;&#xf…

Spark-Streaming有狀態計算

一、上下文 《Spark-Streaming初識》中的NetworkWordCount示例只能統計每個微批下的單詞的數量&#xff0c;那么如何才能統計從開始加載數據到當下的所有數量呢&#xff1f;下面我們就來通過官方例子學習下Spark-Streaming有狀態計算。 二、官方例子 所屬包&#xff1a;org.…

Python 3 輸入與輸出指南

文章目錄 1. 輸入與 input()示例&#xff1a;提示&#xff1a; 2. 輸出與 print()基本用法&#xff1a;格式化輸出&#xff1a;使用 f-string&#xff08;推薦&#xff09;&#xff1a;使用 str.format()&#xff1a;使用占位符&#xff1a; print() 的關鍵參數&#xff1a; 3.…

【SQLi_Labs】Basic Challenges

什么是人生&#xff1f;人生就是永不休止的奮斗&#xff01; Less-1 嘗試添加’注入&#xff0c;發現報錯 這里我們就可以直接發現報錯的地方&#xff0c;直接將后面注釋&#xff0c;然后使用 1’ order by 3%23 //得到列數為3 //這里用-1是為了查詢一個不存在的id,好讓第一…

Swift Combine 學習(四):操作符 Operator

Swift Combine 學習&#xff08;一&#xff09;&#xff1a;Combine 初印象Swift Combine 學習&#xff08;二&#xff09;&#xff1a;發布者 PublisherSwift Combine 學習&#xff08;三&#xff09;&#xff1a;Subscription和 SubscriberSwift Combine 學習&#xff08;四&…

時間序列預測算法---LSTM

目錄 一、前言1.1、深度學習時間序列一般是幾維數據&#xff1f;每個維度的名字是什么&#xff1f;通常代表什么含義&#xff1f;1.2、為什么機器學習/深度學習算法無法處理時間序列數據?1.3、RNN(循環神經網絡)處理時間序列數據的思路&#xff1f;1.4、RNN存在哪些問題? 二、…

leetcode題目(3)

目錄 1.加一 2.二進制求和 3.x的平方根 4.爬樓梯 5.顏色分類 6.二叉樹的中序遍歷 1.加一 https://leetcode.cn/problems/plus-one/ class Solution { public:vector<int> plusOne(vector<int>& digits) {int n digits.size();for(int i n -1;i>0;-…

快速上手LangChain(三)構建檢索增強生成(RAG)應用

文章目錄 快速上手LangChain(三)構建檢索增強生成(RAG)應用概述索引阿里嵌入模型 Embedding檢索和生成RAG應用(demo:根據我的博客主頁,分析一下我的技術棧)快速上手LangChain(三)構建檢索增強生成(RAG)應用 langchain官方文檔:https://python.langchain.ac.cn/do…

[cg] android studio 無法調試cpp問題

折騰了好久&#xff0c;native cpp庫無法調試問題&#xff0c;原因 下面的Deploy 需要選Apk from app bundle!! 另外就是指定Debug type為Dual&#xff0c;并在Symbol Directories 指定native cpp的so路徑 UE項目調試&#xff1a; 使用Android Studio調試虛幻引擎Android項目…

【Windows】powershell 設置執行策略(Execution Policy)禁止了腳本的運行

報錯信息&#xff1a; 無法加載文件 C:\Users\11726\Documents\WindowsPowerShell\profile.ps1&#xff0c;因為在此系統上禁止運行腳本。有關詳細信息&#xff0c;請參 閱 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符…

可編輯37頁PPT |“數據湖”構建汽車集團數據中臺

薦言分享&#xff1a;隨著汽車行業智能化、網聯化的快速發展&#xff0c;數據已成為車企經營決策、優化生產、整合供應鏈的核心資源。為了在激烈的市場競爭中占據先機&#xff0c;汽車集團亟需構建一個高效、可擴展的數據管理平臺&#xff0c;以實現對海量數據的收集、存儲、處…

【快速實踐】類激活圖(CAM,class activation map)可視化

類激活圖可視化&#xff1a;有助于了解一張圖像的哪一部分讓卷積神經網絡做出了最終的分類決策 對輸入圖像生成類激活熱力圖類激活熱力圖是與特定輸出類別相關的二維分數網格&#xff1a;對任何輸入圖像的每個位置都要進行計算&#xff0c;它表示每個位置對該類別的重要程度 我…