请教LCD编程 点击:569 | 回复:3



魔杰彬1

    
  • 精华:0帖
  • 求助:5帖
  • 帖子:5帖 | 22回
  • 年度积分:0
  • 历史总积分:181
  • 注册:2012年10月29日
发表于:2013-02-26 19:47:48
楼主
怎么用89C51让它显示字符啊?最好用C语言!



研讨会宣传员_3259

  • [版主]
  • 精华:3帖
  • 求助:110帖
  • 帖子:1927帖 | 14403回
  • 年度积分:102
  • 历史总积分:64749
  • 注册:2020年3月27日
发表于:2013-03-11 15:59:54
1楼

LM020L,HD44780。proteus仿LM020L,使PIC,C

//RS,RW,E分别接RE0,RE1,RE2;D7-D0接RD口


#include <pic.h>    /*头文件*/
#define  LCD_RS  RE0  /*定义引脚*/
#define  LCD_RW  RE1
#define  LCD_E   RE2
#define  Busy    RD7

void WR_COMM();
void DISPLY();
void CHECK_BF();
void PLAY_LCD();                /*函数声明*/
void DELAY();

#define Data PORTD  // 数据IO口

 main()
{
         
                TRISE=0X00;
    PLAY_LCD();         /*LCD初始化子程序*/
  CHECK_BF();     //判断液晶模块是否忙?
    Data=‘O‘;    /* 将需要显示的数据送入LCD */
    DISPLY();           /*调用显示执行子程序 显示字母 " O " */
  CHECK_BF();     //判断液晶模块是否忙?
    Data=‘N‘;   /* 将需要显示的数据送入LCD */
    DISPLY();           /*调用显示执行子程序 显示字母 " N " */
  CHECK_BF();     //判断液晶模块是否忙?
    Data=‘1‘;   /* 将需要显示的数据送入LCD */
    DISPLY();           /*调用显示执行子程序 显示数字 " 1 " */
  CHECK_BF();     //判断液晶模块是否忙?
    Data=‘2‘;   /* 将需要显示的数据送入LCD */
    DISPLY();           /*调用显示执行子程序 显示数字 " 2 " */
  while(1);           /*无限循环 */
 
} /*主程序结束时的括号*/

/*..................LCD子函数...........................*/

void PLAY_LCD()           //LCD初始化子程序
  {
        CHECK_BF();
        Data=0x01;            //00000001B 清屏并光标复位
   WR_COMM();            //调用写入命令子程序
 CHECK_BF();
  Data=0x30;            //00110000B 设置:8位总线、1行、5x7点阵方式
   WR_COMM();            //调用写入命令子程序
 CHECK_BF();
   Data=0x0F;            //00001111B 显示器开、光标开、光标允许闪烁
   WR_COMM();            //调用写入命令子程序
 CHECK_BF();
   Data=0x14;            //00010100B 文字不动,光标自动右移
   WR_COMM();            //调用写入命令子程序
 CHECK_BF();
   Data=0x00;            //H 写入显示起始地址(第1行第1个位置)
   WR_COMM();            //调用写入命令子程序
  }

void  WR_COMM()              /*写入命令子程序*/
    {  
 LCD_RS=0;            //写入控制命令的子程序
        LCD_RW=0;
 LCD_E=1;        //E=0 执行显示命令
DELAY();
        LCD_E=0;
DELAY();
     
    }

void  CHECK_BF()             /*判断LCD是否忙碌子程序*/
    {   loop:
        TRISD=0XFF;
       LCD_RS=0;

      LCD_RW=1;
        LCD_E=0;
        LCD_E=0;            //相当于NOP
        LCD_E=1;
        if(Busy==1) goto loop;      //如果P1.7为高电平表示忙就循环等待
             DELAY();
              TRISD=0X00;
    }

void DISPLY()   //显示执行子程序
 {
   LCD_RS=1;       //RS=1
   LCD_RW=0;       //RW=0 准备写入数据
   LCD_E=1;        //E=0 执行显示命令
DELAY();
   LCD_E=0;        //E=1 ;显示完成,程序停车
DELAY();
 }
void  DELAY()
{ int i;
  for(i=10;--i;)continue;
 
}

研讨会宣传员_3259

  • [版主]
  • 精华:3帖
  • 求助:110帖
  • 帖子:1927帖 | 14403回
  • 年度积分:102
  • 历史总积分:64749
  • 注册:2020年3月27日
发表于:2013-03-11 16:07:58
2楼

魔杰彬1

  • 精华:0帖
  • 求助:5帖
  • 帖子:5帖 | 22回
  • 年度积分:0
  • 历史总积分:181
  • 注册:2012年10月29日
发表于:2013-03-11 16:14:59
3楼
回复内容:
对:研讨会宣传员_3259关于LM020L是一款通用的字符液晶显示器,其驱动控制器为HD44780。这里是我在proteus上仿真通过的LM020L液晶驱动程序,使用PIC单片机,C语言编程//RS,RW,E分别接RE0,RE1,RE2;D7-D0接RD口#include     /*头文件*/#define  LCD_RS  RE0  /*定义引脚*/#define  LCD_RW  RE1#define  LCD_E   RE2#define  Busy    RD7void WR_COMM();void DISPLY();void CHECK_BF(); void PLAY_LCD();                /*函数声明*/void DELAY();#define Data PORTD  // 数据IO口  main(){                           TRISE=0X00;    PLAY_LCD();         /*LCD初始化子程序*/  CHECK_BF();     //判断液晶模块是否忙?    Data=‘O‘;    /* 将需要显示的数据送入LCD */    DISPLY();           /*调用显示执行子程序 显示字母 " O " */   CHECK_BF();     //判断液晶模块是否忙?    Data=‘N‘;   /* 将需要显示的数据送入LCD */    DISPLY();           /*调用显示执行子程序 显示字母 " N " */  CHECK_BF();     //判断液晶模块是否忙?    Data=‘1‘;   /* 将需要显示的数据送入LCD */    DISPLY();           /*调用显示执行子程序 显示数字 " 1 " */   CHECK_BF();     //判断液晶模块是否忙?    Data=‘2‘;   /* 将需要显示的数据送入LCD */    DISPLY();           /*调用显示执行子程序 显示数字 " 2 " */   while(1);           /*无限循环 */ } /*主程序结束时的括号*//*..................LCD子函数...........................*/void PLAY_LCD()           //LCD初始化子程序  {         CHECK_BF();        Data=0x01;            //00000001B 清屏并光标复位   WR_COMM();            //调用写入命令子程序  CHECK_BF();  Data=0x30;            //00110000B 设置:8位总线、1行、5x7点阵方式    WR_COMM();            //调用写入命令子程序 CHECK_BF();    Data=0x0F;            //00001111B 显示器开、光标开、光标允许闪烁   WR_COMM();            //调用写入命令子程序 CHECK_BF();   Data=0x14;            //00010100B 文字不动,光标自动右移    WR_COMM();            //调用写入命令子程序 CHECK_BF();   Data=0x00;            //H 写入显示起始地址(第1行第1个位置)   WR_COMM();            //调用写入命令子程序  }void  WR_COMM()              /*写入命令子程序*/    {    LCD_RS=0;            //写入控制命令的子程序        LCD_RW=0; LCD_E=1;        //E=0 执行显示命令DELAY();        LCD_E=0;DELAY();          }void  CHECK_BF()             /*判断LCD是否忙碌子程序*/    {   loop:        TRISD=0XFF;       LCD_RS=0;       LCD_RW=1;        LCD_E=0;        LCD_E=0;            //相当于NOP        LCD_E=1;         if(Busy==1) goto loop;      //如果P1.7为高电平表示忙就循环等待              DELAY();              TRISD=0X00;    }void DISPLY()   //显示执行子程序 {   LCD_RS=1;       //RS=1    LCD_RW=0;       //RW=0 准备写入数据   LCD_E=1;        //E=0 执行显示命令DELAY();   LCD_E=0;        //E=1 ;显示完成,程序停车DELAY(); }void  DELAY(){ int i;  for(i=10;--i;)continue;  }内容的回复:

多谢!DELAY函数挺有个性的

热门招聘
相关主题

官方公众号

智造工程师