串行1602的四位数据线程序-avr单片机
1602Driver.h
/*********************LCD模块1602底层驱动库***********************
* LCD模块与单片机的硬件连接:
* /端口名称 /端口符号 /MCU端口 / LCD引脚号/
*
* RS数据/指令选择线
* RS PD3 4
* R/W读写选择线
* R/W GND 5
* EN写使能线
* EN PD2 6
* 三态双向数据总线
* D0-D3 NC 7-10
* D4 PD4 11
* D5 PD5 12
* D6 PD6 13
* D7 PD7 14
*
* 其他端口连接:
* 电源负 VSS 1
* 电源正+4.5--+5.5V VDD 2
* 对比度调节 VL GND 3
* 背光负 BLK NC 15
* 背光正 BLA NC 16
* 说明:采用节省端口的4线线连接方式,即将8位的数据分两次传输;同
* 时将R/W接地RW(只用W不需要R,所以可以省一根线)
* 日期:2006/02/03
*****************************************************************/
/*****************定义MCU与LCD的接口******************/
#define LCD_EN_PORT PORTC //写使能。高有效,下降沿时锁定数据
#define LCD_RS_PORT PORTC //指令/数据选择
#define LCD_DATA_PORT PORTC //数据总线
#define LCD_EN 0x04 //PORTD2 out
#define LCD_RS 0x08 //PORTD3 out
#define LCD_DATA 0xf0 //PORTD4/5/6/7 out
#define Data_Write LCD_RS_PORT |= LCD_RS //写数据模式
#define Command_Write LCD_RS_PORT &= ~LCD_RS //写指令模式
#define Write_En LCD_EN_PORT |= LCD_EN //写使能
#define Write_Lock LCD_EN_PORT &= ~LCD_EN //锁定数据
//#define Graph_Right_Run LCD_Write_Char(0x02,0) //画面右移
const char CHR[16] = {0,1,2,3,4,5,6,7,8
,9,a,b,c,d,e,f};
unsigned char LCD_Buff[] = {0,0,0,0,0,0,0,0};
/*******************N us延时函数**********************/
void Delay_nus(unsigned int j)
{
unsigned int i="0";
for(i=j;i>0;i--)
{
asm("nop");
}
}
/********************N ms延时函数*********************/
void Delay_nms(unsigned int n)
{
unsigned int m = 0;
unsigned int k = 0;
for (m=n;m>0;m--)
{
for (k=1140;k>0;k--)
{
Delay_nus(1);
}
}
}
/******读写使能(高电平有效,下降沿锁定数据 )********/
void Write_Enable(void)
{
Write_En;
Delay_nus(1);
Write_Lock;
}
/*---------------------------------------------------------------------
* LCD_Write_Char :英文单字符显示函数
*
* 向LCD发送数据/指令。 Command="1" 发送显示数据
* Command=0 发送指令数据
*
* 输入参数 :Command 数据/指令寄存器选择
* Data 显示内容
*
-----------------------------------------------------------------------*/
void LCD_Write_Char(char Command,char Data)
{
unsigned Command_Temp,Data_Temp;
Command_Temp = Command;
Data_Temp = Data;
Delay_nms(1); //延时1ms,以避开"写繁忙"时期
if (Command == 0) //数据输入模式
{
Data_Write;
LCD_DATA_PORT &= 0x0f; //数据口清零
LCD_DATA_PORT |= Data_Temp&0xf0; //先送高4位
}
else //指令输入模式
{
Command_Write;
LCD_DATA_PORT &= 0x0f;
LCD_DATA_PORT |= Command_Temp&0xf0;
}
Write_Enable();
评论