5. 51单片机 LCD1602调试工具

 本专栏所有引脚及端口 代码及注解 选择的是BST-V51 单片机

需结合具体的单片机原理图进行分析

接下来的本专栏都选择该单片机及其原理图分析来进行操作

以后的学习中都对此类进行模块化编程,将各个模块分开进行设计和编写,最后调用就行,不会模块化编程的友友可以先去第4节看

使用 LCD1602 液晶屏作为调试窗口,提供类似 printf 函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。

LCD1602原理图

需要关注LCD1602的各个引脚位置​

函数

作用

LCD_Init();

初始化

LCD_ShowChar(1,1,'A');

显示一个字符

LCD_ShowString(1,3,"Hello");

显示字符串

LCD_ShowNum(1,9,123,3);

显示十进制数字

LCD_ShowSignedNum(1,13,-66,2);

显示有符号十进制数字

LCD_ShowHexNum(2,1,0xA8,2);

显示十六进制数字

LCD_ShowBinNum(2,4,0xAA,8);

显示二进制数字

LCD1602.h 文件

#ifndef __LCD1602_H__
#define __LCD1602_H__

void LCD_Init();  //初始化
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);  //显示一个字符
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String); //显示字符串
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); //显示十进制数字
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);   //显示有符号十进制数字
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);  //显示十六进制数字
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);  //显示二进制数字
void LCD_ShowOctNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);  //显示八进制数字
void LCD_SetCursor(unsigned char Line,unsigned char Column);    //光标
#endif

 

LCD1602.c 函数

需要注意:选择的是 STC89C5xRC 系列芯片(头文件)

1ms 延时函数为 11.0592MHZ

不同的 LCD1602 需要选用不同的引脚,所以引脚定义有所不同需根据原理图进行定义

  1 /********************************Copyright (c)**********************************\
  2 **
  3 **                   (c) Copyright 2022, xiaoxie, China, QD.
  4 **                           All Rights Reserved
  5 **
  6 **                           By(QQ:2782978674)
  7 **                       https://github.com/xiaoxie-001
  8 **
  9 **----------------------------------文件信息------------------------------------
 10 ** 文件名称: LCD1602.c
 11 ** 创建人员: xietiancheng
 12 ** 创建日期: 2022-05-23
 13 ** 文档描述: 学习交流:QQ2782978674
 14 **
 15 **----------------------------------版本信息------------------------------------
 16 ** 版本代号: V1.0
 17 ** 版本说明: 
 18 **
 19 **------------------------------------------------------------------------------
 20 \********************************End of Head************************************/
 21  
 22 /********************************End of File************************************/
 23 #include <STC89C5xRC.H>
 24 #include <INTRINS.H>
 25 
 26 //引脚定义
 27 sbit LCD_RS=P1^0;
 28 sbit LCD_RW=P1^1;
 29 sbit LCD_E=P2^5;
 30 #define LCD_DataPort P0
 31 
 32 /**
 33   * @brief  LCD1602延时函数,11.0592MHz调用可延时1ms
 34   * @param  无
 35   * @retval 无
 36   */
 37 void LCD_Delay()        //@11.0592MHz  1ms
 38 {
 39     unsigned char i, j;
 40     _nop_();
 41     i = 2;
 42     j = 199;
 43     do
 44     {
 45         while (--j);
 46     } while (--i);
 47 }
 48 
 49 
 50 /**
 51   * @brief  LCD1602写命令
 52   * @param  Command 要写入的命令
 53   * @retval 无
 54   */
 55 void LCD_WriteCommand(unsigned char Command)
 56 {
 57     LCD_RS=0;
 58     LCD_RW=0;
 59     LCD_DataPort=Command;
 60     LCD_E=1;
 61     LCD_Delay();
 62     LCD_E=0;
 63     LCD_Delay();
 64 }
 65 
 66 /**
 67   * @brief  LCD1602写数据
 68   * @param  Data 要写入的数据
 69   * @retval 无
 70   */
 71 void LCD_WriteData(unsigned char Data)
 72 {
 73     LCD_RS=1;
 74     LCD_RW=0;
 75     LCD_DataPort=Data;
 76     LCD_E=1;
 77     LCD_Delay();
 78     LCD_E=0;
 79     LCD_Delay();
 80 }
 81 
 82 /**
 83   * @brief  LCD1602初始化函数
 84   * @param  无
 85   * @retval 无
 86   */
 87 void LCD_Init(void)
 88 {
 89     LCD_WriteCommand(0x38); //0011 1000设置数据存储器
 90     LCD_WriteCommand(0x0C); //0000 1111开启光标(0x0f); 0x0C关闭光标显示  
 91     LCD_WriteCommand(0x06);
 92     LCD_WriteCommand(0x01);
 93 }
 94 
 95 /**
 96   * @brief  LCD1602设置光标位置
 97   * @param  Line 行位置,范围:1~2
 98   * @param  Column 列位置,范围:1~16
 99   * @retval 无
100   */
101 void LCD_SetCursor(unsigned char Line,unsigned char Column)
102 {
103     if(Line==1)
104     {
105         LCD_WriteCommand(0x80|(Column-1));
106     }
107     else
108     {
109         LCD_WriteCommand(0x80|(Column-1)+0x40);
110     }
111 }
112 
113 /**
114   * @brief  在LCD1602指定位置上显示一个字符
115   * @param  Line 行位置,范围:1~2
116   * @param  Column 列位置,范围:1~16
117   * @param  Char 要显示的字符
118   * @retval 无
119   */
120 void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
121 {
122     LCD_SetCursor(Line,Column);
123     LCD_WriteData(Char);
124 }
125 
126 /**
127   * @brief  在LCD1602指定位置开始显示所给字符串
128   * @param  Line 起始行位置,范围:1~2
129   * @param  Column 起始列位置,范围:1~16
130   * @param  String 要显示的字符串
131   * @retval 无
132   */
133 void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
134 {
135     unsigned char i;
136     LCD_SetCursor(Line,Column);
137     for(i=0;String[i]!='\0';i++)
138     {
139         LCD_WriteData(String[i]);
140     }
141 }
142 
143 /**
144   * @brief  返回值=X的Y次方
145   */
146 int LCD_Pow(int X,int Y)
147 {
148     unsigned char i;
149     int Result=1;
150     for(i=0;i<Y;i++)
151     {
152         Result*=X;
153     }
154     return Result;
155 }
156 
157 /**
158   * @brief  在LCD1602指定位置开始显示所给数字
159   * @param  Line 起始行位置,范围:1~2
160   * @param  Column 起始列位置,范围:1~16
161   * @param  Number 要显示的数字,范围:0~65535
162   * @param  Length 要显示数字的长度,范围:1~5
163   * @retval 无
164   */
165 void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
166 {
167     unsigned char i;
168     LCD_SetCursor(Line,Column);
169     for(i=Length;i>0;i--)
170     {
171         LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
172     }
173 }
174 
175 
176 /**
177   * @brief  在LCD1602指定位置开始显示所给的八进制数字
178   * @param  Line 起始行位置,范围:1~2
179   * @param  Column 起始列位置,范围:1~16
180   * @param  Number 要显示的数字,范围:
181   * @param  Length 要显示数字的长度,范围:1~5
182 * @retval 八进制显示
183   */
184 void LCD_ShowOctNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
185 {
186     unsigned char i;
187     LCD_SetCursor(Line,Column);
188     for(i=Length;i>0;i--)
189     {
190         LCD_WriteData('0'+Number/LCD_Pow(8,i-1)%8);
191     }
192 }
193 
194 /**
195   * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
196   * @param  Line 起始行位置,范围:1~2
197   * @param  Column 起始列位置,范围:1~16
198   * @param  Number 要显示的数字,范围:-32768~32767
199   * @param  Length 要显示数字的长度,范围:1~5
200   * @retval 无
201   */
202 void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
203 {
204     unsigned char i;
205     unsigned int Number1;
206     LCD_SetCursor(Line,Column);
207     if(Number>=0)
208     {
209         LCD_WriteData('+');
210         Number1=Number;
211     }
212     else
213     {
214         LCD_WriteData('-');
215         Number1=-Number;
216     }
217     for(i=Length;i>0;i--)
218     {
219         LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
220     }
221 }
222 
223 /**
224   * @brief  在LCD1602指定位置开始以十六进制显示所给数字
225   * @param  Line 起始行位置,范围:1~2
226   * @param  Column 起始列位置,范围:1~16
227   * @param  Number 要显示的数字,范围:0~0xFFFF
228   * @param  Length 要显示数字的长度,范围:1~4
229   * @retval 无
230   */
231 void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
232 {
233     unsigned char i;
234     unsigned char SingleNumber;
235     LCD_SetCursor(Line,Column);
236     for(i=Length;i>0;i--)
237     {
238         SingleNumber=Number/LCD_Pow(16,i-1)%16;
239         if(SingleNumber<10)
240         {
241             LCD_WriteData('0'+SingleNumber);
242         }
243         else
244         {
245             LCD_WriteData('A'+SingleNumber-10);
246         }
247     }
248 }
249 
250 /**
251   * @brief  在LCD1602指定位置开始以二进制显示所给数字
252   * @param  Line 起始行位置,范围:1~2
253   * @param  Column 起始列位置,范围:1~16
254   * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
255   * @param  Length 要显示数字的长度,范围:1~16
256   * @retval 无
257   */
258 void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
259 {
260     unsigned char i;
261     LCD_SetCursor(Line,Column);
262     for(i=Length;i>0;i--)
263     {
264         LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);
265     }
266 }

 

注意:需要将 LCD1602.h 和 LCD1602.c 两个文件添加到工程文件 Project 项目目录下

然后在主函数目录下进行调用 main.c

#include <STC89C5xRC.H>
#include "LCD1602.h"
//#include <DELAYMS.H>

void main(){
    LCD_Init(); //LCD 初始化
    LCD_ShowChar(1,1,'A'); //在 1 行 1 列显示字符 A
    LCD_ShowString(1,3,"Hello"); //在 1 行 3 列显示字符串 Hello
    LCD_ShowNum(1,9,66,2); //在 1 行 9 列显示数字 66,长度为 2
    LCD_ShowSignedNum(1,12,-88,2); //在 1 行 12 列显示有符号数字-88,长度为 2
    LCD_ShowHexNum(2,1,0xA5,2); //在 2 行 1 列显示十六进制数字 0xA5,长度为 2
    LCD_ShowBinNum(2,4,0xA5,8); //在 2 行 4 列显示二进制数字 0xA5,长度为 8
    LCD_ShowChar(2,13,0xDF); //在 2 行 13 列显示编码为 0xDF 的字符
    LCD_ShowChar(2,14,'C'); //在 2 行 14 列显示字符 C
    while(1){

        }
}

 

转载于: https://zhuanlan.zhihu.com/p/522789409

posted @ 2022-05-31 23:07  xiaoxie001  阅读(192)  评论(0编辑  收藏  举报