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

📄 my1602-8bit.c

📁 ATmega16-ad1602
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
//--------------------------------------------------------
#define uchar unsigned char	
#define uint unsigned int
//-------------------引脚电平的宏定义---------------------
#define LCM_RS_1 PORTA|=16
#define LCM_RS_0 PORTA&=~16
#define LCM_RW_1 PORTA|=32
#define LCM_RW_0 PORTB&=~32 
#define LCM_EN_1 PORTA|=64	  
#define LCM_EN_0 PORTA&=~64  
//========================================================
#define DataPort PORTB	
#define Busy 0x80		
#define xtal 4   		
//========函数声明========================================
void Delay_1ms(void);
void Delay_nms(uint n);
void LcdWriteData(uchar dataW);
void LcdWriteCommand(uchar CMD,uchar Attribc);
void Init_LCD(void);
void Display(uchar dd);
void DisplayOneChar(uchar x,uchar y,uchar Wdata);
void LCD_DisplayString(uchar x,uchar y, uchar const *ptr);
void busy(void);
//***************测试程序**********************
 void DisplayLine2(uchar dd)
{
 	  		uchar i;
			for(i=0;i<16;i++)
			{
			DisplayOneChar(i,1,dd++);
			dd&=0x7f;
			if(dd<32)dd=32;
			}
};
//******************************************
		   
//********************显示指定座标的一串字符子函数******************
void LCD_DisplayString(uchar x,uchar y, uchar const *ptr)
{
 	uchar i,l=0;
	while(ptr[l]>31){l++;}
	for(i=0;i<l;i++)
	{
	 	 DisplayOneChar(x++,y,ptr[i]);
	 	 if(x==16)
		 { x=0;y^=1; }
  	}
}
//*********************显示光标定位子函数***************************
void LocateXY(char posx,char posy)
{
 	 uchar temp=0x00;
	 temp&=0x7f;
	 temp=posx&0x0f;
     posy&=0x01;
	 if(posy==1)temp|=0x40;
	 temp|=0x80;
	 LcdWriteCommand(temp,1);
}
//*********************显示指定座标的一个字符子函数*****************
void DisplayOneChar(uchar x,uchar y,uchar Wdata)
{
 	 LocateXY(x,y);
 	 LcdWriteData(Wdata);
}
//*******************LCD初始化子函数*********************************
void Init_LCD(void) 
{
 	 LcdWriteCommand(0x38,0); 
	 Delay_nms(5);
	 LcdWriteCommand(0x38,0); 
	 Delay_nms(5);
	 LcdWriteCommand(0x38,0); 
	 Delay_nms(5);
	 LcdWriteCommand(0x38,1); 
	 LcdWriteCommand(0x08,1); 
	 LcdWriteCommand(0x01,1);
	 LcdWriteCommand(0x06,1); 
	 LcdWriteCommand(0x0c,1); 
}
//********************写命令到LCM子函数******************************
void LcdWriteCommand(uchar CMD,uchar Attribc)
{
 	 if(Attribc)busy( );
	 LCM_RS_0;LCM_RW_0;NOP();
	 DataPort=CMD;NOP();
	 LCM_EN_1;NOP();NOP();LCM_EN_0;
}
//*******************写数据到LCM子函数*******************************
void LcdWriteData(uchar dataW)
{
 	 	busy();
		LCM_RS_1;
		LCM_RW_0;NOP();
		DataPort=dataW;NOP();
		LCM_EN_1;NOP();NOP();LCM_EN_0;
}
//*******************检测LCD忙信号子函数*****************************
void busy(void)
{
  	 	uchar temp;
  		temp=1;
		NOP();NOP();//Delay_1ms( );
		LCM_RS_0;    //RS=0
		NOP();NOP();
		LCM_RW_1;     //RW=1
		NOP();NOP();//Delay_1ms( );
		while(temp)
		{
		LCM_EN_1; //EN=1
		NOP();NOP();//Delay_1ms( );
		DDRA=0x00;      //A口变输入
		PORTA=0xff;     //上拉使能
		NOP();NOP();//Delay_1ms( );
		temp = PINA&0x80;    //读取A口
		NOP();NOP();//Delay_1ms( );      
		DDRA=0xff;      
		PORTA=0xff;        //A口变输出
		NOP();NOP();//Delay_1ms( );
		LCM_EN_0;   //EN=0
		NOP();NOP();//Delay_1ms( );
		}
}
//*******************1mS延时子函数**********************************
void Delay_1ms(void)		
{ 	 	uint i;
  	    for(i=1;i<(uint)(xtal*143-2);i++)
        ;
}
//*******************n*1mS延时子函数********************************
void Delay_nms(uint n)		
{
 	 	uint i=0;
   		while(i<n)
   		{
  		Delay_1ms();
    	i++;
   		}
}

⌨️ 快捷键说明

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