LCM1602液晶屏显示实验程序

更新时间:2023-09-10 11:23:01 阅读量: 教育文库 文档下载

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

LCM1602液晶屏显示实验程序

文件:lcm16x2p.h

#ifndef LCM16X2_H #define LCM16X2_H

#define BUSYFLAG 0x80 #define BLINK 0x01 #define NOBLINK 0x00

unsigned char LCMReadState(void); void LCMDelay(int);

void LCMWriteCmd(unsigned char); void LCMWriteData(unsigned char); void LCMClear(void); void LCMInit(void);

void LCMGotoXY(unsigned char,unsigned char);

void LCMDisplayChar(unsigned char,unsigned char,unsigned char); void LCMDisplayString(unsigned char,unsigned char,unsigned char*); void LCMBlink(unsigned char,unsigned char,unsigned char);

#endif

文件:lcm16x2p.c

#include #include #include \

#define LCM_DB P2

sbit LCM_RS = P1^0; sbit LCM_RW = P1^1; sbit LCM_E = P1^2; sbit LCM_BLC = P1^3;

unsigned int data DelayConst = 140;

/*******************************************************************************

函数名:LCMDelay

功 能:通过循环的方式延时

参 数:int,表示要延时的毫秒数 返 回:

作 者:倪晓军 2003-5-25 15:21

*******************************************************************************/

void LCMDelay(int ms) { unsigned int i,cnt; cnt = DelayConst * ms; for(i=0;i

/*******************************************************************************

函数名:LCMReadState

功 能:查询LCM的忙标志/当前AC地址 参 数:

返 回:BYTE,最高bit为1表示忙,为0表示闲 作 者:倪晓军 2003-5-25 15:24

*******************************************************************************/

unsigned char LCMReadState(void) { unsigned char state; LCM_E = 0; LCM_RS = 0; LCM_RW = 1; LCM_E = 1; _nop_(); _nop_(); state = LCM_DB; LCM_E = 0; return state; }

/*******************************************************************************

函数名:LCMClear 功 能:清屏 参 数: 返 回:

作 者:倪晓军 2003-5-25 15:25

*******************************************************************************/

void LCMClear(void) { LCMDelay(1); LCM_E = 0; LCM_RS = 0; LCM_RW = 0; LCM_DB = 0x01; LCM_E = 1; _nop_(); _nop_(); LCM_E = 0; LCMDelay(1); }

/*******************************************************************************

函数名:LCMWriteCmd 功 能:向LCM写入控制字

参 数:BYTE,命令字节。写入前不判断忙表示(因为初始化过程中不能判断) 返 回:

作 者:倪晓军 2003-5-25 15:26

*******************************************************************************/

void LCMWriteCmd(unsigned char cmd) { LCMDelay(1); LCM_E = 0; LCM_RS = 0; LCM_RW = 0; LCM_DB = cmd; LCM_E = 1; _nop_(); _nop_(); LCM_E = 0; }

/*******************************************************************************

函数名:LCMWriteData 功 能:向LCM写入数据

参 数:BYTE,将要写入的数据 返 回:

作 者:倪晓军 2003-5-25 15:27

*******************************************************************************/

void LCMWriteData(unsigned char dc) { while(LCMReadState() & BUSYFLAG); LCM_RS = 1; LCM_RW = 0; LCM_DB = dc; LCM_E = 1; _nop_(); _nop_(); LCM_E = 0; }

/*******************************************************************************

函数名:LCMInit 功 能:初始化LCM

参 数:DWORD,晶振频率(Hz),供计算延时常数 返 回:

作 者:倪晓军 2003-5-25 15:28

*******************************************************************************/

void LCMInit(void) { LCMDelay(60); // 延时60ms,等待LCM复位 LCMWriteCmd(0x38); // 功能设置:8位接口,2行,5x7字符点阵 LCMDelay(5); // 延时 LCMWriteCmd(0x38); // 第二次 LCMDelay(1); // 延时

LCMWriteCmd(0x38); // 此后可以通过监测忙标志判断指令执行情况 while(LCMReadState() & BUSYFLAG); LCMWriteCmd(0x08); // 关闭显示 while(LCMReadState() & BUSYFLAG); LCMWriteCmd(0x01); // 清屏 while(LCMReadState() & BUSYFLAG); LCMWriteCmd(0x06); // 显示地址自动增量,整体不移位 while(LCMReadState() & BUSYFLAG); LCMWriteCmd(0x0e); // 开显示,开光标,不闪烁 while(LCMReadState() & BUSYFLAG); }

/*******************************************************************************

函数名:LCMGotoXY

功 能:移动光标到X行,Y列

参 数:BYTE,x表示行(0,1),y表示列(横向,取值0~0x0f) 返 回:

作 者:倪晓军 2003-5-25 15:29

*******************************************************************************/

void LCMGotoXY(unsigned char x,unsigned char y) // x:行(0~1) y:列(0~F) { unsigned char cmd; if(x==0) { cmd = 0x80 | y;(设置显示缓冲区DDRAM地址命令D7=1,第0行第0列从00H开始) } else { cmd = 0x80 | 0x40 | y; (第1行第0列为40H开始) } LCMWriteCmd(cmd); while(LCMReadState() & BUSYFLAG); }

/*******************************************************************************

函数名:LCMDisplayChar

功 能:在指定位置显示一个字符

参 数:x表示行(0,1),y表示列(横向,取值0~0x0f),ch表示将要显示的字符(ASCII码) 返 回:

作 者:倪晓军 2003-5-25 15:31

*******************************************************************************/

void LCMDisplayChar(unsigned char x,unsigned char y,unsigned char ch) { LCMGotoXY(x,y); LCMWriteData(ch); }

/*******************************************************************************

函数名:LCMDisplayString

功 能:从指定的位置开始显示字符串

参 数:x表示行(0,1),y表示列(横向,取值0~0x0f),*str为指向将要显示的字符串的指针 返 回:

作 者:倪晓军 2003-5-25 15:32

*******************************************************************************/

void LCMDisplayString(unsigned char x,unsigned char y,unsigned char* str) { unsigned char ptr; ptr = 0; while(*(str+ptr) != 0) { LCMDisplayChar(x,(y+ptr),*(str+ptr)); ptr++; } }

/*******************************************************************************

函数名:LCMBlink

功 能:将指定位置显示的字符闪烁(同时关闭光标)

参 数:x表示行(0,1),y表示列(横向,取值0~0x0f),cmd=BLINK:闪烁,NOBLINK:不闪烁 返 回:

作 者:倪晓军 2003-5-25 15:33

*******************************************************************************/

void LCMBlink(unsigned char x,unsigned char y,unsigned char cmd) { LCMGotoXY(x,y); if(cmd == BLINK) { LCMWriteCmd(0x0d); } else { LCMWriteCmd(0x0c); } }

#include #include #include \

#define OSC 11059200

unsigned char ucTH,ucTL,Ticks;

//******************************************************************************

// 函数名:T0ISR

// 功 能:50ms中断服务程序

// 作 者:倪晓军 2003-5-20 22:06 // 注 释:

//******************************************************************************

void T0ISR(void) interrupt 1 { TH0 = ucTH; TL0 = ucTL; TR0 = 1; Ticks ++; if(Ticks == 20) { Ticks = 0; LCM_BLC = !LCM_BLC; } }

void main(void) { // 初始化 EA = 0; // 停止所有中断 Ticks = 0; ucTH = (65536-OSC/12/20)/256; // 计算50ms定时的时间常数 ucTL = (65536-OSC/12/20)%6; TMOD = 0x01; // T0:模式1,16位定时器 TH0 = ucTH; TL0 = ucTL; ET0 = 1; // T0允许中断 TR0 = 1; // 启动定时器 EA = 1; // 打开总中断允许 LCMInit(); LCMClear(); LCMDisplayString(0,0,\ LCMDisplayString(1,0,\ LCMBlink(0,13,BLINK); while(1); }

#define OSC 11059200

unsigned char ucTH,ucTL,Ticks;

//******************************************************************************

// 函数名:T0ISR

// 功 能:50ms中断服务程序

// 作 者:倪晓军 2003-5-20 22:06 // 注 释:

//******************************************************************************

void T0ISR(void) interrupt 1 { TH0 = ucTH; TL0 = ucTL; TR0 = 1; Ticks ++; if(Ticks == 20) { Ticks = 0; LCM_BLC = !LCM_BLC; } }

void main(void) { // 初始化 EA = 0; // 停止所有中断 Ticks = 0; ucTH = (65536-OSC/12/20)/256; // 计算50ms定时的时间常数 ucTL = (65536-OSC/12/20)%6; TMOD = 0x01; // T0:模式1,16位定时器 TH0 = ucTH; TL0 = ucTL; ET0 = 1; // T0允许中断 TR0 = 1; // 启动定时器 EA = 1; // 打开总中断允许 LCMInit(); LCMClear(); LCMDisplayString(0,0,\ LCMDisplayString(1,0,\ LCMBlink(0,13,BLINK); while(1); }

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

Top