微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STC89C52单片机1602液晶驱动

STC89C52单片机1602液晶驱动

时间:11-21 来源:互联网 点击:
/////////////////////////////////////////////////////////////////////////

实现功能: 驱动开发板上的1602液晶,在1602液晶上显示两组字符,所显示的两
组字符一两秒钟的时间来回循环
实验板型号:BS-XYD-C52
实验名称: 1602液晶显示实验
编写人: 谢应东
编写日期: 2012-5-2
/////////////////////////////////////////////////////////////////////////
#include
#include
#include

#define uchar unsigned char //定义unsigned char 为 uchar
#define uint unsigned int//定义unsigned int 为 uint

sbit Duan=P2^6;//定义数码管的段选使能端
sbit Wei =P2^7; //定义数码管的位选使能端

#define Digital_tube_Wei_Enable Wei=1;//开启控制数码管的位选使能端
#define Digital_tube_Wei_Disable Wei=0; //关闭控制数码管的位选使能端

#define Digital_tube_Duan_Enable Duan=1;//开启控制数码管的段选使能端
#define Digital_tube_Duan_Disable Duan=0;//关闭控制数码管的段选使能端

#define BUSY 0x80 //lcd忙检测标志
#define LCD_DATAPORT P0 //定义P0口为LCD通讯端口

sbit LCD_RS=P3^4; //数据/命令端
sbit LCD_RW=P3^5; //读/写选择端
sbit LCD_EN=P3^6;

uchar code string0[]={"Welcome to KBL"};//第一组字符串当中的顶行
uchar code string1[]={"- Great Embed - "};//第一组字符串当中的底行
uchar code string2[]={"Welcome to KBL "};//第二组字符串当中的顶行
uchar code string3[]={"www.bishenkeji.c"};//第二组字符串当中的底行

void Initial_LCD( void); //LCD初始化子程序
unsigned char ReadStatusLCD(); //LCD检测忙子程序
void WriteCommandLCD(uchar WCLCM,uchar BusyC); //写指令到ICM子函数
void WriteDataLCD(uchar WDLCM); //写数据到LCM子函数
void DisplayOneCharLCD(uchar X,uchar Y,uchar DData); //显示指定坐标的
//一个字符子函数
void DisplayListCharLCD(uchar X,uchar Y,uchar code *DData);//显示指定坐标的
//一串字符子函数
/////////////////////////////////////////////////////////////////////////

函数名称:毫秒延时函数
函数功能:实现毫秒级的延时
参数介绍:Delay_MS: 定义需要延时的毫秒的数值
iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
返回值:
注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
式完成,所以如果改变了晶振的频率,请做相应的改变
/////////////////////////////////////////////////////////////////////////

void DelayMs(uint Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber //用for语句实现单片机的延时
{
iValue=107; //107这个数值是通过测定而得
while(iValue--);
}
}
/////////////////////////////////////////////////////////////////////////
函数名称:WriteCommandLCD
函数功能:根据1602液晶的时序,通过单片机给1602液晶写一些相关的命令
参数介绍:cCommand:要写入的1602液晶命令
cBusy:1602液晶是否空闲的标志
返回值:
注意事项:无
/////////////////////////////////////////////////////////////////////////
void WriteCommandLCD(uchar cCommand,uchar cBusy)
{
if(cBusy)ReadStatusLCD();//检测忙信号
LCD_DATAPORT=cCommand; //要写入的指令
LCD_RS=0; // 选中指令寄存器
LCD_RW=0; // 写模式
LCD_EN=1;// 开启1602液晶使能端
_nop_();// 等待写入指令
_nop_();
_nop_();
LCD_EN=0; // 关闭1602液晶使能端
}
/////////////////////////////////////////////////////////////////////////

函数名称:WriteDataLCD
函数功能:根据1602液晶的时序,通过单片机给1602写入想要写入的数据
参数介绍:cData:要写入1602的数据
返回值:
注意事项:无
/////////////////////////////////////////////////////////////////////////

void WriteDataLCD(uchar cData)
{
ReadStatusLCD();
LCD_DATAPORT=cData;
LCD_RS=1; // 选中数据寄存器
LCD_RW=0; // 写模式
LCD_EN=1; // 打开1602液晶使能端
_nop_(); // 等待写入数据
_nop_();
_nop_();
LCD_EN=0; // 关闭1602液晶使能端
}
/////////////////////////////////////////////////////////////////////////
函数名称:ReadStatusLCD
函数功能:检测液晶是否忙碌
参数介绍:无
返回值: LCD_DATAPORT
注意事项:无
/////////////////////////////////////////////////////////////////////////
unsigned char ReadStatusLCD()
{
LCD_DATAPORT=0xff;
LCD_RS=0;
LCD_RW=1;
LCD_EN=0;
LCD_EN=0;
LCD_EN=1;
while(LCD_DATAPORT&BUSY);
return(LCD_DATAPORT);
}
/////////////////////////////////////////////////////////////////////////
函数名称:Initial_LCD
函数功能:设置单片机的外部中断0和中断1,具体的设置状态都为外部低电平触发,并
且开总中断
参数介绍:无
返回值:
注意事项:无
/////////////////////////////////////////////////////////////////////////
void Initial_LCD()
{

Digital_tube_Wei_Enable;
LCD_DATAPORT=0xff;
Digital_tube_Wei_Disable;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top