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

📄 avr_1602.h

📁 AVR 1620液晶的程序
💻 H
字号:
#include"avr/io.h"
#include"util/delay.h"

//---------------------------定义接口-----------------------//
//数据线接口
#define LCM_DDR_N  DDRD   
#define LCM_DataW  PORTD
#define LCM_DataR  PIND

//RS RW E用到的接口
#define LCM_DDR_S  DDRB
#define LCM_PORT_S   PORTB
#define LCM_RW  0
#define LCM_RS  1
#define LCM_E   2


//-----------------------------读状态-----------------------//
unsigned char ReadStatusLCM(void)
{
    LCM_DDR_N=0x00;     //数据总线接口为输入口   
	LCM_PORT_S&=~(1<<LCM_RS);    //LCM_RS=0
    LCM_PORT_S|=1<<LCM_RW;     //LCM_RW=1   
	LCM_PORT_S|=1<<LCM_E;     //LCM_E=1
	while(LCM_DataR&0x80);   //检测忙信号
	LCM_PORT_S&=~(1<<LCM_E);     //LCM_E=0
    return LCM_DataR;
}
   
//-----------------------------写数据--------------------------//
void WriteDataLCM(unsigned char WDLCM)
{
    ReadStatusLCM();   //检测忙,直到不忙返回

    LCM_DDR_N=0xff;  //数据总线接口为输出口

    LCM_PORT_S|=1<<LCM_RS;    //LCM_RS=1
    LCM_PORT_S&=~(1<<LCM_RW);     //LCM_RW=0
	LCM_PORT_S&=~(1<<LCM_E);     //LCM_E=0
	LCM_DataW=WDLCM;
	LCM_PORT_S|=1<<LCM_E;       //下降沿写操作
    LCM_PORT_S&=~(1<<LCM_E);     //LCM_E=0
}

//---------------------------写指令------------------------------//
void WriteCommandLCM(unsigned char WCLCM,unsigned char BusyC)
{
    if(BusyC) ReadStatusLCM();   //根据需要检测忙
    LCM_DDR_N=0xff;    //数据总线接口为输出口
   
	LCM_PORT_S&=~(1<<LCM_RS);    //LCM_RS=0
    LCM_PORT_S&=~(1<<LCM_RW);     //LCM_RW=0
    LCM_PORT_S&=~(1<<LCM_E);     //LCM_E=0
    LCM_DataW=WCLCM;
	LCM_PORT_S|=1<<LCM_E;       //下降沿写操作
    LCM_PORT_S&=~(1<<LCM_E);     //LCM_E=0
}

//---------------------------读数据------------------------------//
unsigned char ReadDataLCM(void)
{
    LCM_DDR_N=0x00;  //数据总线接口为输入口
    LCM_PORT_S|=1<<LCM_RS;    //LCM_RS=1
	LCM_PORT_S|=1<<LCM_RW;    //LCM_RW=1
    LCM_PORT_S|=1<<LCM_E;    //LCM_E=1
    return LCM_DataR;
}

 
//-------------------LCM初始化------------------------------------//
void LCMInit(void)
{
    LCM_DDR_N=0xff;  //数据总线接口为输出口   
    LCM_DDR_S=(1<<LCM_RW)|(1<<LCM_RS)|(1<<LCM_E);  //设置RW RS E 口为输出
	LCM_DataW=0;
	//固定模式
	WriteCommandLCM(0x38,0);     //3次显示模式设置,不检测忙信号
	_delay_ms(5); 
	WriteCommandLCM(0x38,0);
	_delay_ms(5);
	WriteCommandLCM(0x38,0);
	_delay_ms(5);

	WriteCommandLCM(0x38,1);  //功能设置(8位,2行,5*7),开始要求每次检测忙信号
	WriteCommandLCM(0x08,1);   //关闭显示
    WriteCommandLCM(0x01,1);   //显示清屏
	WriteCommandLCM(0x06,1);   //显示光标移动设置
	WriteCommandLCM(0x0F,1);   //显示开及光标设置
	WriteCommandLCM(0x80,1);   //起始位置行1列1
}

//---------------------------按指定位置显示一个字符-----------------------//
void DisplayOneChar(unsigned char x,unsigned char y,unsigned char DData)
{
    y&=0x01;    //限制x不能大于15,y不能大于1
    x&=0x0F;    
    x= (y==1)? 0x40:0x00;  //测试显示第几行
    x|=0x80;   //算出指令
    WriteCommandLCM(x,1); 
	WriteDataLCM(DData);  
}

//-------------------------在指定位置显示一个字符串-----------------------//
void DisplayListChar(unsigned char x,unsigned char y,unsigned char *DData)
{
    unsigned char k=0;

	y&=0x01;    //限制x不能大于15,y不能大于1
    x&=0x0F;    
    x= (y==1)? 0x40:0x00;  //测试显示第几行
    x|=0x80;   //算出指令
    WriteCommandLCM(x,1); 

    while(*(DData+k)!='\0')
	{
	     WriteDataLCM(*(DData+k)); 
		 k++;
     }
}
    
        

⌨️ 快捷键说明

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