LCD1602显示程序理解

  1 /*2018年8月11日 18点30分,于福安公寓
  2 功能:LCD1602显示程序*/
  3 #include<reg52.h>
  4 #define uchar unsigned char
  5 #define uint unsigned int
  6 uchar code table[] ="zhangshuaishuai";
  7 uchar code table1[] ="ce shi cheng xu";
  8 sbit lcdrw =P2^5;
  9 sbit lcdrs =P2^6;
 10 sbit lcde =P2^7;
 11 void delay(uchar x)
 12 {
 13     uchar i,j;
 14     for(i=x;i>0;i--)
 15         for(j=110;j>0;j--);
 16 }
 17 //显示程序的位置
 18 /*void lcd_display_char(uchar x,uchar y,uchar date)
 19 {
 20     uchar address;
 21     if(y ==1)
 22         address =0x80+x;
 23     else
 24         address =0xc0+x;
 25 }
 26 */
 27 /*写指令函数*/
 28 void lcd_write_cmd(uchar com)
 29 {
 30     lcdrs =0; //指令
 31     P0 = com;
 32     delay(1);
 33     lcdrw =0;//写有效
 34     lcde =1;  //由时序图可知,当lcde为高电平之前就必须要将数据输入进去,故而P0 = com;这句指令在其前面
 35     delay(1);
 36     lcde =0;
 37 
 38 }
 39 /*写数据函数*/
 40 void lcd_write_data(uchar date)
 41 {
 42     P0 =date;
 43     lcdrs =1;
 44     delay(1);
 45     lcdrw =0;
 46     lcde =1;
 47     delay(1);
 48     lcde =0;
 49 
 50 }
 51 // 函数初始化
 52 void init()
 53 {
 54     lcd_write_cmd(0x38);//设置8位格式;2行,5*7
 55     lcd_write_cmd(0x0c);//整体显示,关光标,不闪烁
 56 //    lcd_write_cmd(0x01); //清除屏幕显示
 57     lcd_write_cmd(0x06);//设定输入方式,增量不移位
 58 
 59     delay(1);
 60 }
 61 void main()
 62 {
 63     uchar i,j,num;
 64     init();
 65 
 66 /*    lcd_write_data(0x41);
 67     lcd_write_data('B');
 68     lcd_write_data('C');
 69     while(1);  //当这里没有while(1);暂停语句时,就会出现满屏的数据 ;当输入多个字符时,比如'B','C'如上面,就会面屏出现同样的数据,并且在这几个字符中轮流变化
 70 */
 71 
 72     lcd_write_cmd(0x80+0x13);  //确定刚开始写入第一行数据的位置
 73     for(i =0;i<15;i++)     //如果没有确定要显示的位置,LCd显示屏默认就会从第一个字符开始
 74     {
 75 //    lcd_display_char(0,0,table[i])
 76 
 77     lcd_write_data(table[i]);
 78         delay(100);
 79 
 80 //    while(1);  //如果在此处加上while(1)暂停语句时,就只会出现z这一个字符
 81     }
 82 //    lcd_write_cmd(0x01);  //  清屏指令   让上面的字符显示之后,再清屏   
 83 //    delay(1000);        //如果没有这个延时程序,那么下面显示的位置就不在你所设定的位置,会跑到第一行
 84              
 85     lcd_write_cmd(0x80+0x53);  //确定了下面要显示内容的位置     确定刚开始写入数据的位置
 86 
 87         for(j =0;j<15;j++)
 88         {
 89         lcd_write_data(table1[j]);
 90         delay(100);       //动态显示让其延时,相当于
 91         }
 92 
 93 
 94 /*用于整屏向左移动的程序    由于是整个屏幕的向左移动,故而在将其所有要显示的
 95 内容全部显示到不可见区域,然后统一按照移动屏幕的指令整体移动,每次移动也只移动一位*/
 96         for(num =0;num<18;num++)
 97         { 
 98             lcd_write_cmd(0x18);  //表示显示整屏向左移动
 99             delay(1000);        //    每个100ms移动一位
100         }
101 
102         while(1); //如果在此处加上while(1)暂停语句时,会正常显示字符
103 
104 }
View Code
原文地址:https://www.cnblogs.com/wises/p/9539572.html