⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 1602基于AVRMEGA的液晶显示
💻 C
字号:
#include "lcd.h"

#include <avr/io.h>

#include "delay.h"

#define RS PD4
#define RW PD5
#define EN PD7
#define DataLcd PORTA
#define DataLcdIn PINA
#define DataOut DDRA = 0XFF
#define DataIn DDRA = 0


#define RS_0 PORTD &=~ (1<<RS)
#define RS_1 PORTD |=  (1<<RS)
#define RW_0 PORTD &=~ (1<<RW)
#define RW_1 PORTD |=  (1<<RW)
#define EN_0 PORTD &=~ (1<<EN)
#define EN_1 PORTD |=  (1<<EN)


void ClearLcd(void) 
{
   EN_0;
   RS_0;
   RW_0;
   DataOut;
   DataLcd = 1;
   delay_us(200);
   EN_1;
   delay_us(300);
   EN_0;
   delay_us(300);
   RS_1;
   RW_1;
}   
/**/
void home(void)
{
   RS_0;
   RW_0;
   DataLcd = 2;
   delay_us(100);
   EN_1;
   delay_us(100);
   EN_0;
   delay_us(100);
   RS_1;
   RW_1;
}
void InputSet(void)
{
   RS_0;
   RW_0;
   DataLcd = 6;   //
   delay_us(100);
   EN_1;
   delay_us(100);
   EN_0;
   delay_us(100);
   RS_1;
   RW_1;
}
void VisionSet(void)
{
   EN_0;
   RS_0;
   RW_0;
   DataLcd = 0x0f;   //设置D=1,C=1,B=1
   delay_us(100);
   EN_1;
   delay_us(100);
   EN_0;
   delay_us(100);
   RS_1;
   RW_1;
}
void FunctionSet(void)
{
   DataOut;
   EN_0;
   RS_0;
   RW_0;
   DataLcd = 0x38;   //设置DL=1,N=1,F=0
   delay_us(100);       //地址建立时间,最小140ns
   EN_1;
   delay_us(100);     //脉冲宽度,最小450ns
   EN_0;
   delay_us(100);     //地址保持时间,最小10ns
   RS_1;
   RW_1;
}
void CgramSet(void)
{
   
}
void DdramSet(unsigned char addr)
{
   EN_0;
   RS_0;
   RW_0;
   DataLcd = (0x80+addr);   //
   delay_us(100);
   EN_1;
   delay_us(100);
   EN_0;
   delay_us(100);
   RS_1;
   RW_1;
}

unsigned char BFRead(void)
{
   unsigned char bf;
   RS_0;
   RW_1;  
   delay_us(100);
   EN_1;
   delay_us(100);
   DataIn;
   bf = DataLcdIn;
   EN_0;
   delay_us(100);
   RS_1;
   RW_0;
   
   return bf;
}

void LCDReady(void)
{
   unsigned char bf;
   do
      {bf = BFRead();
	  //PORTA = bf;       //just for debug
	  }
   while((bf&0x80)==0x80);
   DataOut;
}

void CharWrite(unsigned char data)
{
   LCDReady();
   RS_1;
   RW_0;
   DataLcd = data;   //
   delay_us(100);
   EN_1;
   delay_us(100);
   EN_0;
   delay_us(100); 
   RS_0;
   RW_1;
}

void LcdInit(void)
{
   FunctionSet();
   LCDReady();
   DdramSet(0);
   LCDReady();
   VisionSet();
   LCDReady();
   InputSet();
   LCDReady();
   ClearLcd();
   LCDReady();
   home();
   delay_us(10);
}

void CharsWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
{
   unsigned char addr;
   if (addry==1)
   {
      addr = addrx;
   }
   else if (addry==2)
   {
      addr = (addrx+0x40);
   }
   else
   {
      addr = 0;
   }
   DdramSet(0);     //初始化ddram地址
   LCDReady();
   DdramSet(addr);  //设定ddram地址
   delay_us(80);
   while(*s)
   {
     CharWrite(*s);
	 s++;
	 delay_us(80);   //等待写入操作完成
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -