本专栏所有引脚及端口 代码及注解 选择的是BST-V51 单片机
需结合具体的单片机原理图进行分析
接下来的本专栏都选择该单片机及其原理图分析来进行操作
以后的学习中都对此类进行模块化编程,将各个模块分开进行设计和编写,最后调用就行,不会模块化编程的友友可以先去第4节看
LCD1602原理图使用 LCD1602 液晶屏作为调试窗口,提供类似 printf 函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。
| 函数 | 作用 |
| 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); | 显示二进制数字 |
#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); //光标 #endifLCD1602.c 函数
需要注意:选择的是 STC89C5xRC 系列芯片(头文件)
1ms 延时函数为 11.0592MHZ
不同的 LCD1602 需要选用不同的引脚,所以引脚定义有所不同需根据原理图进行定义
#include#include //引脚定义 sbit LCD_RS=P1^0; sbit LCD_RW=P1^1; sbit LCD_E=P2^5; #define LCD_DataPort P0 void LCD_Delay() //@11.0592MHz 1ms { unsigned char i, j; _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } void LCD_WriteCommand(unsigned char Command) { LCD_RS=0; LCD_RW=0; LCD_DataPort=Command; LCD_E=1; LCD_Delay(); LCD_E=0; LCD_Delay(); } void LCD_WriteData(unsigned char Data) { LCD_RS=1; LCD_RW=0; LCD_DataPort=Data; LCD_E=1; LCD_Delay(); LCD_E=0; LCD_Delay(); } void LCD_Init(void) { LCD_WriteCommand(0x38); //0011 1000设置数据存储器 LCD_WriteCommand(0x0C); //0000 1111开启光标(0x0f); 0x0C关闭光标显示 LCD_WriteCommand(0x06); LCD_WriteCommand(0x01); } void LCD_SetCursor(unsigned char Line,unsigned char Column) { if(Line==1) { LCD_WriteCommand(0x80|(Column-1)); } else { LCD_WriteCommand(0x80|(Column-1)+0x40); } } void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char) { LCD_SetCursor(Line,Column); LCD_WriteData(Char); } void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String) { unsigned char i; LCD_SetCursor(Line,Column); for(i=0;String[i]!=' ';i++) { LCD_WriteData(String[i]); } } int LCD_Pow(int X,int Y) { unsigned char i; int Result=1; for(i=0;i 0;i--) { LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10); } } void LCD_ShowOctNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length) { unsigned char i; LCD_SetCursor(Line,Column); for(i=Length;i>0;i--) { LCD_WriteData('0'+Number/LCD_Pow(8,i-1)%8); } } void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length) { unsigned char i; unsigned int Number1; LCD_SetCursor(Line,Column); if(Number>=0) { LCD_WriteData('+'); Number1=Number; } else { LCD_WriteData('-'); Number1=-Number; } for(i=Length;i>0;i--) { LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10); } } void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length) { unsigned char i; unsigned char SingleNumber; LCD_SetCursor(Line,Column); for(i=Length;i>0;i--) { SingleNumber=Number/LCD_Pow(16,i-1)%16; if(SingleNumber<10) { LCD_WriteData('0'+SingleNumber); } else { LCD_WriteData('A'+SingleNumber-10); } } } void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length) { unsigned char i; LCD_SetCursor(Line,Column); for(i=Length;i>0;i--) { LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2); } }
注意:需要将 LCD1602.h 和 LCD1602.c 两个文件添加到工程文件 Project 项目目录下
然后在主函数目录下进行调用 main.c
#include#include "LCD1602.h" //#include 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){ } }
转载于:博客园



