|
在代碼下方點復制代碼,然后另存到電腦磁盤即可下載.
- /*****************************************************************************
- 單 位:廣西民族大學物理與電子工程學院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
復制代碼
|
|