标题: LCD1604液晶屏的单片机显示程序 [打印本页]

作者: heyanrog    时间: 2017-5-30 14:32
标题: LCD1604液晶屏的单片机显示程序
lcd1604显示程序51单片机驱动,lcd1604和lcd1602操作是一样的,就是多了两行显示,也就多了2个显示地址;LCD1602行地址为80H,C0H
LCD1604行地址为80H,C0H,90H,D0H

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):


单片机源程序:
#include <AT89X52.H>

#define lcd_data  P0
sbit rs=P2^0;      //寄存器类型选择位
sbit rw=P2^1;      //数据读写类型控制位
sbit e=P2^2;       //下降沿使能控制位
sbit flag=ACC^7;   //LCD忙状态判断标志位
void wait(void);
void delay(unsigned int temp);
void initial(void);
unsigned char code seg[]={0x43,0x68,0x69,0x6E,0x61,0x20,0x55,0x6E,0x69,0x76,    //China University of Mining and
                            0x65,0x72,0x73,0x69,0x74,0x79,0x20,0x6F,0x66,0x20,  //Techlonogy    17--302
                                                                         0x4D,0x69,0x6E,0x69,0x6E,0x67,0x20,0x61,0x6E,0x64,
                                                                         0x20,0x20,0x54,0x65,0x63,0x68,0x6C,0x6F,0x6E,0x6F,0x67,
                                                                         0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5C,0x5C,
                                                                         0x31,0x37,0x2D,0x2D,0x33,0x30,0x32,0x5C,0x5C,0x20,0x20,0x20};
void main(void){
      unsigned char data_index;
           unsigned char add_first,add_second,add_third,add_fourth;     //LCD行地址为80H,C0H,90H,D0H
      initial();        //初始化LCD
      while(1){     
                               data_index=0;add_first=0x80;add_second=0xC0;add_third=0x90;add_fourth=0xD0;
                               while(data_index<=15){   
                              rs=0;rw=0;lcd_data=add_first+data_index;e=1;e=0;    //第一行显示
                                                                 wait();
                                                                 rs=1;rw=0;lcd_data=seg[data_index];e=1;e=0;
                                                                 wait();        
                                                                  data_index++;
                                   }
                                                  while(data_index<=31){                           //第二行显示
                              rs=0;rw=0;lcd_data=add_second+data_index-16;e=1;e=0;
                                                                 wait();
                                                                 rs=1;rw=0;lcd_data=seg[data_index];e=1;e=0;
                                                                 wait();
                                                                  data_index++;
                                   }
                                                  while(data_index<=47){                          //第三行显示
                              rs=0;rw=0;lcd_data=add_third+data_index-32;e=1;e=0;
                                                                 wait();
                                                                 rs=1;rw=0;lcd_data=seg[data_index];e=1;e=0;
                                                                 wait();        
                                                                  data_index++;
                                   }
                                                  while(data_index<=63){                        //第四行显示
                              rs=0;rw=0;lcd_data=add_fourth+data_index-48;e=1;e=0;
                                                                 wait();
                                                                 rs=1;rw=0;lcd_data=seg[data_index];e=1;e=0;
                                                                 wait();        
                                                                  data_index++;
                                   }
          }
}
void initial(void){
           rs=0;rw=0;lcd_data=0x38;   //置功能,8位数据位,2行显示,5×7点阵
                          e=1; e=0;wait();
                          rs=0;rw=0;lcd_data=0x06;   //地址计数器自动加1,显示屏不移动
                          e=1;e=0;wait();
                          rs=0;rw=0;lcd_data=0x0c;   //显示开,光标显示,光标闪烁
                          e=1;e=0;wait();
                          rs=0;rw=0;lcd_data=0x01;   //清显示,光标复位到00H
                          e=1;e=0;wait();
}
void wait(void){                   //判断LCD处于空闲状态
             do{
                  rs=0;rw=1;
                  e=1;
                                                e=0;delay(0);
                  P0_7=1;flag=P0_7;
               }while(flag==0);

}
void delay(unsigned int temp){
      unsigned int jj;
                for(jj=0;jj<=temp;jj++)
                ;
}


下载:
LCD1604.zip (258.92 KB, 下载次数: 119)

作者: yulin3192    时间: 2018-4-2 20:05
一不小心点了下载
555555
作者: Qwe54088    时间: 2018-4-20 08:39
下载下来的不是完整的?
作者: qwerdfdf    时间: 2018-6-3 20:35

一不小心点了下载
作者: 1160440028    时间: 2018-7-2 14:29
只能显示第一行和第三行,不知道什么原因。

作者: 小太太    时间: 2018-10-15 10:14
请问能四行显示中文吗
作者: myous    时间: 2018-11-21 12:20
新手下载来学习一下,谢谢!
作者: IdeaMing    时间: 2021-6-15 16:02
1160440028 发表于 2018-7-2 14:29
只能显示第一行和第三行,不知道什么原因。

我测试也是只显示1和3两行




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1