#include
/********************************************************************
基本操作:
读状态: RS=0,RW=1,EN=1
输出:D0~D7=状态字;
写指令: RS=0,RW=0,EN=下降沿脉冲
D0~D7=指令码;
读数据: RS=1,RW=1,EN=1
输出: D0~D7=数据;
写数据: RS=1,RW=1,EN=下降沿脉冲
D0~D7=数据;
*********************************************************************/
#define uint8 unsigned char
#define uint16 unsigned int
//定义控制引脚
***it RS = P2^6;
***it RW = P2^5;
***it EN = P2^7;
uint8 Data1[16]={'2','0','1','4',0x01,'0','9',0x02,'0','1',0x03};
uint8 Data2[16]="welcome";
//自定义字符
uint8 code CGCODE[]={//1602屏为5*8点阵取低5位控制显示
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//显示年0x00
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//显示月0x01
0x0F,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00 //显示日0x02
};
//-----------函数的声明------------------
void DelayMS(uint16 dly);//延时程序
void User_def(void);//自定义字库
//----------液晶模块的声明---------------
bit BUSY(void);
void Write_cmd(uint8 cmd);//写命令
void Write_dat(uint8 dat);//写数据
void LCD_Init(void);//初始化屏
//---------Main Task---------------------
void main(void)
{
uint8 i;
LCD_Init();
User_def(); //将自定义的字符写入CGRAM
while(1)
{
Write_cmd(0x80+0x02);
/*Write_dat(0x32); // 2
Write_dat(0x30); // 0
Write_dat(0x31); // 1
Write_dat(0x31); // 1
Write_dat(0x01); //显示 年
Write_dat(0x31); // 1
Write_dat(0x31); // 1
Write_dat(0x02); //显示 月
Write_dat(0x31); // 1
Write_dat(0x31); // 1
Write_dat(0x03);*/ //显示 日
for(i=0;i<16;i++)
Write_dat(Data1[i]);
Write_cmd(0xc2+0x02);
for(i=0;i<16;i++)
Write_dat(Data2[i]);
}
}
//延时程序
void DelayMS(uint16 dly)
{
uint16 x,y;
for(x=dly;x>0;x--)
for(y=124;y>0;y--);
}
/********************************************************
** 名称 :bit BUSY(void)
** 功能 :检测LCD1602是否处于忙状态;
** 入口参数 :无
** 出口参数 :bit Bit
返回1,则BUSY
返回0,则OK
*********************************************************/
bit BUSY(void)
{
bit Bit;
RS = 0;
RW = 1;
EN = 1;
DelayMS(1);
Bit = (bit)(P0 & 0x80); //最高位为忙信号位 (bit)(P0 & 0x80)
EN = 0;
return Bit;
}
/********************************************************
** 名称 :void Write_cmd(uint8 cmd)
** 功能 :写命令
** 入口参数 :cmd
控制命令
** 出口参数 :无
*********************************************************/
void Write_cmd(uint8 cmd)
{
while(BUSY()); //测忙
RS = 0;
RW = 0;
EN = 0;
P0 = cmd;
EN = 1;
DelayMS(1);
EN = 0;
}
/********************************************************
** 名称 :void Write_dat(uint8 dat)
** 功能 :写数据
** 入口参数 :dat
要显示的数据
** 出口参数 :无
*********************************************************/
void Write_dat(uint8 dat)
{
while(BUSY()); //测忙
RS = 1;
RW = 0;
EN = 0;
P0 = dat;
EN = 1;
DelayMS(1);
EN = 0;
}
/********************************************************
** 名称 :void LCD_Init(void)
** 功能 :液晶的初始化
** 入口参数 :无
** 出口参数 :无
*********************************************************/
void LCD_Init(void)
{
Write_cmd(0x38); //功能设置
DelayMS(1);
Write_cmd(0x0c); //显示开关控制
DelayMS(1);
Write_cmd(0x06); //输入方式设置
DelayMS(1);
Write_cmd(0x01); //清除LCD的显示内容
DelayMS(1);
}
void User_def(void)
{
uint8 i;
Write_cmd(0x40); //设置CGRAM地址
for(i=0;i<32;i++)
{
Write_dat(CGCODE[i]);
}
|