中科因仑“3+1”工程特种兵精英论坛
标题:
经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序
[打印本页]
作者:
脑经急转弯
时间:
2016-6-23 20:29
标题:
经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序
网上下载的资料。因为论坛不支持.doc文件,我就直接复制上来了。
==================================================================
/******************************************************************************
经典的KEIL_C51_LCD1602_4总线驱动+中文注释程序
文件名 :1602.c
cpu:STC12C5A32S2 晶振频率:11.0592Mhz
编程者:
BG1EQ@TOM.COM
2011-8-25 测试通过
*******************************************************************************
LCD1602 实际硬件连接:
LCM_RS-----P2^0; //1602定义引脚
LCM_RW-----P2^1;
LCM_E -----P2^7;
LCM_DB0-----P0.0
LCM_DB1-----P0.1
LCM_DB2-----P0.2
LCM_DB3-----P0.3
LCM_DB4-----P0.4
LCM_DB5-----P0.5
LCM_DB6-----P0.6
LCM_DB7-----P0.7
*******************************************************************************/
#include <reg52.h> //包含52头文件
#include <string.h> //包含初试化头文件
#include <intrins.h>
//#include <stdlib.h> //包含标准函数库头文件
#include "4bitlcm1602.h" //包含delay头文件
#include "delay.h" //包含delay头文件
#define uchar unsigned char
#define uint unsigned int
//------硬件端口定义--------------------------------
//------函数(声明)--------------------------------
void sys_init(void); //系统初始化函数(声明)
/******************************************************************************************
* 函数名称 :主程序
* 功能描述 :
******************************************************************************************/
main() //主程序入口
{
// LCMInit(); //初始化LCD
sys_init(); //系统初始化
while(1)
{ //主程序循环(开始)
LCD_cls(); //清屏
DisplayListChar(0,0," MONITOR V1.0 "); //第1行显示
DisplayListChar(0,1," APPLY IN CHINA "); //第2行显示
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
LCD_cls(); //清屏
DisplayListChar(0,0,"
BG1EQ@TOM.COM
"); //第1行显示
DisplayListChar(0,1," 2011Y 08M 25D "); //第2行显示
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
LCD_cls(); //清屏
DisplayOneChar(0,0,'0'); //显示字符
DisplayOneChar(1,0,'1'); //显示字符
DisplayOneChar(2,0,'2'); //显示字符
DisplayOneChar(3,0,'3'); //显示字符
DisplayOneChar(4,0,'4'); //显示字符
DisplayOneChar(5,0,'5'); //显示字符
DisplayOneChar(6,0,'6'); //显示字符
DisplayOneChar(7,0,'7'); //显示字符
DisplayOneChar(8,0,'8'); //显示字符
DisplayOneChar(9,0,'9'); //显示字符
DisplayOneChar(10,0,'0'); //显示字符
DisplayOneChar(11,0,'-'); //显示字符
DisplayOneChar(12,0,'+'); //显示字符
DisplayOneChar(13,0,'='); //显示字符
DisplayOneChar(14,0,'#'); //显示字符
DisplayOneChar(15,0,'$'); //显示字符
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
LCD_cls(); //清屏
DisplayOneChar(0,1,'A'); //显示字符
DisplayOneChar(1,1,'B'); //显示字符
DisplayOneChar(2,1,'C'); //显示字符
DisplayOneChar(3,1,'D'); //显示字符
DisplayOneChar(4,1,'E'); //显示字符
DisplayOneChar(5,1,'F'); //显示字符
DisplayOneChar(6,1,'G'); //显示字符
DisplayOneChar(7,1,'H'); //显示字符
DisplayOneChar(8,1,'I'); //显示字符
DisplayOneChar(9,1,'J'); //显示字符
DisplayOneChar(10,1,'K'); //显示字符
DisplayOneChar(11,1,'L'); //显示字符
DisplayOneChar(12,1,'M'); //显示字符
DisplayOneChar(13,1,'N'); //显示字符
DisplayOneChar(14,1,'O'); //显示字符
DisplayOneChar(15,1,'P'); //显示字符
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
} //主程序循环结束返回
}
/******************************************************************************************
* 函数名称 :sys_init
* 功能描述 :系统初始化
******************************************************************************************/
void sys_init()
{
Delay400Ms(); //上电后延时,让LCD1602进入稳定状态,
LCMInit(); //初始化LCD1602
}
以上是C51主程序
以下是C51 模块化4BITLCM1602.H 函数程序
/*--------------------------------------------------------------------------
4BITLCM1602.H
4位总线驱动LCD1602 头文件
--------------------------------------------------------------------------*/
#ifndef __4BITLCM1602_H__
#define __4BITLCM1602_H__
/*******************************************************************************/
//#include <reg52.h> //包含52头文件
//#include <string.h> //包含初试化头文件
//#include <intrins.h>
//#include <stdlib.h> //包含标准函数库头文件
#define uchar unsigned char
#define uint unsigned int
//------硬件端口定义--------------------------------
sbit LCM_RS = P2^0; //1602定义引脚
sbit LCM_RW = P2^1;
sbit LCM_E = P2^7;
sbit LCD7=P0^7;
sbit LCD6=P0^6;
sbit LCD5=P0^5;
sbit LCD4=P0^4;
uchar bdata lcdbuff; //声明,全局的、可以位寻址的变量
sbit lcd_buff7=lcdbuff^7;
sbit lcd_buff6=lcdbuff^6;
sbit lcd_buff5=lcdbuff^5;
sbit lcd_buff4=lcdbuff^4;
sbit lcd_buff3=lcdbuff^3;
sbit lcd_buff2=lcdbuff^2;
sbit lcd_buff1=lcdbuff^1;
sbit lcd_buff0=lcdbuff^0;
//------函数(声明)--------------------------------
void LCMInit(void); //LCM屏初始化
void R_BF(); //读忙标志BF
void w_com(uchar com); //写指令函数
void w_cdata(void); //写数据函数
void WriteDataLCM(unsigned char WDLCM); //LCM屏写数据函数(声明)
void LCD_cls(void); //LCM屏清屏
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
/******************************************************************************************
* 函数名称 :WriteDataLCM
* 功能描述 :LCM写数据
******************************************************************************************/
void WriteDataLCM(uchar WDLCM)
{
R_BF();
lcdbuff = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
w_cdata(); //这里写入字符码
}
/******************************************************************************************
* 函数名称 :DisplayListChar
* 功能描述 :按指定位置显示一串字符,原来的遇到空格0x20就不显示
* 函数说明 :
******************************************************************************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength,j; //定义局部变量
ListLength = strlen(DData); //读取字符串长度
X &= 0xF; //限制X不能大于15
Y &= 0x1; //限制Y不能大于1
if (X <= 0xF) //X坐标应小于0xF
{
for(j=0;j<ListLength;j++)
{
DisplayOneChar(X, Y, DData[j]); //显示单个字符
X++;
}
}
}
/******************************************************************************************
* 函数名称 :DisplayOneChar
* 功能描述 :按指定位置显示一个字符
* 函数说明 :
******************************************************************************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
X &= 0xF; //限制X不能大于15
Y &= 0x1; //限制Y不能大于1
if (Y) X |= 0x40; //如果Y是“1”,则合成显示第二行时地址码+0x40;
X |= 0x80; //合成的、显示位置码,指令码:1Yxx xxxx (B)
w_com(X); //写入地址码,X数据包含字符的显示位置
WriteDataLCM(DData); //写入数据码,要显示的字符数据
}
/******************************************************************************************
* 函数名称 :LCMInit
* 功能描述 :LCM初始化
* 函数说明 :LCM初始化
******************************************************************************************/
void LCMInit(void)
{
w_com(0x2c); //功能设置为:四位数据总线
w_com(0x01); //清屏
w_com(0x06); //设置显示输入模式(AC指针自加1,显示不移位)
w_com(0x0c); //显示开/关设置(设置显示、光标和闪烁开关)
}
/******************************************************************************************
* 函数名称 :R_BF
* 功能描述 :读忙标志BF
* 函数说明 :读忙标志BF
*******************************************************************************************/
void R_BF()
{
LCD7=1; //BF端口在DB7,置LCD7为“1”等待测试本端口电平
LCM_RS=0;
LCM_RW=1;
LCM_E=1; //RS=0;RW=1;E=1表示读忙标志BF
while(LCD7); //若内部操作位BF忙CPU就等待BF不忙才能操作
LCM_E=0;
}
/******************************************************************************************
* 函数名称 :w_com
* 功能描述 :写命令
* 函数说明 :主要用来初始化一些设置显示、输入模式、显示开关、光标、移位、功能、地址
*******************************************************************************************/
void w_com(uchar com)
{
R_BF();
lcdbuff = com;
LCM_RS = 0;
LCM_RW = 0;
w_cdata();
}
/******************************************************************************************
* 函数名称 :w_cdata
* 功能描述 :写命令的公共
* 函数说明 :四位数据总线, 每发送一字节,先发送高四位,再发送低四位
*******************************************************************************************/
void w_cdata(void)
{
//-----写命令的高4位
LCD7 = lcd_buff7;
LCD6 = lcd_buff6;
LCD5 = lcd_buff5;
LCD4 = lcd_buff4;
LCM_E = 1;
_nop_();
LCM_E = 0;
_nop_();
_nop_();
//-----写命令的低4位
LCD7 = lcd_buff3;
LCD6 = lcd_buff2;
LCD5 = lcd_buff1;
LCD4 = lcd_buff0;
LCM_E = 1;
_nop_();
LCM_E = 0;
}
/******************************************************************************************
* 函数名称 :LCD_cls
* 功能描述 :LCM清屏
*******************************************************************************************/
void LCD_cls(void)
{
w_com(0x01); //清屏
}
#endif
以下是C51 模块化 DELAY.H 函数程序
/*--------------------------------------------------------------------------
DELAY.H
延时函数 头文件
--------------------------------------------------------------------------*/
#ifndef __DELAY_H__
#define __DELAY_H__
#define uchar unsigned char
#define uint unsigned int
//------函数(声明)--------------------------------
void Delay400Ms(void); //延时400mS函数(子程序)
/******************************************************************************************
* 函数名称 :Delay400Ms
* 功能描述 :400ms延时
******************************************************************************************/
void Delay400Ms(void)
{
uchar TempCycA = 30; //1周期MPU用30, 12周期MPU用5
uint TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
#endif
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4