📄 1602h.txt
字号:
/********************************************************
* 函数库说明:LCD1602B基本驱动函数库 *
* 版本: v1.0 *
* 作者: 傻孩子 *
* 日期: 2005年9月6日 *
* 修改: 傻孩子 *
* 修改日期: 2005年9月6日 *
* *
* 说明: *
* 1、需要底层硬件驱动函数支持 *
* 基本的宏定义: *
* LCD_RS LCD_RW LCD_E *
* LCD_SetWriteData LCD_SetReadData *
* LCD_HalfData_Port LCD_HalfData_DDR *
* LCD_SendHalfCharHigh(a) *
* LCD_SendHalfCharLow(a) *
* 2、需要基本的延时函数支持 *
* 基本的延时函数: *
* DelayMs() 毫秒 DelayUs() 微妙 *
* 3、需要修改引用宏定义来指定底层硬件驱动 *
* 函数库。 *
* 4、该头文件支持4位发送模式,硬件连接4位 *
* 8位都支持。
********************************************************/
#ifndef _Use_LCD1602B
# define _Use_LCD1602B
/* 这里需要加入硬件支持库的头文件引用 */
/***********************
* 系 统 宏 定 义 *
***********************/
/*---------------------*
* 常 数 宏 定 义 *
*---------------------*/
#ifndef True
# define True 0x01
#endif
#ifndef False
# define False 0x00
#endif
#ifndef Enable
# define Enable 0x01
#endif
#ifndef Disable
# define Disable 0x00
#endif
# define LCD_Write 0x00
# define LCD_Read 0x01
# define LCD_Command 0x00
# define LCD_Data 0x01
# define LCD_CMD_Init 0x28
# define LCD_CMD_DispCtr 0x0c
# define LCD_CMD_CLS 0x01
# define LCD_CMD_EnterSet 0x06
# define LCD_CMD_IconShow 0x0f
# define LCD_CMD_IconHide 0x0c
/*---------------------*
* 动 作 宏 定 义 *
*---------------------*/
# define SetReadState LCD_SetReadData;LCD_RS = LCD_Command;LCD_RW = LCD_Read;
# define SetRead LCD_SetReadData;LCD_RW = LCD_Read;
# define SetWrite LCD_SetWriteData;LCD_RW = LCD_Write;
# define SetCommand LCD_RS = LCD_Command;
# define SetData LCD_RS = LCD_Data;
# define Print(a) LCDDisplayString(a);
# define Locate(x,y) LCDSetXY(x-1,y-1);
# define CLS LCDWaitForReady();LCDSendCommand(LCD_CMD_CLS);
# define PrintN(a,b) LCDDisplayNum((unsigned long)a,b);
# define ShowIcon LCDWaitForReady();LCDSendCommand(LCD_CMD_IconShow);
# define HideIcon LCDWaitForReady();LCDSendCommand(LCD_CMD_IconHide);
/***********************
* 全局变量声明区 *
***********************/
const char CHR[16] = {0,1,2,3,4,5,6,7,8
,9,a,b,c,d,e,f};
/***********************
* 系统函数声明区 *
***********************/
void LCDInit(void);
void LCDSendCommand(char Command);
void LCDSendData(char Data);
void LCDWaitForReady(void);
void LCDSetXY(char X,char Y);
void LCDDisplayString(char *String);
void LCDDisplayNum(unsigned long Num,char BitCount);
/********************************************************
* 函数说明:LCD初始化函数 *
********************************************************/
void LCDInit(void)
{
Delay(15);
LCDWaitForReady();
LCDSendCommand(LCD_CMD_Init);
LCDWaitForReady();
LCDSendCommand(LCD_CMD_DispCtr);
LCDWaitForReady();
LCDSendCommand(LCD_CMD_CLS);
Delay(2);
LCDSendCommand(LCD_CMD_EnterSet);
}
/********************************************************
* 函数说明:向LCD发送指令函数 *
* 输入: 需要发送的指令 *
********************************************************/
void LCDSendCommand(char Command)
{
SetWrite;
SetCommand;
{
LCD_E = Enable;
LCD_SendHalfCharHigh(Command);
LCD_E = Disable;
}
{
LCD_E = Enable;
LCD_SendHalfCharLow(Command);
LCD_E = Disable;
}
SetRead;
SetCommand;
}
/********************************************************
* 函数说明:向LCD发送数据函数 *
********************************************************/
void LCDSendData(char Data)
{
SetWrite;
SetData;
{
LCD_E = Enable;
LCD_SendHalfCharHigh(Data);
LCD_E = Disable;
}
{
LCD_E = Enable;
LCD_SendHalfCharLow(Data);
LCD_E = Disable;
}
SetRead;
SetCommand;
}
/********************************************************
* 函数说明:等待LCD空闲状态函数 *
********************************************************/
void LCDWaitForReady(void)
{
//DelayUs(30);
SetRead;
SetCommand;
LCD_E = Enable;
while (LCD_BF == Enable); //RW=1,读PD7,为0表示空闲;
LCD_E = Disable;
}
/********************************************************
* 函数说明:设置显示坐标函数 *
********************************************************/
void LCDSetXY(char X,char Y)
{
char Address;
if (Y == 0)
{
Address = 0x80 + X;
}
else
{
Address = 0xc0 + X;
}
LCDWaitForReady();
LCDSendCommand(Address);
}
/********************************************************
* 函数说明:LCD字符串显示函数 *
********************************************************/
void LCDDisplayString(char *String)
{
while(*String)
{
LCDWaitForReady();
LCDSendData(*String);
String++;
}
}
/********************************************************
* 函数说明:数值显示函数(HEX) *
* 输入: 需要显示的数字(无符号长整形) *
********************************************************/
void LCDDisplayNum(unsigned long Num,char BitCount)
{
char a = 0;
for (a = 8-BitCount ;a<8;a++)
{
LCDSendData(CHR[(Num<<(a<<2))>>28]);
}
}
#endif
------------------------------------------------------------
特别说明,这个头文件不依赖硬件系统,所以在使用之前,需要一些硬件相关的宏定义。
例如:
# define LCD_RS _PC4
# define LCD_RW _PD3
# define LCD_E _PC5
# define LCD_BF Read_PC3
# define LCD_HalfData_Port PORTC
# define LCD_HalfData_DDR DDRC
# define LCD_SetWriteData LCD_HalfData_DDR |= 0x0f;LCD_HalfData_Port &= 0xf0;
# define LCD_SetReadData LCD_HalfData_DDR &= 0xf0;LCD_HalfData_Port |= 0x0f;
# define LCD_SendHalfCharHigh(a) LCD_HalfData_Port &= 0xf0; LCD_HalfData_Port |= (a>>4);
# define LCD_SendHalfCharLow(a) LCD_HalfData_Port &= 0xf0; LCD_HalfData_Port |= (a<<4>>4);
这里需要支持位操作的系统。 如LCD_E 定义为PC5,那么当执行LCD_E = 1的时候,就要能够单独置PC5为高。
如果你的IDE环境是ICC的话,我提供一个头文件,你可以直接使用或修改某些地址参数以后使用。
-------------------------------------------------------------------------
ATMega8L的位操作头文件
/***********************************************************
* 支持库名: ATMega8L Robot Driver *
* 源文件: RD_ATMega8L.h *
* 版本: v0.1 *
* *
* 作者: 傻孩子 *
* 日期: 2005年6月6日 *
* 修改: 傻孩子 *
* 修改时间: 2005年6月6日 *
* *
* 说明: 使用前要把 PORTDefine() 加入到端口初始化函数 *
* 里面。否则位操作无效 *
***********************************************************/
# include <iom8v.h>
# include <macros.h>
#ifndef _Use_AdvancedPortCommand
# define _Use_AdvancedPortCommand
/****************************
* 资源说明 *
****************************/
# define PAInUse 0x00
# define PBInUse 0xff
# define PCInUse 0b011111111
# define PDInUse 0xff
# define PEInUse 0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -