加入收藏 | 设为首页 | 会员中心 | RSS
您当前的位置:首页 > 文章中心 > 单 片 机 > 51单片机

1602液晶显示程序

时间:2008-08-03 09:34:58  来源:  作者: 点击:80

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

** 1602A液晶屏驱动程序

** 晶 振  频 率:11.0592M

** 线路->单片机实验开发板A->中国电子进修网

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

/*作者:站长
/**********************************************/
uchar LCM_ReadData(void)
{LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);}
/*****************1602A读状态函数******************/
/*函数原型:uchar LCM_ReadData(void)
/*函数功能:1602A读状态
/*输入参数:无
/*输出参数:1602A返回的状态
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/***********************************/
uchar LCM_ReadStatus(void)
  { LCM_Data = 0xFF;
      LCM_RS = 0;
      LCM_RW = 1;
      LCM_E = 0;
      LCM_E = 0;
      LCM_E = 1;
      while (LCM_Data & 0x80);//检测忙信号
      return(LCM_Data);
  }
/*****************1602A初始化函数***************/
/*函数原型:void LCM_Init(void)
/*函数功能:1602A初始化
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**************************************/
void LCM_Init(void){LCM_Data = 0;
LCM_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号
Delay5Ms();
LCM_WriteCommand(0x38,0);
Delay5Ms();
LCM_WriteCommand(0x38,0);
Delay5Ms();
LCM_WriteCommand(0x38,1);//显示模式设置,开始要求每次检测忙信号
LCM_WriteCommand(0x08,1);//关闭显示
LCM_WriteCommand(0x01,1);//显示清屏
LCM_WriteCommand(0x06,1);// 显示光标移动设置
LCM_WriteCommand(0x0C,1);// 显示开及光标设置}
/*********1602A按指定位置显示一个字符函数***************/
/*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示的字符
/*输出参数:无/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/*******************************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{Y &= 0x1;X &= 0xF;//限制X不能大于15,Y不能大于1
if (Y) X |= 0x40;//当要显示第二行时地址码+0x40;
X |= 0x80;// 算出指令码
LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码
LCM_WriteData(DData);}
/************1602A按指定位置显示一串字符函数**************/
/*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标 Y坐标 要显示字符串的首地址
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/******************************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF;//限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20)//若到达字串尾则退出
{if (X <= 0xF)//X坐标应小于0xF
{DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符
ListLength++;X++;}
  }
}
/************5ms延时函数***************/
/*函数原型:void Delay5Ms(void)
/*函数功能:5ms延时
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
*作者:站长
*************************************/
void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}
/*************400ms延时延时函数**************/
/*函数原型:void Delay400Ms(void)
/*函数功能:400ms延时延时
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/*************************************/
void Delay400Ms(void)
{uchar TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{TempCycB=7269;while(TempCycB--)
  ;}
;}

 

 

2. 汇编语言源程序

 

LCM_RS EQU P3.7 ;//定义接口

LCM_RW EQU P3.6

LCM_E EQU P3.5

 

LCM_DATA EQU P1 ;数据接口

 

ORG 0000H ;从0000H处开始

SJMP MAIN ;跳转到MAIN处

 

ORG 0030H ;主程序从0030H处开始

MAIN: MOV SP,#70H ;堆栈指针指向70H

LCALL INITIAL ;调用启动LCM子程序进行初始化

LCALL CLS ;调用清除LCM子程序

MOV A,#80H ;向A送立即数80H设定显示地址为第一行第一列

LCALL WRITE_COM ;调用写指令到LCM子程序

MOV DPTR,#LINE1 ;将第一行字符串的启始地址送如DPTR中

LCALL DISP ;调用显示字符串到LCM子程序

MOV A,#0C0H ;向A送立即数0C0H设定显示地址为第二行第一列

LCALL WRITE_COM ;调用写指令到LCM子程序

MOV DPTR,#LINE2 ;将第二行字符串的启始地址送如DPTR中

LCALL DISP ;调用显示字符串到LCM子程序

SJMP $ ;程序动态停机

 

LINE1: DB " WWW.52C51.COM ",00H;第一行字符串

LINE2: DB " 1602A ",00H ;第二行字符串

 

INITIAL: MOV A,#38H ;启动LCM子程序

LCALL WRITE_COM

MOV A,#0EH

LCALL WRITE_COM

MOV A,#06H

LCALL WRITE_COM

RET

 

CHECK_BUSY: PUSH ACC ;查询忙碌信号子程序

BUSY_LOOP: CLR LCM_E

SETB LCM_RW

CLR LCM_RS

SETB LCM_E

MOV A,LCM_DATA

CLR LCM_E

JB ACC.7,BUSY_LOOP

POP ACC

LCALL DEL

RET

 

WRITE_COM: LCALL CHECK_BUSY ;写指令到LCM子程序

CLR LCM_E

CLR LCM_RS

CLR LCM_RW

SETB LCM_E

MOV LCM_DATA,A

CLR LCM_E

RET

 

WRITE_DATA: LCALL CHECK_BUSY ;写数据到LCM子程序

CLR LCM_E

SETB LCM_RS

CLR LCM_RW

SETB LCM_E

MOV LCM_DATA,A

CLR LCM_E

RET

 

CLS: MOV A,#01H ;清除LCM子程序

LCALL WRITE_COM

RET

 

DEL: MOV R6,#5 ;2.7MS延时子程序

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

 

DISP: PUSH ACC ;将A的内容压栈

DISP_LOOP: CLR A ;A清零

MOVC A,@A+DPTR ;查表将字符串内容送入A

JZ END_DISP ;若查到的内容为0则终止查表

LCALL WRITE_DATA ;调用写数据到LCM子程序

INC DPTR ;DPTR加1指向下一个对象

SJMP DISP_LOOP ;跳转到DISP_LOOP循环执行

END_DISP: POP ACC ;弹出压栈内容至A

RET

 

END ;程序结束

来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
音乐程序的设计原理之单片机
音乐程序的设计原理之
FPGA的可编程全数字锁相环路实现
FPGA的可编程全数字锁
单片机音乐演奏
单片机音乐演奏
AVR单片机的ISP下载线
AVR单片机的ISP下载线
相关文章
栏目更新
栏目热门