|
在代码下方点复制代码,然后另存到电脑磁盘即可下载.
- /*****************************************************************************
- 单 位:广西民族大学物理与电子工程学院07物本班
- 文件名称:Lcd.h
- 文件标识:_LCD_H_
- 摘 要:字符型液晶LCD的AVR单片机驱动程序头文件
- 当前版本:V2.0
- 作 者: 【白 羽】
- 完成日期:2010年5月15日
- *****************************************************************************/
- #ifndef _LCD_H_
- #define _LCD_H_
- #include <BaiYuAvrKu\DataType.H>
- #include <BaiYuAvrKu\PORT.H>
- #include <BaiYuAvrKu\DELAY.H>
- /*****************************************************************************
- 编绎控制:以下条件编绎语句保证只有在正确配置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
复制代码
|
|