📄 lcd1602.h
字号:
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include <avr/io.h>
#include "delayzz.h"
/*-----------------------------------------------------------------------------------------
管脚宏定义
------------------------------------------------------------------------------------------*/
#define LCD_EN_PORT PORTA
#define LCD_EN_DDR DDRA
#define LCD_RW_PORT PORTA
#define LCD_RW_DDR DDRA
#define LCD_RS_PORT PORTA
#define LCD_RS_DDR DDRA
#define LCD_DATA_PORT PORTA
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PIN PINA
#define LCD_RS (1<<PA1) //0x02 porta1 out
#define LCD_RW PA2//0x04 porta2 out
#define LCD_EN (1<<PA3) //0x08 portA3 out
#define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA4/5/6/7 out .
#define LCD_BUSY (1<<PA7) //测忙位
void LCD_init(void); //液晶初始化函数
void LCD_en_write(void); //液晶使能函数
void LCD_wait_Ready(void); //判断忙函数
void LCD_write_command(unsigned char command,unsigned char mang,unsigned char mingdata); //写命令或数据
void LCD_set_xy (unsigned char x, unsigned char y); //写显示坐标
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); //字符串写入
//void LCD_write_single(unsigned char X,unsigned char Y,unsigned char *s); //写入数组的单个原数
void LCD_write_struutg(unsigned char X,unsigned char Y,unsigned char *s,unsigned char i);
/**********************************************************************************************
液晶使能
************************************************************************************************/
void LCD_en_write(void)
{
LCD_EN_PORT|=LCD_EN; //EN=1
delay_nus(1);
LCD_EN_PORT&=~LCD_EN; //EN=0
}
/*---------------------------------------------------------------------------------------------
测忙
---------------------------------------------------------------------------------------------*/
void LCD_wait_Ready(void) //等待LCD空闲
{
LCD_DATA_DDR&=~LCD_BUSY; //忙位设置为输入
LCD_RW_PORT|=(1<<LCD_RW); //RW=1
LCD_RS_PORT&=~LCD_RS; //RS=0
LCD_EN_PORT|=LCD_EN; //EN=1
while(!(LCD_DATA_PIN&LCD_BUSY)==0); //读忙位,为0表示空闲;
LCD_EN_PORT&=~LCD_EN; //EN=0
LCD_DATA_DDR|=LCD_BUSY; //数据口方向为输出
}
/*---------------------------------------------------------------------------------------------
写指令或数据
-----------------------------------------------------------------------------------------------*/
void LCD_write_command(unsigned char command,unsigned char mang,unsigned char mingdata)
{
if(mang==1)LCD_wait_Ready(); //检测是否测忙!
if(mingdata==1)LCD_RS_PORT&=~LCD_RS; //RS=0 //判断是数据还是命令
else LCD_RS_PORT|=LCD_RS; //RS=1
LCD_RW_PORT &=~(1<<LCD_RW); //RW=0
LCD_DATA_PORT&=0X0f; //清高四位
LCD_DATA_PORT|=command&0xf0; //写高四位
LCD_en_write();
command=command<<4; //低四位移到高四位
LCD_DATA_PORT&=0x0f; //清高四位
LCD_DATA_PORT|=command&0xf0; //写低四位
LCD_en_write();
}
/*----------------------------------------------------------------------------------------------
液晶初始化
-----------------------------------------------------------------------------------------------*/
void LCD_init(void)
{
LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
LCD_RW_DDR|=(1<<LCD_RW);
LCD_RW_PORT&=~(1<<LCD_RW);
delay_nms(15); //初始化三次
LCD_write_command(0x28,0,1);
delay_nms(5);
LCD_write_command(0x28,0,1);
LCD_write_command(0x01,1,1); //清屏
}
/*------------------------------------------------------------------------------------------------
写地址
delay_nms(5);
LCD_write_command(0x28,1,1); //4位显示
LCD_write_command(0x0c,1,1); //显示开
LCD_write_command(0x06,1,1);
-----------------------------------------------------------------------------------------------------*/
void LCD_set_xy(unsigned char x,unsigned char y)
{
unsigned char address;
if (y==0) address =0x80 + x;
else address = 0xc0 + x;
LCD_write_command(address,1,1);
}
/*-----------------------------------------------------------------------------------------------------
英文字符串写入函数
-----------------------------------------------------------------------------------------------------*/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
{
LCD_set_xy(X,Y); //写地址
while (*s) // 写显示字符
{
LCD_write_command(*s,1,0);
s ++;
}
}
void LCD_write(unsigned char X,unsigned char Y,unsigned char S) //列x=0~15,行y=0,1
{
LCD_set_xy(X,Y); //写地址
LCD_write_command(S,1,0);
}
/*-----------------------------------------------------------------------------------------------------
英文字符写入连续两个字符
-----------------------------------------------------------------------------------------------------*/
void LCD_write_struutg(unsigned char X,unsigned char Y,unsigned char *s,unsigned char i) //列x=0~15,行y=0,1
{
LCD_set_xy(X,Y);
s=s+i ;
LCD_write_command(*s,1,0);
s++;
LCD_write_command(*s,1,0);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -