LCD1602 上显示的内容:
----MCU--DIY----
------EEPW------
以下时程序代码:
---------------------------------LCD1602.H--------------------------------------------
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define issame 0 //单片机的数据口和LCD的数据口一致
#define nosame 1 //单片机的数据口和LCD的数据口不一致
#define inputway issame//不一致
#define LCDDATA P0
sbit RS=P2^4;
sbit RW=P2^5;
sbit CS=P2^6;
/*#define LCDDATA P2
sbit RS=P1^2;
sbit RW=P1^1;
sbit CS=P1^0;*/
//函数声明
void Delay_xms(uint x); //ms延时函数
void Delay_xus(uint t); //us延时函数
uchar change(uchar dat);
void LCD_en_write(void); //控制LCD写时序
void Write_Instruction(uchar command); //写指令函数
void Write_Data(uchar Wdata); //写数据函数
void LCD_SET_XY(uchar X,uchar Y); //字符显示初始地址设置
void LCD_write_str(uchar X,uchar Y,uchar *s); //字符串显示函数
void LCD_write_char(uchar X,uchar Y,uchar Wdata);//单个字符显示函数
void LCD_clear(void); //清屏函数
void LCD_init(void);
#endif
-----------------------------------LCD1602.C--------------------------------------------------
#include "LCD1602.h"
//功能:延时1毫秒
//入口参数:x
//出口参数:无
//说明:晶振为12M
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
//功能:12us延时
void Delay_xus(uint t)
{
for(;t>0;t--)
{
_nop_();
}
}
//颠倒数据
uchar change(uchar dat)
{
uchar d1,d2;
uchar i;
d1=dat;
for(i=0;i<8;i++)
{
d2<<=1;
d2|=(d1&0x01);
d1>>=1;
}
return d2;
}
//控制LCD写时序
void LCD_en_write(void)
{
CS=1;
Delay_xus(20);
CS=0;
Delay_xus(20);
}
//写指令函数
void Write_Instruction(uchar command)
{
RS=0;
RW=0;
CS=1;
#if inputway==issame
LCDDATA=command;
#else
LCDDATA=change(command);
#endif
LCD_en_write();//写入指令数据
}
//写数据函数
void Write_Data(uchar Wdata)
{
RS=1;
RW=0;
CS=1;
#if inputway==issame
LCDDATA=Wdata;
#else
LCDDATA=change(Wdata);
#endif
LCD_en_write();//写入数据
}
//字符显示初始地址设置
void LCD_SET_XY(uchar X,uchar Y)
{
uchar address;
if(Y==0)
address=0x80+X;//Y=0,表示在第一行显示,地址基数为0x80
else
address=0xc0+X;//Y非0时,表时在第二行显示,地址基数为0xC0
Write_Instruction(address);//写指令,设置显示初始地址
}
//在第X行Y列开始显示,指针*S所指向的字符串
void LCD_write_str(uchar X,uchar Y,uchar *s)
{
LCD_SET_XY(X,Y);//设置初始字符显示地址
while(*s)//逐次写入显示字符,直到最后一个字符"/0"
{
Write_Data(*s);//写入当前字符并显示
s++;//地址指针加1,指向下一个待写字符
}
}
//在第X行Y列开始显示Wdata所对应的单个字符
void LCD_write_char(uchar X,uchar Y,uchar Wdata)
{
LCD_SET_XY(X,Y);//写地址
Write_Data(Wdata);//写入当前字符并显示
}
//清屏函数
void LCD_clear(void)
{
Write_Instruction(0x01);
Delay_xms(5);
}
//显示屏初始化函数
void LCD_init(void)
{
Write_Instruction(0x38); //8bit interface,2line,5*7dots
Delay_xms(5);
Write_Instruction(0x38);
Delay_xms(5);
Write_Instruction(0x38);
Write_Instruction(0x08); //关显示,不显光标,光标不闪烁
Write_Instruction(0x01); //清屏
Delay_xms(5);
Write_Instruction(0x04); //写一字符,整屏显示不移动
//Write_Instruction(0x05); //写一字符,整屏右移
//Write_Instruction(0x06); //写一字符,整屏显示不移动
//Write_Instruction(0x07); //写一字符,整屏左移
Delay_xms(5);
//Write_Instruction(0x0B); //关闭显示(不显示字符,只有背光亮)
Write_Instruction(0x0C); //开显示,光标、闪烁都关闭
//Write_Instruction(0x0D); //开显示,不显示光标,但光标闪烁
//Write_Instruction(0x0E); //开显示,显示光标,但光标不闪烁
//Write_Instruction(0x0F); //开显示,光标、闪烁均显示
}
-----------------------------------main.c-----------------------------------------
#include "reg52.h"
#include "LCD1602.h"
int main(void)
{
LCD_init();
LCD_clear();
LCD_write_str(0,0,"----MCU--DIY----");
LCD_write_str(0,1,"------EEPW------");
while(1);
return 0;
}