×
单片机 > 单片机程序设计 > 详情

STC89C52单片机1602液晶驱动

发布时间:2020-08-27 发布时间:
|
/////////////////////////////////////////////////////////////////////////

 实现功能:  驱动开发板上的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;

 Digital_tube_Duan_Enable;
 LCD_DATAPORT=0X00;
 DelayMs(2);
 Digital_tube_Duan_Disable;

 
 LCD_DATAPORT=0; 
 DelayMs(15);
 WriteCommandLCD(0x38,0);    //三次显示模式设置,不检测忙信号
 DelayMs(5);
 WriteCommandLCD(0x38,0);
 DelayMs(5);
 WriteCommandLCD(0x38,0);
 DelayMs(5);
 
 WriteCommandLCD(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
 WriteCommandLCD(0x08,1);    //关闭显示,检测忙信号
 WriteCommandLCD(0x01,1);    //清屏,检测忙信号
 WriteCommandLCD(0x06,1);    //显示光标右移设置,检测忙信号
 WriteCommandLCD(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
}
 /////////////////////////////////////////////////////////////////////////
函数名称:DisplayOneCharLCD
函数功能:按指定位置显示一个字符,比如说数字,英文字母等
参数介绍:cXCoord:要显示字符在某一行当中的位置
       cYCoord:要显示字符在液晶中的行数,比如说第一行或第二行
    cData:  要显示的字符,比如说1、a等
返回值: 
注意事项:限制cXCoord不能大于15,cYCoord不能大于1
 /////////////////////////////////////////////////////////////////////////

void DisplayOneCharLCD(uchar cXCoord,uchar cYCoord,uchar cData)
{
 cYCoord&=1;        //取cYCoord的第一位,其他的全部设置成0      
 if(cYCoord)cXCoord|=0x40;         //若y为1,显示第一行,地址码+0X40
    cXCoord|=0x80;                    //若不为1,则显示第二行,地址码+0X80
 WriteCommandLCD(cXCoord,0);    //把写入的地址送到1602液晶
 WriteDataLCD(cData);     //写入要写入的数据
}
 /////////////////////////////////////////////////////////////////////////

函数名称:DisplayListCharLCD
函数功能:按指定位置显示一串字符,比如说显示 abcdefg,123456等
参数介绍:cXCoord:要显示字符在某一行当中的位置
    cYCoord:要显示字符在液晶中的行数,比如说第一行或第二行
    cData:  要显示的字符串,比如说123456、adcdgd等 
返回值: 
注意事项:制cXCoord不能大于15,cYCoord不能大于1
 /////////////////////////////////////////////////////////////////////////
void DisplayListCharLCD(uchar cXCoord,uchar cYCoord,uchar code *Data)
{
 uchar ListLength=0;  //要显示字符串的长度
 cYCoord&=0x01;   //取cYCoord的第一位,其他的全部设置成0
 cXCoord&=0x0f;
 while(cXCoord<16)     //循环写入要写入的字符串
 {
  DisplayOneCharLCD(cXCoord,cYCoord,Data[ListLength]);
  ListLength++;
  cXCoord++;
 }
}
 /////////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:启动1602液晶,在1602液晶上面循环显示2组字符串
参数介绍:无
返回值: 
注意事项:无
 /////////////////////////////////////////////////////////////////////////
void main()
{
 DelayMs(50);          //延时50ms启动
 Initial_LCD();           //对LCD进行初始化
 while(1)
 {
  DisplayListCharLCD(0,0,string0);//在1602的顶行显示字符串0 
  DisplayListCharLCD(0,1,string1);//在1602的底行显示字符串1
  
  DelayMs(2000);        //延时2s,保留显示字符
  
  DisplayListCharLCD(0,0,string2);//在1602的顶行显示字符串2 
  DisplayListCharLCD(0,1,string3);//在1602的底行显示字符串3
  
  DelayMs(2000);        //延时2s,保留显示字符
 }
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430F5529 上手小例程2