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

📄 lcd.c

📁 AVR(Atmega8/Atmega16) 1602液晶驱动程序
💻 C
字号:
#include <avr/io.h>
#include <util/delay.h> 
#include "lcd.h"



const unsigned char UserImg[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};

void WriteUserImgLCM()
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		WriteCommandLCM(0x40|i,1);
		WriteDataLCM(UserImg[i]);	
	}
		
}

//写数据函数: E =高脉冲 RS=1 RW=0
void WriteDataLCM(unsigned char WDLCM) 
{
	ReadStatusLCM(); //检测忙  
	LCM_CTRL_PORT|=(1<<LCM_RS);//RS=1
	LCM_CTRL_PORT&=~(1<<LCM_RW);//RW=0
	LCM_CTRL_PORT&=~(1<<LCM_EN);//E=0,下面给LCD一个高脉冲

	LCM_CTRL_PORT|=(1<<LCM_EN);//E=1
	LCM_DATA_PORT=WDLCM;
	LCM_CTRL_PORT&=~(1<<LCM_EN);//重设E=0
}

//写指令函数: E=高脉冲 RS=0 RW=0
void WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC) //BuysC为0时忽略忙检测	 
{
	if (BuysC) ReadStatusLCM(); //根据需要检测忙   
	LCM_CTRL_PORT&=~(1<<LCM_RS);//RS=0
	LCM_CTRL_PORT&=~(1<<LCM_RW);//RW=0
	LCM_CTRL_PORT&=~(1<<LCM_EN);//E=0,下面给LCD一个高脉冲

	LCM_CTRL_PORT|=(1<<LCM_EN);//E=1
	LCM_DATA_PORT=WCLCM;
	LCM_CTRL_PORT&=~(1<<LCM_EN);//重设E=0	
}


//读状态  
void ReadStatusLCM(void)
{
	LCM_BUSY_DDR&=~BUSY;//设置BUSY口为输入
	LCM_CTRL_PORT&=~(1<<LCM_RS);//RS=0
	LCM_CTRL_PORT|=(1<<LCM_RW);//RW=1

	LCM_CTRL_PORT|=(1<<LCM_EN);//E=1
	while(LCM_BUSY_PIN&BUSY);//等待LCD_DB7为0
	LCM_CTRL_PORT&=~(1<<LCM_EN);//重设E=0
	LCM_BUSY_DDR|=BUSY;//设置BUSY口为输出
}

void LCMInit(void) //LCM初始化  
{
	_delay_ms(15);
	WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号  
	_delay_ms(5); 
	WriteCommandLCM(0x38,0);
	_delay_ms(5); 
	WriteCommandLCM(0x38,0);
	_delay_ms(5); 

	WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号  
	WriteCommandLCM(0x08,1); //关闭显示	   
	WriteCommandLCM(0x01,1); //显示清屏	   
	WriteCommandLCM(0x06,1); // 显示光标移动设置   
	//WriteCommandLCM(0x0F,1); // 显示开及光标设置(有光标) 
	WriteCommandLCM(0x0C,1); // 显示开及光标设置(无光标)   
	WriteUserImgLCM();   

}												   

//按指定位置显示一个字符 
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, 1); //发命令字  
	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
	while (DData[ListLength]>0x19) //若到达字串尾则退出	  
		{
			if (X <= 0xF) //X坐标应小于0xF
				{
					DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 
					ListLength++;
					X++;
				}
		}
}



⌨️ 快捷键说明

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