LCD2004 STC IAP154K61S4驱动程序及例程

LCD2004 STC IAP154K61S4驱动程序及例程
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();

}

}

}

相关主题
相关文档
最新文档