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

📄 lcd.c

📁 ATmega16内部ADC的应用:ATmega16内部集成了8路10位逐次逼近型模数转换器
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#define delay125ns NOP()
#define delay250ns NOP();NOP()
#define delay500ns NOP();NOP();NOP();NOP()
//;NOP()

#define delay1us NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
#define delay2us delay1us;delay1us
#define RS PD4
#define RW PD5
#define EN PD7
#define DataLcd PORTB
#define DataLcdIn PINB
#define DataOut DDRB = 0XFF
#define DataIn DDRB = 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)
/*时钟为8MHZ* /
void delay_1us(void)
{
   asm("nop");
}
void delay_us(unsigned int itimes)
{
   unsigned int itemp;
   for (itemp=0;itemp<itimes;itemp++)
      {
	     delay_1us();
	  }
}
/**/
void ClearLcd(void) 
{
   EN_0;
   RS_0;
   RW_0;
   DataOut;
   DataLcd = 1;
   delay250ns;
   EN_1;
   delay500ns;
   EN_0;
   delay125ns;
   RS_1;
   RW_1;
}   
/**/
void home(void)
{
   RS_0;
   RW_0;
   DataLcd = 2;
   delay250ns;
   EN_1;
   delay500ns;
   EN_0;
   delay125ns;
   RS_1;
   RW_1;
}
void InputSet(void)
{
   RS_0;
   RW_0;
   DataLcd = 6;   //
   delay250ns;
   EN_1;
   delay500ns;
   EN_0;
   delay125ns;
   RS_1;
   RW_1;
}
void VisionSet(void)
{
   EN_0;
   RS_0;
   RW_0;
   DataLcd = 0x0f;   //设置D=1,C=1,B=1
   delay250ns;
   EN_1;
   delay500ns;
   EN_0;
   delay125ns;
   RS_1;
   RW_1;
}
void FunctionSet(void)
{
   DataOut;
   EN_0;
   RS_0;
   RW_0;
   DataLcd = 0x38;   //设置DL=1,N=1,F=0
   delay250ns;       //地址建立时间,最小140ns
   EN_1;
   delay500ns;      //脉冲宽度,最小450ns
   EN_0;
   delay125ns;     //地址保持时间,最小10ns
   RS_1;
   RW_1;
}
void CgramSet(void)
{
   
}
void DdramSet(unsigned char addr)
{
   EN_0;
   RS_0;
   RW_0;
   DataLcd = (0x80+addr);   //
   delay250ns;
   EN_1;
   delay500ns;
   EN_0;
   delay125ns; 
   RS_1;
   RW_1;
}
unsigned char BFRead(void)
{
   unsigned char bf;
   RS_0;
   RW_1;  
   delay250ns;
   EN_1;
   delay500ns;
   DataIn;
   bf = DataLcdIn;
   EN_0;
   delay125ns; 
   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;   //
   delay250ns;
   EN_1;
   delay500ns;
   EN_0;
   delay125ns; 
   RS_0;
   RW_1;
}
void LcdInit(void)
{
   LCDReady();
   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);   //等待写入操作完成
   }
}
void DataWrite(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!=0XFF)
   {
     CharWrite((*s)+0x30);
	 s++;
	 delay_us(80);   //等待写入操作完成
   }
}

⌨️ 快捷键说明

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