/*****************************************************************************
单 位:广西民族大学物理与电子工程学院07物本班
文件名称:Lcd.h
文件标识:_LCD_H_
摘 要:字符型液晶LCD的AVR单片机驱动程序头文件
当前版本:V2.0
*****************************************************************************/
#ifndef _LCD_H_
#define _LCD_H_
#include
#include
#include
/*****************************************************************************
编绎控制:以下条件编绎语句保证只有在正确配置IO端口的情况下,才引用并编绎本文件
*****************************************************************************/
#if !defined(LCD_PORT)&&!defined(LCD_RS)&&!defined(LCD_EN)&&!defined(LCD_DN)
#define LCD_RS P(PORTA,0)
#define LCD_EN P(PORTA,2)
#define LCD_DN P(PORTA,H)
#elif defined(LCD_PORT)&&!defined(LCD_RS)&&!defined(LCD_EN)&&!defined(LCD_DN)
#define LCD_RS P(LCD_PORT,0)
#define LCD_EN P(LCD_PORT,2)
#define LCD_DN P(LCD_PORT,H)
#elif defined(LCD_RS)&&defined(LCD_EN)&&defined(LCD_DN)&&!defined(LCD_PORT)
#else
#error 您没有正确配置lcd.h与AVR单片机的连接情况
#endif
/*****************************************************************************
整数显示函数显示的范围定义:代码优化之用,参见LcdShowNumber函数
*****************************************************************************/
#ifndef NumType
#define NumType SINT32
#endif
/*****************************************************************************
常用控制命令
*****************************************************************************/
#define LcdLocate(x,y) LcdWriteCommand(0x40*(x)+(y)+0x3f) //定位
#define LcdMyChar(pc,x) LcdDefineChar(pc,0x40+(x)*8) //自定义自符
#define LcdShowChar(data) LcdWriteData(data) //显示字符
void LcdInit(void); //液晶初始化
void LcdWriteCommand(UINT8 command); //写指令
void LcdWriteData(UINT8 data); //写数据
void LcdShowString(UINT8 *string); //显示字符串
void LcdShowNumber(NumType number,SINT8 n); //显示整数
/*****************************************************************************
向LCD控制器寄存器写入指令或数据 底层函数 不包含RS控制线
*****************************************************************************/
#define H4BIT(X) ((PBITS(LCD_DN)==H)?((X)&0XF0):((X)>>4)) //高四位
#define L4BIT(X) ((PBITS(LCD_DN)==L)?((X)&0X0F):((X)<<4)) //低四位
void LcdSendByte(UINT8 byte)
{
if(PBITS(LCD_DN) == W) //八线模式
{
PORT(LCD_DN) = byte;
SET(LCD_EN);
CLR(LCD_EN);
}
if((PBITS(LCD_DN)==H)||(PBITS(LCD_DN)==L)) //四线模式
{
PORT(LCD_DN) = (PORT(LCD_DN)&(~PBITS(LCD_DN))) | H4BIT(byte);
SET(LCD_EN);
CLR(LCD_EN);
PORT(LCD_DN) = (PORT(LCD_DN)&(~PBITS(LCD_DN))) | L4BIT(byte);
SET(LCD_EN);
CLR(LCD_EN);
}
delay_us(40); //这里至少需要延时35us
}
/*****************************************************************************
向LCD控制器寄存器写入指令
*****************************************************************************/
void LcdWriteCommand(UINT8 command)
{
CLR(LCD_RS);
LcdSendByte(command);
}
/*****************************************************************************
向LCD控制器寄存器写入数据
*****************************************************************************/
void LcdWriteData(UINT8 data)
{
SET(LCD_RS);
LcdSendByte(data);
}
/*****************************************************************************
自定义自符
*****************************************************************************/
void LcdDefineChar(const UINT8 *pc,UINT8 acg)
{
UINT8 i;
LcdWriteCommand(acg); //设CGROM地址
for(i = 0; i < 8; i++)
LcdWriteData(*pc++); //写入字模数据
}
/*****************************************************************************
显示字符串
*****************************************************************************/
void LcdShowString(UINT8 *string)
{
while(*string)
LcdShowChar(*string++);
}
/*****************************************************************************
格式显示整数 n<0:左对齐 n>0:右对齐 可以实现形如"001"或"1 "的显示哦!
*****************************************************************************/
#define Longth ((sizeof(NumType)==1)?4:((sizeof(NumType)==2)?6:11))
void LcdShowNumber(NumType number,SINT8 n)
{
UINT8 array[Longth], *p, *temp, flag = 0;
if(n < 0)
{
n = -n;
flag = 1;
if(number == 0)
{
LcdShowChar('0');
flag += n - 1;
goto NULLs; //补空格
}
}
p = array;
array[n] = 0;
#ifndef LCD_UINT //对有符号整数判断正负值
if(number < 0)
{
number = -number;
LcdShowChar('-');
p++;
}
#endif
for(temp = &array[n-1]; temp >= p; temp--)
{
*temp = (UINT8)(number % 10) + '0';
number /= 10;
}
if(flag) //取消左边多余的零
{
while(*p == '0')
{
p++;
flag++;
}
}
LcdShowString(p);
NULLs: //在右边补足空格
while(flag-- > 1)
{
LcdShowChar(' ');
}
}
/*****************************************************************************
液晶器件初始化
*****************************************************************************/
void LcdInit(void)
{
OUT(LCD_RS); //设RS输出
OUT(LCD_EN); //设EN输出
OUTS(LCD_DN); //设DN输出
LcdWriteCommand(PBITS(LCD_DN)==W?0X38:0X28); //设置显示模式
LcdWriteCommand(PBITS(LCD_DN)==W?0X38:0X28);
LcdWriteCommand(0x0c); //开显示
LcdWriteCommand(0x01); //软复位
delay_us(1600);
}
#endif
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』