LCD2004 STC IAP154K61S4驱动程序及例程
//LCD/LCM 2004A 204A 头文件
#ifndef __LCD2004A_H__
#define __LCD2004A_H__
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
#define LCD2004A_4PINS
/**********************************
包含头文件
**********************************/
#include
#include "iap15w4k61s4.h"
//---重定义关键词---//
#ifndef BYTE
#define BYTE unsigned char
#endif
#ifndef WORD
#define WORD unsigned int
#endif
#ifndef DWORD
#define DWORD long unsigned int
#endif
/**********************************
Data PIN口定义
**********************************/
#define LCD2004A_DA TAPINS P0
//Define LCD1602 control bit
sbit LCD2004A_E=P4^4; //LCD_Enable
sbit LCD2004A_RW=P4^2; // LCD write/read select
sbit LCD2004A_RS=P4^1; //LCD Data/command select
/**********************************
Function define /函数声明
**********************************/
/*51单片机在20MHZ时钟下的延时函数*/
void Delay1ms(); ////delay 1ms at 20MH
void Delay5ms(); ////delay 1ms at 20MH
/*LCD2004A写入8位命令子函数*/
void Lcd2004A_WriteCom(BYTE com);
/*LCD2004A写入8位数据子函数*/
void Lcd2004A_WriteData(BYTE dat);
/*LCD2004A写入8位窗口位置数据子函数*/
void Lcd2004A_SetWindow(BYTE x,BYTE y); //x: row mumber, y:clumn number
/*LCD2004A初始化子程序*/
void Lcd2004A_Init(); //initate LCD2004A
/*LCD2004A判忙子程序*/
bit Lcd2004A_CheckBusy();// Check LCD2004A busy
/*LCD2004A显示字符串前x个字符子程序*/
void Lcd2004A_DisplayStringx(BYTE *D_String, BYTE x); //Display D_String 0~x charaters
/*LCD2004A显示字符串前字符子程序*/
void Lcd2004A_DisplayString(BYTE *D_String); //Display D_String
/*初始化STC 15WK32系列单片机I/O口子程序*/
void Io_Init(BYTE n,BYTE x, BYTE y); //Init STC MCU I/O n:I/O no, x: PnM1 y:PnM0 /*十进制显示整数子函数*/
void DisplayLongInt(DWORD x);
#endif
//LCD/LCM 2004A 204A 驅動源程序
#include "lcd2004a.h"
//*******************************
void Delay1ms() //@20.000MHz
{
unsigned char i, j;
i = 20;
j = 113;
do
{
while (--j);
} while (--i);
}
//******************************
void Delay5ms() //@20.000MHz
{
unsigned char i, j;
i = 98;
j = 67;
do
{
while (--j);
} while (--i);
}
/******************************************************************************* * 函数名: LcdWriteCom
* 函数功能: 向LCD写入一个字节的命令
* 输入: com
* 输出: 无
*******************************************************************************/
#ifndef LCD2004A_4PINS //当没有定义这个LCD2004A _4PINS时,4PIN即4线接法,接并口高四位void Lcd2004A_WriteCom(BYTE com) //写入命令com: command data
{
LCD2004A_E = 0; //使能
LCD2004A_RS = 0; //选择发送命令
LCD2004A_RW = 0; //选择写入
LCD2004A_DA TAPINS = com; //放入命令
Delay1ms(); //等待数据稳定
LCD2004A_E = 1; //写入时序
Delay5ms(); //保持时间
LCD2004A_E = 0;
}
#else
void Lcd2004A_WriteCom(BYTE com) //写入命令
{
LCD2004A_E = 0; //使能清零
LCD2004A_RS = 0; //选择写入命令
LCD2004A_RW = 0; //选择写入
LCD2004A_DA TAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Delay1ms(); //等待数据稳定
LCD2004A_E = 1; //写入时序
Delay5ms(); //保持时间
LCD2004A_E = 0;
LCD2004A_DA TAPINS = com << 4; //发送低四位
Delay1ms(); //等待数据稳定
LCD2004A_E = 1; //写入时序
Delay5ms(); //保持时间
LCD2004A_E = 0;
}
#endif
/*******************************************************************************
* 函数名: LcdWriteData
* 函数功能: 向LCD写入一个字节的数据
* 输入: dat
* 输出: 无
*******************************************************************************/
#ifndef LCD2004A_4PINS
void Lcd2004A_WriteData(BYTE dat) //写入数据
{
LCD2004A_E = 0; //使能清零
LCD2004A_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD2004A_DA TAPINS = dat; //写入数据
Delay1ms(); //等待数据稳定
LCD2004A_E = 1; //写入时序
Delay5ms(); //保持时间
LCD2004A_E = 0;
}
#else
void Lcd2004A_WriteData(BYTE dat) //写入数据
{
LCD2004A_E = 0; //使能清零
LCD2004A_RS = 1; //选择写入数据
LCD2004A_RW = 0; //选择写入
LCD2004A_DA TAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Delay1ms(); //等待数据稳定
LCD2004A_E = 1; //写入时序
Delay5ms(); //保持时间
LCD2004A_E = 0;
LCD2004A_DA TAPINS = dat << 4; //写入低四位
Delay1ms(); //等待数据稳定
LCD2004A_E = 1; //写入时序
Delay5ms(); //保持时间
LCD2004A_E = 0;
}
#endif
/*******************************************************************************
* 函数名: LcdInit()
* 函数功能: 初始化LCD屏
* 输入: 无
* 输出: 无
*******************************************************************************/
#ifndef LCD2004A_4PINS
void Lcd2004A_Init() //LCD初始化子程序
{
Lcd2004A_WriteCom(0x38); //开显示
Lcd2004A_WriteCom(0x0c); //开显示不显示光标
Lcd2004A_WriteCom(0x06); //写一个指针加1
Lcd2004A_WriteCom(0x01); //清屏
Lcd2004A_WriteCom(0x80); //设置数据指针起点
}
#else
void Lcd2004A_Init() //LCD初始化子程序
{
Lcd2004A_WriteCom(0x32); //将8位总线转为4位总线
Lcd2004A_WriteCom(0x28); //在四位线下的初始化
Lcd2004A_WriteCom(0x0c); //开显示不显示光标
Lcd2004A_WriteCom(0x06); //写一个指针加1
Lcd2004A_WriteCom(0x01); //清屏
Lcd2004A_WriteCom(0x80); //设置数据指针起点
}
#endif
//*************************************************************************
void Lcd2004A_SetWindow(BYTE x,BYTE y) //x: 行号row mumber,1:第一行,2:第二行, y:纵坐标clumn number {
switch(x)
{
case 1:
Lcd2004A_WriteCom(0x80+y);
break;
case 2:
Lcd2004A_WriteCom(0xC0+y);
break;
case 3:
Lcd2004A_WriteCom(0x94+y);
break;
case 4:
Lcd2004A_WriteCom(0xD4+y);
break;
}
}
//****************************************************************************
bit Lcd2004A_CheckBusy()
{
register LCD2004A_State;
LCD2004A_E = 1; //使能清零
LCD2004A_RS = 0; //选择读出数据
LCD2004A_RW = 1; //选择读出
Delay1ms(); //等待数据稳定
LCD2004A_State=LCD2004A_DA TAPINS;
LCD2004A_E = 0;
return((bit)LCD2004A_State&0X80);
}
//***********************************************************************************
void Lcd2004A_DisplayStringx(BYTE *D_String, BYTE x) //Display D_String 0~x charaters
{
BYTE i=0;
while(i { Lcd2004A_WriteData(D_String[i]); i++; } } //************************************************************************************* void Lcd2004A_DisplayString(BYTE *D_String) //Display D_String { register i=0; while(D_String[i]!=0) { Lcd2004A_WriteData(D_String[i]); i++; } } //**************************************************************************** void Io_Init(BYTE n,BYTE x, BYTE y) { switch(n) { case 0: P0M1=x; P0M0=y; break; case 1: P1M1=x; P1M0=y; break; case 2: P2M1=x; P2M0=y; break; case 3: P3M1=x; P3M0=y; break; case 4: P4M1=x; P4M0=y; break; case 5: P5M1=x; P5M0=y; break; } } //********************************************************************************** void DisplayLongInt(DWORD x)//十进制显示整数子函数 { BYTE Tempchar[21]="********************"; DWORD y; BYTE i; i=1; y=x; while(y>=10) { y /=10; i++; } y=x; for(;i>0;i--) { Tempchar[i-1]='0'+y%10; y /=10; } Lcd2004A_DisplayString(Tempchar); } //LCD/LCM 2004A 204A 例程驅動源程序 #include "lcd2004a.h" DWORD TestData=4294967295; //设定要显示的20位整数 BYTE code TestByte[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";//设定要显示的字符 void main(void) { BYTE g; //变量需先定义后使用,先定义一个变量 Io_Init(0,0x00,0x00);//将P0口初始化为准双向IO,此行可注释掉,因STC IAP15W4K61S4上电复位为准双向IO Io_Init(4,0x00,0x00);//将P4口初始化为准双向IO,对STC IAP15W4K61S4此行必需. Lcd2004A_Init(); while(1) { Lcd2004A_SetWindow(1,0);// 设定显示位置在第一行第一个字符显示位置开始 Lcd2004A_DisplayString(TestByte); //由于TestByte[]总字符数超过了20个字符,而第三行的DDRAM地址是14~27H //所以剩余的字符会在第三行显示。 Lcd2004A_SetWindow(2,0);//设定显示数字位置在第二行第一个字符显示位置开始 DisplayLongInt(TestData); //显示10位整数,STC IAP15W4K61S4能处理的最大无符号整数为4294967295 Lcd2004A_SetWindow(4,0);//设定显示数字位置在第二行第一个字符显示位置开始 Lcd2004A_DisplayStringx(TestByte, 20);//显示字符串TestByte[]的前20个字符 for(g=0;g<200;g++) { Delay5ms(); } } }