LCD2004 STC IAP154K61S4驱动程序及例程

更新时间:2023-12-27 21:13:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

//LCD/LCM 2004A 204A 头文件

#ifndef __LCD2004A_H__ #define __LCD2004A_H__

/********************************** 当使用的是4位数据传输的时候定义, 使用8位取消这个定义

**********************************/ #define LCD2004A_4PINS

/********************************** 包含头文件

**********************************/ #include

#include \

//---重定义关键词---// #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_DATAPINS 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 \

//******************************* 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_DATAPINS = 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_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Delay1ms(); //等待数据稳定 LCD2004A_E = 1; //写入时序 Delay5ms(); //保持时间 LCD2004A_E = 0; LCD2004A_DATAPINS = 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_DATAPINS = 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_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Delay1ms(); //等待数据稳定 LCD2004A_E = 1; //写入时序 Delay5ms(); //保持时间 LCD2004A_E = 0; LCD2004A_DATAPINS = 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_DATAPINS; 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

//************************************************************************************* 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; y /=10; } Lcd2004A_DisplayString(Tempchar); }

//LCD/LCM 2004A 204A 例程驅動源程序

#include \

DWORD TestData=4294967295; //设定要显示的20位整数

BYTE code TestByte[]=\设定要显示的字符

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(); } } }

本文来源:https://www.bwwdw.com/article/dqkx.html

Top