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

1602的51程序

发布时间:2020-06-19 发布时间:
|
#include

#include
#include
#define lcd_bus    P0       //  数据总线
sbit rs =P2^4;                    //  数据&指令选择,H:写数据,L:写指令
sbit rw =P2^3;                   //  读&写选择,H:read,L:write
sbit e  =P2^2;                   //  读写使能
sbit bf =P0^7;                   //  忙闲状态标志位,H:内部正执行操作,L:空闲
void chk_busy(void);       //  检测LCD忙闲
void init_lcd(void);           //  LCD初始化
void wr_comm(unsigned char comm);             // 写指令
void wr_comm_no(unsigned char comm);      // 写指令,不检测忙闲
void wr_data(unsigned char dat);                     // 写数据
void wr_str(unsigned char *p);                          // 显示字符串
unsigned char rd_lcd(void);                              // 读LCD数据
void delayus(unsigned char us);                      // 延时子程序 us
void delayms(unsigned int ms);                       // 延时子程序 ms

void main()
{
  delayms(200);
  init_lcd();                 //  LCD初始化
  wr_comm(0x80);    //  第一行第一个字符地址
  wr_str("lcd1602");
  wr_comm(0xc0);   //  第二行第一个字符地址
  wr_str("Tai shan Dizn Zi");
  while(1);
}
/*------------------LCD初始化-----------------*/
void init_lcd(void)
{
  wr_comm_no(0x38);  //  不检测忙闲
  delayms(5);
  wr_comm_no(0x38);
  delayms(5);
  wr_comm_no(0x38);
  delayms(5);
  wr_comm_no(0x38);
  delayms(5);
  wr_comm(0x38);  //  设定LCD为16*2显示,5*7点阵,8位数据接口,检测忙信号
  delayus(3);            //  延时11us
  wr_comm(0x08);  //  关闭显示,检测忙信号
  delayus(3);
  wr_comm(0x01);  //  显示清屏,检测忙信号
  delayus(3);
  wr_comm(0x06);  //  显示光标自动右移,整屏不移动,检测忙信号
  delayus(3);
  wr_comm(0x0c);  //  开显示,不显示光标,检测忙信号
  delayus(3);
}
/*--------------检测LCD忙闲---------------*/
void chk_busy(void)
{
  lcd_bus=0xff;
  rs=0;
  rw=1;
  ;
  e=1;
  while(bf==1);
  e=0;
}
/*------------写命令到LCD--------------*/
void wr_comm(unsigned char comm)
{
  chk_busy();
  rs=0;                     //  H:写数据,L:写指令
  rw=0;
  e=0;
  ;
  lcd_bus=comm;   //  内容
  delayus(3);
  e=1;
  ;
  e=0;
}
/*------------写命令到LCD不检测忙闲--------------*/
void wr_comm_no(unsigned char comm)
{
  rs=0;                       //  H:写数据,L:写指令
  rw=0;
  e=0;
  ;
  lcd_bus=comm;    //  内容
  delayus(3);
  e=1;
  ;
  e=0;
}
/*------------写数据到LCD--------------*/
void wr_data(unsigned char dat)
{
  chk_busy();
  rs=1;                       //  H:写数据,L:写指令
  rw=0;
  e=0;
  ;
  lcd_bus=dat;         //  内容
  delayus(3);
  e=1;
  ;
  e=0;
}
/*--------------读LCD数据---------------*/
unsigned char rd_lcd(void)
{
  unsigned char rd_data;
  chk_busy();                       //  检测忙闲
  rs=1;
  rw=1;
  e=1;
  ;
  rd_data=lcd_bus;
  e=0;
  return rd_data;
}
/*-------------写字符串----------------*/
void wr_str(unsigned char *s)
{
   while(*s>0)            //  字符串以0结束
   {
      wr_data(*s);
      s++;
   }
}
/*---------------延时子程序us----------------*/
void delayus(unsigned char us)
{
  while(--us);  // 一个循环2us
}
/*---------------ms延时子程序----------------*/
void delayms(unsigned int ms)  //延时 n ms
{
  while(ms)
  {
  int i;
  i=110;
  while(i--);
  ms=ms-1;
  }
}

关键字:1602  51程序 

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

热门文章 更多
51单片机中断源的扩展方法