串行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();
Command_Temp=Command_Temp < 4;
Data_Temp=Data_Temp < 4;
LCD_DATA_PORT &= 0X0F; //数据口清零
if (Command==0) //再送低4位
{
LCD_DATA_PORT |= Data_Temp&0xf0;
}
else
{
LCD_DATA_PORT |= Command_Temp&0xf0;
}
Write_Enable();
}
/***********LCD模块初始化**************/
void LCD_Init(void)
{
Delay_nms(5);
LCD_Write_Char(0x28,0); //4位数据线格式
Delay_nus(10);
LCD_Write_Char(0x0d,0); //显示开,光标闪烁
Delay_nus(10);
LCD_Write_Char(0x01,0); //清屏
Delay_nms(1);
LCD_Write_Char(0x06,0); //光标模式设置
}
/*-----------------------------------------------------------------------
* Locate : 设置LCD显示的起始位置
*
* 输入参数:x、y : 显示字符串的位置,X:0-1,Y:0-15
* LCD第一行显示寄存器地址:0X80-0X8F
* LCD第一行显示寄存器地址:0XC0-0XCF
-----------------------------------------------------------------------*/
void Locate( unsigned char x, unsigned char y )
{
unsigned char Address;
if (x == 0)
Address = 0x80 + y; //第一行显示的地址
else
Address = 0xc0 + y; //第二行显示的地址
LCD_Write_Char(Address,0);
}
/*-----------------------------------------------------------------------
* LCD_Write_String : 英文字符串显示函数
*
* 输入参数:*s :英文字符串指针
* X、Y :显示字符串的位置
-----------------------------------------------------------------------*/
void LCD_Write_String(unsigned char X,unsigned char Y,unsigned char *String)
{
Locate( X, Y); //先送显示起始坐标
while (*String) //再依次送显示字符
{
LCD_Write_Char( 0, *String );
String ++;
}
}
串行1602数据线avr单片 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)