×
单片机 > 单片机程序设计 > 详情

Lcd.h头文件下载-字符型液晶LCD的AVR单片机驱动程序头文件

发布时间:2020-06-17 发布时间:
|

/*****************************************************************************


      单    位:广西民族大学物理与电子工程学院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


关键字:头文件  字符型液晶LCD  AVR单片机  驱动程

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向