/***********************************
功能:LCD1602的显示
说明:#define LCM_RW P2_1 //定义引脚
#define LCM_RS P2_2
#define LCM_E P2_0
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM 状态字中的Busy 标识
时间:2012.12.12
附录:脉冲数量:3/0.023=130个(3S)
***********************************/
#include<BoeBot.h>
#include<uart.h>
#define LCM_RW P2_1 //定义引脚
#define LCM_RS P2_2
#define LCM_E P2_0
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM 状态字中的Busy 标识
// 函数声明
void Write_Data_LCM(unsigned char WDLCM);
void Write_Command_LCM(unsigned char WCLCM,BuysC);
void Read_Status_LCM(void);
void LCM_Init(void);
void Set_xy_LCM(unsigned char x, unsigned char y);
void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s);
/************************************************************
调用: 无
函数名: 主函数
************************************************************/
void main(void)
{
LCM_Init(); //LCM 初始化
while(1)
{
Display_List_Char(0, 0, "WWW.CSMZXY.");
Display_List_Char(1, 0, " C51/AVR/Arduino");
}
}
/************************************************************
调用: Read_Status_LCM()
函数名: 读LCD忙状态
************************************************************/
void Read_Status_LCM(void)
{
unsigned char read=0;
LCM_RW = 1;
LCM_RS = 0;
LCM_E = 1;
LCM_Data = 0xff;
do
{
read = LCM_Data;
}
while(read & Busy);
LCM_E = 0;
}
/************************************************************
调用: Write_Data_LCM ( )
函数名: 写LCD 数据
************************************************************/
void Write_Data_LCM(unsigned char WDLCM)
{
Read_Status_LCM(); //检测忙
LCM_RS = 1;
LCM_RW = 0;
LCM_Data &= 0x0f;
LCM_Data |= WDLCM & 0xf0;
LCM_E = 1; //若晶振速度太高可以在这后加小的延时
; //延时
LCM_E = 0;
WDLCM = WDLCM << 4;
LCM_Data &= 0x0f;
LCM_Data |= WDLCM & 0xf0;
LCM_E = 1;
; //延时
LCM_E = 0;
}
/************************************************************
调用: Write_Command_ LCM ( )
函数名: 写LCD 命令
************************************************************/
void Write_Command_LCM(unsigned char WCLCM,BuysC) //BuysC 为0 时忽略忙检测
{
if (BuysC)
Read_Status_LCM(); //根据需要检测忙
LCM_RS = 0;
LCM_RW = 0;
LCM_Data &= 0x0f;
LCM_Data |= WCLCM & 0xf0; //传输高四位
LCM_E = 1;
;
LCM_E = 0;
WCLCM = WCLCM << 4; //传输低四位
LCM_Data &= 0x0f;
LCM_Data |= WCLCM & 0xf0;
LCM_E = 1;
;
LCM_E = 0;
}
/************************************************************
调用: LCM_Init()
函数名: LCD 初始化
************************************************************/
void LCM_Init(void)
{
LCM_Data = 0;
Write_Command_LCM(0x28,0); //三次显示模式设置,不检测忙信号
delay_nms(15);
Write_Command_LCM(0x28,0);
delay_nms(15);
Write_Command_LCM(0x28,0);
delay_nms(15);
Write_Command_LCM(0x28,1); //显示模式设置,开始要求每次检测忙信号
Write_Command_LCM(0x08,1); //关闭显示
Write_Command_LCM(0x01,1); //显示清屏
Write_Command_LCM(0x06,1); //显示光标移动设置
Write_Command_LCM(0x0C,1); //显示开及光标设置
}
/************************************************************
调用: Set_xy_LCM ()
函数名:设定显示坐标位置
************************************************************/
void Set_xy_LCM(unsigned char x, unsigned char y)
{
unsigned char address;
if( x == 0 )
address = 0x80+y;
else
address = 0xc0+y;
Write_Command_LCM(address,1);
}
/************************************************************
调用: Display_List_Char()
函数名:按指定位置显示一串字符
************************************************************/
void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s)
{
Set_xy_LCM(x,y);
while(*s)
{
LCM_Data = *s;
Write_Data_LCM(*s);
s++;
}
}