LCD1602液晶显示屏
1 LCD1602介绍
1.1外部引脚
1.2内部结构
LCD1602内部拥有自己的字模库【CGRAM+CDROM(charactor generator)】,由AC(address count)向DDRAM(data display)中相应的地址中写入数据,找出字模库中相应数据的的字模,从而映射到屏幕上。
1.3操作流程
2 LCD编程
#include <REGX52.H>
sbit LCD_WR=P2^5;
sbit LCD_RS=P2^6;
sbit LCD_E=P2^7;
#define LCD_DataPort P0
void LCD_Delay()
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS=0;
LCD_WR=0;
LCD_DataPort=Command;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
void LCD_WriteData(unsigned char Data)
{
LCD_RS=1;
LCD_WR=0;
LCD_DataPort=Data;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
void LCD_Init()
{
LCD_WriteCommand(0x38);
LCD_WriteCommand(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]!='\0';i++)
{
LCD_WriteData(String[i]);
}
}
int LCD_Pow(int x,int y)
{
unsigned char i;
int result=1;
for(i=0;i<y;i++)
{
result*=x;
}
return result;
}
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned char Number,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
}
}
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
unsigned char i;
int Number1;
LCD_SetCursor(Line,Column);
if(Number<0)
{
LCD_WriteData(0x2d);
Number1=-Number;
}
else
{
LCD_WriteData(0x2b);
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 char 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 char 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);
}
}
#include <REGX52.H>
#include "LCD1602.H"
void main()
{
LCD_Init();
LCD_ShowChar(1,1,'A');
LCD_ShowString(1,3,"hello");
LCD_ShowNum(1,9,66,2);
LCD_ShowSignedNum(1,12,-88,2);
LCD_ShowHexNum(2,1,0x75,2);
LCD_ShowBinNum(2,4,0xA5,8);
while(1);
}
3 流动屏
#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
void main()
{
LCD_Init();
LCD_ShowChar(1,1,'A');
LCD_ShowString(1,3,"Hello");
LCD_ShowNum(1,9,66,2);
LCD_ShowSignedNum(1,12,-88,2);
LCD_ShowHexNum(2,1,0x75,2);
LCD_ShowBinNum(2,4,0xA5,8);
LCD_ShowChar(2,13,0xDF);
LCD_ShowChar(2,14,'C');
while(1)
{
Delay(100);
LCD_WriteCommand(0x18);
}
}
总结
从看别人的代码,到看懂,自己在写出来,大毛病没有,小毛病不断,看懂了代码自己不一定写出来,还是得多记忆多练习。