LCD作为显示屏是单片机工作返回数据最直观的体现。
下面将以模块化编程的思想调用LCD进行显示。
如下代码就是LCD的模块,显示时调用即可;
#includesbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_EN=P2^7; #define LCD_DataPort P0 void LCD_Delay() { unsigned char i, j; i = 2; j = 239; do { while (--j); } while (--i); } void LCD_WriteCommand(unsigned char Command) { LCD_RS=0; LCD_RW=0; LCD_DataPort=Command; LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay(); } void LCD_WriteData(unsigned char Data) { LCD_RS=1; LCD_RW=0; LCD_DataPort=Data; LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay(); } void LCD_SetCursor(unsigned char Line,unsigned char Column) { if(Line==1) { LCD_WriteCommand(0x80|(Column-1)); } else if(Line==2) { LCD_WriteCommand(0x80|(Column-1+0x40)); } } void LCD_Init() { LCD_WriteCommand(0x38); LCD_WriteCommand(0x0c); LCD_WriteCommand(0x06); LCD_WriteCommand(0x01); } void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char) { LCD_SetCursor(Line,Column); LCD_WriteData(Char); } void LCD_ShowString(unsigned char Line,unsigned char Column,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(Number/LCD_Pow(10,i-1)%10+'0'); } } 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(Number1/LCD_Pow(10,i-1)%10+'0'); } } void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length) { unsigned char i,SingleNumber; LCD_SetCursor(Line,Column); for(i=Length;i>0;i--) { SingleNumber=Number/LCD_Pow(16,i-1)%16; if(SingleNumber<10) { LCD_WriteData(SingleNumber+'0'); } else { LCD_WriteData(SingleNumber-10+'A'); } } } 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(Number/LCD_Pow(2,i-1)%2+'0'); } }
当然考虑到显示屏更新显示时速度较快,人眼不能识别出来,所以还有一个延迟函数,用于消隐(这里就不书写了,前一章有)以下是主函数调用的方法:LCD1602的.h文件
#ifndef __LCD1602_H__ #define __LCD1602_H__ void LCD_Init(); void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);// (1,1,'A')显示一个字符;一行:一列:字符 void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);//(1,3,"Hello")显示字符串;若超出那一排则会缺失; void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);//(1,9,123,3)显示十进制数字;最后的“3”是指显示数字的长度(因为定义类型为0~65535所以范围是1~5),本例子若最后一位为“2”则不显示最高位即为“23”; void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);//(1,13,-66,2)显示有符号十进制数字;符号不算在“2”中,但符号显示是从13位开始; void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);//(2,1,0xA8,2)显示十六进制数字; void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);//(2,4,0xAA,8)显示二进制数字; #endif
主函数:
#include#include "LCD1602.h" #include "Delay.h" int Result=0; void main() { 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); while(1) { Result=Result+1; LCD_ShowNum(2,14,Result,3); Delay(1000); } }



