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

📄 1602a.c

📁 是用ATmega162单片机控制1602LCD液晶显示的C语言源代码
💻 C
字号:

#include <avr/io.h>
#include <string.h>

#define RW PD4
#define RS PD5
#define E PE2

#define LCM_Data PORTA
#define Busy 0x80

void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData);
void Delay5Ms(void);
void Delay400Ms(void);

int main( void )
{
	DDRD=0xff;
	DDRE=0xff;
	outb(PORTD,0xaa);
	outb(PORTE,0x00);
	Delay400Ms();
	LCMInit();
	Delay5Ms();
	
	unsigned char email[]="123";
//	DisplayOneChar(5,0,email);
	DisplayListChar(2,0,"chenyinkang");
//	DisplayListChar(2,1,"1978-11-29");
}

void Delay5Ms(void)
{
	unsigned int TempCyc=5552;
	while(TempCyc--) ;
}

void Delay400Ms(void)
{
	unsigned char TempCycA=5;
	unsigned int TempCycB;
	while(TempCycA--)
	{
		TempCycB=7269;
		while(TempCycB--) ;
	};
	
}

//写数据
void WriteDataLCM(unsigned char WDLCM)
{
	ReadStatusLCM();
	DDRA=0xff;
	LCM_Data=WDLCM;
	
	PORTD|=(1<<5);		//RS=1
	PORTD&=~(1<<4);		//RW=0
	PORTE&=~(1<<2);		//E=0
	PORTE&=~(1<<2);		//延时
	PORTE|=(1<<2);		//E=1
	
}

//写指令
void WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC)
//BuysC为0时忽略忙检测
{
	if(BuysC) ReadStatusLCM();
	DDRA=0xff;
	LCM_Data=WCLCM;
	PORTD&=~(1<<5);		//RS=0
	PORTD&=~(1<<4);		//RW=0
	PORTE&=~(1<<2);		//E=0
	PORTE&=~(1<<2);
	PORTE|=(1<<2);		//E=1
}

//读数据
unsigned char ReadDataLCM(void)
{
	DDRA=0x00;
	PORTA=0xff;
	PORTD|=(1<<5);		//RS=1
	PORTD|=(1<<4);		//RW=1
	PORTE&=~(1<<2);		//E=0
	PORTE&=~(1<<2);
	PORTE|=(1<<2);		//E=1
	while(1)
	{
		if(bit_is_clear(PINA,7)) break;
	}
	return(PINA);
}

//读状态
unsigned char ReadStatusLCM(void)
{
//	unsigned char InputA;
	DDRA=0x00;
	PORTA=0xff;
	PORTD&=~(1<<5);		//RS=0
	PORTD|=(1<<4);		//RW=1
	PORTE&=~(1<<2);		//E=0
	PORTE&=~(1<<2);
	PORTE|=(1<<2);		//E=1
//	InputA=PINA;	
	
//	while((InputA&Busy)!=0) ;	//检测忙信号
	while(1)
	{
		if(bit_is_clear(PINA,7)) break;
	}
	return(PINA);
}

void LCMInit(void)		//LCM初始化
{
	DDRA=0xff;
	LCM_Data=0;
	WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号
	Delay5Ms();
	WriteCommandLCM(0x38,0);
	Delay5Ms();
	WriteCommandLCM(0x38,0);
	Delay5Ms();
	WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
	WriteCommandLCM(0x08,1); //关闭显示
	WriteCommandLCM(0x01,1); //显示清屏
	WriteCommandLCM(0x06,1); // 显示光标移动设置
	WriteCommandLCM(0x0C,1); // 显示开及光标设置

}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
	Y&=0x1;
	X &= 0xf; //限制X不能大于15,Y不能大于1
	if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
	X |= 0x80; //算出指令码
	WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
	WriteDataLCM(DData);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
{
	unsigned char ListLength;
	ListLength = 0;
	Y &= 0x1;
	X &= 0xF; //限制X不能大于15,Y不能大于1
	
//	DisplayOneChar(X,Y,DData[2]);
	
	
	while (DData[ListLength]>0x20) //若到达字串尾则退出
	{
		if (X <= 0xF) //X坐标应小于0xF
		{
			DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
			ListLength++;
			X++;
		}
	}

}

⌨️ 快捷键说明

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