多功能智能控制器
光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 // LCD显示左移一位
#define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示
#define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示
#define LCD_CLEAR_SCREEN 0x01 // 清屏
/***********************LCD1602地址相关******************************/
#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
#define LINE1 0 // 第一行
#define LINE2 1 // 第二行
#define LINE_LENGTH 8 // 每行的最大字符长度
/***********************LCD1602接线引脚定义**************************/
#define LCM_RS P2_0 // 数据/命令选择信号
#define LCM_RW P2_1 // 读/写选择信号
#define LCM_E P2_2 // 使能信号
#define LCM_Data P0 // 显示数据端口
#define Busy 0x80 // 用于检测LCM状态字中的Busy标识
#define uchar unsigned char
#define uint unsigned int
//================================ LCM1602控制部分 =========================================================
/*****************************************************
函 数 名:void Delay_LCD(void)
功 能:5ms延时
说 明:LCD显示延时
入口参数:无
返 回 值:无
*****************************************************/
void Delay_LCD(void)
{
uint TempCyc = 5552; // 放入延时数据
while(TempCyc--);
}
/*****************************************************
函 数 名:uchar ReadStatusLCM()
功 能:读忙状态
说 明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
入口参数:无
返 回 值:LCM_Data
*****************************************************/
//读状态
uchar ReadStatusLCM(void)
{
LCM_Data = 0xFF; // LCM数据口先置1
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); // 检测忙信号.如果忙,则不执行
return(LCM_Data); // 不忙返回读取数据
}
/*****************************************************
函 数 名:void WriteDataLCM()
功 能:向LCM1602中写入数据
说 明:将形参WDLCM中的数据写入LCM中
入口参数:WDLCM
返 回 值:无
*****************************************************/
//写数据
void WriteDataLCM(uchar WDLCM)
{
ReadStatusLCM(); // 检测忙
LCM_Data = WDLCM; // 写入数据到LCM
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
LCM_E = 0; // 延时
LCM_E = 1;
}
/*****************************************************
函 数 名:void WriteCommandLCM()
功 能:向LCM1602中写入指令
说 明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测
入口参数:WCLCM,BuysC
返 回 值:无
*****************************************************/
//写指令
void WriteCommandLCM(uchar WCLCM,BuysC) // BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); // 根据需要检测忙
LCM_Data = WCLCM; // 写入指令
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*****************************************************
函 数 名:void LCMInit()
功 能:初始化LCM1602
说 明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作
入口参数:无
返 回 值:无
*****************************************************/
//LCM初始化
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 三次显示模式设置,不检测忙信号
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 0x38指令表示:8位数据显示模式,俩行多显示
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,1); // 显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(LCD_DISPLAY_OFF,1); // 关闭显示
WriteCommandLCM(LCD_CLEAR_SCREEN,1); // 显示清屏
WriteCommandLCM(LCD_AC_AUTO_INCREMENT,1); // 显示光标移动设置
WriteCommandLCM(LCD_DISPLAY_ON,1); // 显示开及光标设置
}
/*****************************************************
函 数 名:void DisplayOneChar()
功 能:
多功能智能控制 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)