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

89C52与LCD1602

发布时间:2020-05-28 发布时间:
|
这两天看了下C51的资料,熟悉一下语句,51的资源都还没看,就急着写了个这程序 ,很生硬的,总算是LCD1602工作并显示起来了,

难点1:时序,难点2:LCD1602的11条指令;

时序对了,LCD1602基本上就能显示了:(LCD1602的老是忙等待,所以把忙等待改成10MS延时程序了);

下面是程序:

//------------------------------------------- 
 #include
 #include

 #define dataport P0
 #define uchar unsigned char
 #define uint unsigned int
 
// sbit RS =P2^4;
// sbit RW =P2^3;
// sbit En =P2^2;
 sbit RS=P2^0;
 sbit RW=P2^1;
 sbit En=P2^2;
 void delay_ms(uchar time)
 {
  uchar i,j;
  for(i=time;i>0;i--)
  {
   for(j=85;j>0;j--)
   {;}
  }
 }
/*/----------------------------------------- 忙等
 void read_bf(void)
 {
  En=0;
  RS=0;
  RW=1;
  dataport=0xff;
  _nop_();
  _nop_();
  _nop_();
  En=1;
  while(dataport&0x80) ;

  En=0;
  }  */
 bit lcd_bf()
 {
   bit result;
  RS=0;
  RW=1;
  En=1;
  _nop_();
  _nop_();
  _nop_();
  result=(bit)(P0&0x80);
  En=0;
  return result;
 }
//-----------------------------------------写命令
  void write_command(uchar command)
  {
  // read_bf();
  // while(lcd_bz());
   delay_ms(10);
  RW=0;
  RS=0;
  En=0;
  _nop_();
  _nop_(); 
  dataport=command;
  _nop_();
  _nop_();
  _nop_();
  En=1;
  _nop_();
  _nop_();
  En=0;
  }
//------------------------------------------写数据
  void write_data(uchar data_)
  {
  // read_bf();
  // while(lcd_bz());
   delay_ms(10);
  RW=0;
  RS=1;
  En=0;
  _nop_();
  _nop_();
  dataport=data_;
  _nop_(); 
  _nop_();
  _nop_();
  En=1;
  _nop_();
  _nop_();
  En=0;
  }
//-------------------------------------------初始化
  void init_lcd(void)
  {      
   delay_ms(15);
   write_command(0x38);
  delay_ms(5);
  write_command(0x38);
  delay_ms(5);
  write_command(0x38);
  
  while(lcd_bf());
  write_command(0x38);  //8位数据双行57
 // while(lcd_bf());
    // write_command(0x08);  //关显示
  while(lcd_bf());
  write_command(0x01);  //清显示
  while(lcd_bf());
  write_command(0x06);
  while(lcd_bf());
  write_command(0x0c);
 
 }

  void lcd_disp(uchar addr,uchar a_data)
  {
   write_command(addr);
  write_data(a_data);
  } 
//-------------------------------------------主函数
  void main()
  {
  // uchar ch[8]= {0x53,0x54,0x43,0x38,0x39,0x43,0x35,0x32};
   uchar ch[6]={"hello!"}  ;
  uchar ch_1[16]={" 1234567890abcde"}  ;
  uchar i,j,k;
  init_lcd();
  for(i=0;i<16;i++)
   lcd_disp(0x80+i,ch[i]) ;
  for(k=0;k<16;k++)
   lcd_disp(0xc0+k,ch_1[k]);

  for (i=0;i<16;i++)
   write_command(0x07) ;
  while(1)
    {
   for(j=0;j<10;j++)
   {
   write_command(0x1c);  //右移
   delay_ms(500);
   }
   delay_ms(500);
   for(k=0;k<10;k++)
   { 
   write_command(0x18);  //左移
   delay_ms(500);
   }
   delay_ms(500);
    }
 }
//-------------------------------------------


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

热门文章 更多
51单片机CO2检测显示程序解析