乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      LCD1602液晶使用介紹

       新用戶84005529 2022-10-28 發(fā)布于四川

      大家好,又見面了,我是你們的朋友全棧君。

      lcd1602 +c51 介紹

      文章目錄

      LCD1602介紹

      LCD1602液晶在實際的產(chǎn)品運用中也是比較多產(chǎn)品,應為前一段時間也正好用到了,所以今天就對LCD1602液晶做一個總結,方便以后閱讀同時也希望能夠幫住到需要的人,總結的可能存在錯誤歡迎指出!

      所謂的1602是指顯示的時候,有2行內(nèi)容每行有16個字符。其實這類字符型產(chǎn)品都可以這樣解讀比如:lcd12864就是有128行64列。目前市面上字符液晶大多數(shù)是基于HD44780液晶芯片的,控制原理大多相同。因此基于HD44780寫的液晶控制程序可以很方便適用于市面上大多數(shù)字符型液晶產(chǎn)品。

      1602引腳信號說明

      字符型LCD1602通常分為14條引腳和16引腳兩種,16引腳多出來的是背光電源線VCC(15引腳)和地線(16引腳),其控制原理與14引腳LCD完全一樣,引腳定義如下表:

      引腳號

      引腳名

      電平

      輸入/輸出

      作用

      1

      Vss

      電源地

      2

      Vcc

      電源(+5V)

      3

      Vee

      對比調(diào)整電壓

      4

      RS

      0/1

      輸入

      0=輸入指令;1=輸出數(shù)據(jù)

      5

      R/W

      0/1

      輸入

      0=向LCD寫入指令或數(shù)據(jù); 1=從LCD讀取信息

      6

      E

      1,1->0

      輸入

      使能信號,1時讀取信息,1->0(下降沿)執(zhí)行指令

      7

      DB0

      0/1

      輸入/輸出

      數(shù)據(jù)總線line0(最低位)

      8

      DB1

      0/1

      輸入/輸出

      數(shù)據(jù)總線line1

      9

      DB2

      0/1

      輸入/輸出

      數(shù)據(jù)總線line2

      10

      DB3

      0/1

      輸入/輸出

      數(shù)據(jù)總線line3

      11

      DB4

      0/1

      輸入/輸出

      數(shù)據(jù)總線line4

      12

      DB5

      0/1

      輸入/輸出

      數(shù)據(jù)總線line5

      13

      DB6

      0/1

      輸入/輸出

      數(shù)據(jù)總線line6

      14

      DB7

      0/1

      輸入/輸出

      數(shù)據(jù)總線line7

      15

      A

      +Vcc

      LCD背光燈源正極

      16

      K

      接地

      LCD背光燈源負極

      控制器接口介紹

      1、基本操作時許

      • 1.1讀狀態(tài):輸入:RS=L,RW=H,E=H —-輸出:D0~D7=狀態(tài)字
      • 1.2寫指令:輸入:RS=L,RW=L,D0~D7=指令碼 —-輸出:無
      • 1.3讀數(shù)據(jù):輸入:RS=H,RW=H,E=H —-輸出:D0~D7=數(shù)據(jù)
      • 1.4寫數(shù)據(jù):輸入:RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖 —-輸出:無

      2、狀態(tài)字說明

      STA7 D7

      STA6 D6

      STA5 D5

      STA4 D4

      STA3 D3

      STA2 D2

      STA1 D1

      STA0 D0

      STA0-6

      當前數(shù)據(jù)地址指針的數(shù)值

      STA7

      讀寫操作使能

      1:禁止 0:允許

      對控制器每次進行讀寫操作前,都必須進行讀寫檢測,確保STA7為0

      3、指令說明

      初始化設置 顯示模式設置

      顯示開/關光標設置

      數(shù)據(jù)控制 控制器內(nèi)部沒有一個數(shù)據(jù)地址指針,可以通過他們來訪問內(nèi)部的全部80字節(jié)RAM。 其他設置

      指令碼

      功能

      01H

      顯示清屏:1.數(shù)據(jù)指針清零 2.所有顯示清零

      02H

      顯示回車:1.數(shù)據(jù)指針清零

      初始化過程:

      延時 寫指令38H 延時 寫指令38H 延時 寫指令38H (每次寫指令、讀/寫數(shù)據(jù)操作之前均需檢測信號) 寫指令38H:顯示模式設置 寫指令08H:顯示關閉 寫指令01H:顯示清屏 寫指令06H:顯示光標移動設置 寫指令0CH:顯示開及光標設置

      代碼:

      void LcdInit(){ 
         //LCD初始化程序
      Delay1ms(15);
      LcdWriteCom(0x38);
      Delay1ms(5);
      LcdWriteCom(0x38);
      Delay1ms(5);
      LcdWriteCom(0x38);//設置顯示模式
      LcdWriteCom(0x0C);//開顯示不顯示光標,光標不閃爍
      LcdWriteCom(0x06);//寫一個數(shù)據(jù),指針加1
      LcdWriteCom(0x01);//清屏
      LcdWriteCom(0x80);//設置數(shù)據(jù)指針起點。
      }

      RAM地址映射

      HD44780內(nèi)置DDRAM、CGROM和CGRAM。 DDRAM就是顯示數(shù)據(jù)RAM,用來寄存待顯示的字符代碼。共80個字節(jié),地址和屏幕的對應關系如下:

      顯示位置

      1

      2

      3

      4

      5

      6

      7

      … …

      40

      第一行

      00H

      01H

      02H

      03H

      04H

      05H

      06H

      … …

      27H

      第二行

      40H

      41H

      42H

      43H

      44H

      45H

      46H

      … …

      67H

      也就是說想要在LCD1602屏幕上的第一行第一個位置顯示一個“A”,就要向DDRAM的00H地址寫“A”字的代碼就OK了,但具體的寫入是要按照LCD模塊的指令格式來進行的。 但是我們發(fā)現(xiàn)每一行有40個地址,而我們們每行只能顯示16個字符,其實際多的位置可以實現(xiàn)字符的移動,我們在看大佬作品的時候可能會見到有的字符是從左面移過來,他的實現(xiàn)形式就用到了著些多的地址。將數(shù)據(jù)先寫到未顯示的地址然后使用指令進行左移就可以了。 那么1602顯示的地址又是什么吶?下圖就是DDRAM地址與現(xiàn)實位置的對應關系。

      控制時序圖

      1、讀操作時序圖:

      2、寫操作時序圖:

      3、時序參數(shù)

      代碼實現(xiàn)

      LCDE = E //使能信號

      寫入命令

      RS=L,RW=L,D0~D7=指令碼,E=高脈沖。

      void LcdWriteCom(unsigned char com){ //寫入命令 RS = 0; RW = 0; GPIO_LCD=com; Delay1ms(10); LCDE = 1; //給一個高脈沖 Delay1ms(10); LCDE = 0; }

      寫數(shù)據(jù)

      RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖。

      void LcdWriteData(unsigned char dat){ 
         //寫入數(shù)據(jù)
      	RS = 1;
      	RW = 0;
      	GPIO_LCD=dat;
      	Delay1ms(10);
      	LCDE = 1; //給一個高脈沖
      	Delay1ms(10);
      	LCDE = 0;

      試驗例程

      main.c文件

      #include<reg52.h> #include'lcd.h' unsigned char CnCh[] = '012345678912345'; unsigned char CnCh1[] = 'ABCDEFGIJKLMNOP'; unsigned char i,a =0,j,n; unsigned char code Data_1[]=' I Love You '; // 第一行顯示,共十六個字符 unsigned char code Data_2[]='Good Good Study,Day Day Up !'; // 第二行顯示,共28個字符 unsigned char i; void main(){ lcd_Init(); lcd_write_com(0x80); for(i = 0;i<16;i++){ lcd_read_busy(); lcd_write_dat(CnCh[i]); } lcd_write_com(0xc0); for(i = 0;i<16;i++){ lcd_read_busy(); lcd_write_dat(CnCh1[i]); } while(1); } void zimo(){ unsigned char code Data_0[]={ 0x0f, 0x12, 0x0f, 0x0a, 0x1f, 0x02, 0x02, 0x02}; // 漢字 年 的字模 unsigned char code Data_1[]={ 0x0f, 0x09, 0x0f, 0x09, 0x0f, 0x09, 0x0b, 0x11}; // 漢字 月 的字模 unsigned char code Data_2[]={ 0x1f, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x1f, 0x00}; // 漢字 日 的字模 lcd_Init(); // LCD1602 初始化 lcd_write_com(0x40); // 0100 0000; 指令 0x40 向 CGRAM 地址0 寫入自定義數(shù)據(jù) for(i=0; i<8; i++){ lcd_write_dat(Data_0[i]); // 寫入自定義字符字模 } lcd_write_com(0x48); // 0100 1000; 指令 0x48 向 CGRAM 地址1 寫入自定義數(shù)據(jù) for(i=0; i<8; i++){ lcd_write_dat(Data_1[i]); // 寫入自定義字符字模 } lcd_write_com(0x50); // 0101 0000; 指令 0x50 向 CGRAM 地址2 寫入自定義數(shù)據(jù) for(i=0; i<8; i++){ lcd_write_dat(Data_2[i]); // 寫入自定義字符字模 } lcd_write_com(0x00 + 0x80); // 在第一行第一列顯示 第一個字符 lcd_write_dat(0); lcd_write_com(0x02 + 0x80); // 在第一行第三列顯示 第二個字符 lcd_write_dat(1); lcd_write_com(0x04 + 0x80); // 在第一行第五列顯示 第一個字符 lcd_write_dat(2); while(1); /* //分割線******************************************************************* unsigned char table[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A}; lcd_Init(); lcd_write_com(0x40); for(i=0;i<8;i++){ lcd_write_dat(table[i]); } lcd_write_com(0x80); lcd_write_dat(0x00); while(1); */ } //單行移動顯示************************************************************** void dh(){ lcd_Init(); lcd_write_com(0x80); // 第一行第一列地址 for(i=0; i<16; i++){ lcd_write_dat(Data_1[i]); // 顯示第一行 } while(1){ lcd_read_busy(); lcd_write_com(0xc0); // 第二行第一列地址 for(j=n; j<28+n; j++){ lcd_write_dat(Data_2[j]); // 顯示第二行 } n++; if(n >= (28-15)){ // 當數(shù)據(jù)移動到最后時,n 重置 0,停頓 500 ms,重新開始移動顯示 n = 0; delay1ms(50); } delay1ms(20); // 控制移動速度 } }

      lcd.c文件

      #include'lcd.h'
      
      void delay1ms(unsigned char d)   //誤差 0us
      { 
         
          unsigned char a,b,c;
          for(c=0;c<d;c++)
              for(b=142;b>0;b--)
                  for(a=2;a>0;a--);
      }
      
      void lcd_Init(){ 
         
      	lcd_write_com(0x38);
      	delay1ms(1);
      	lcd_write_com(0x38);	//設置顯示模式
      	lcd_write_com(0x0c);	//開顯示不顯示貫標
      	lcd_write_com(0x06);	//指針自動加一
      	lcd_write_com(0x01);	//清屏
      	lcd_write_com(0x80);	//設置數(shù)據(jù)指針起點
      }
      
      void lcd_write_com(unsigned char com){ 
         
      	RS = 0;
      	RW = 0;
      	E = 0;
      	
      	P0 = com;
      	delay1ms(10);
      	E = 1;
      	delay1ms(10);
      	E = 0;
      }
      
      void lcd_write_dat(unsigned char dat){ 
         
      	RS = 1;
      	RW = 0;
      	E = 0;
      	
      	P0 = dat;
      	delay1ms(10);
      	E = 1;
      	delay1ms(10);
      	E = 0; 
      }
      
      
      void lcd_xy(unsigned char x,unsigned char y){ 
         
      	lcd_write_com(x+y);
      }
      
      void lcd_read_busy(){ 
         
      	unsigned char he,a;
      	RS = 0;
      	RW = 1;
      	E = 1;
      	he = P0;
      	while(1){ 
         
      		he = P0;
      		E = 0;
      		if(!(he&0x80))//當he&0x80為0時跳出循環(huán),表明不忙。
      			break;
      		E = 1;
      		a++;
      		if(a>=10)
      			break;
      	}
      }

      lcd.h文件

      #ifndef __LCD_H_ #define __LCD_H_ #include<reg52.h> sbit RS = P2^0; sbit RW = P2^1; sbit E = P2^2; void delay1ms(unsigned char d); //延時函數(shù) void lcd_Init(); //初始化 void lcd_write_com(unsigned char com); //寫指令 void lcd_write_dat(unsigned char dat); //寫數(shù)據(jù) void lcd_xy(unsigned char x,unsigned char y); //寫位置 void lcd_read_busy(); //檢測標志位 #endif

      CGRAM自定義字模(簡易漢字顯示)

      這里說明一下lcd1602液晶是不能顯示漢字的,因為它的顯示原理是由若干個5X7或者5X11的點陣字符位組成的,又因為漢字較為復雜,所以1602的主要作用就是顯示字母、數(shù)字、符號的。但是真的不能顯示漢字嗎?也并非絕對不能。接就是下面要說的CGRAM自定義字模。

      要顯示我們自定義的字符,就要用到LCD中的CGRAM存儲器(character generate RAM),而我們之前用的顯示自帶的字符用到的是DDRAM,兩個是不同的??词謨晕覀冎溃珻GRAM的容量是64個字節(jié),而一個字符是8個字節(jié),所以一共能顯示8個自定義的字符。內(nèi)部常用字符的顯示是從0x20開始的,0x00 ~ 0x0F是專門留給自定義字符顯示用的,0x00-0x07和0x08~0x0F顯示的內(nèi)容是一樣的,也就是說0x00=0x08,0x01=0x09,以此類推。CGRAM共128個位,地址是0x40-0x7F,128/8=16正好對應的是0x00-0x0F共16個,剛才說了,0x00與0x08對應,0x01與0x09對應,共16個,這并不矛盾!說了這么多,那么怎樣顯示一個自定義字符呢? 首先我們要清楚LCD1602顯示字符的點陣大小,眼力好的可以看出來,LCD1602一個顯示字符的位置是58的點陣,也就是說它所能顯示的點陣圖形的大小是58的!要顯示一個自定義的字符,首先我們要知道所顯示自定義字符的點陣數(shù)據(jù),也就是在一個58的點陣上那個點是黑的(將該點點黑,就是高電平—-1),哪個點是白的(該點不顯示,為低電平—-0),但是我們送入到LCD中的是ASCII碼,它是8位的數(shù)據(jù),而一個顯示字符的點陣大小只是58的,顯然不夠,顯示的辦法是8*8點陣的前三列不用,也就是不顯示,我們只用后面的5列來顯示。 然后設定我們是要定義第幾個自定義字符,前面已經(jīng)介紹了,LCD1602最多顯示8個自定義字符;然后要規(guī)定在液晶的什么位置顯示自定義字符,看過數(shù)據(jù)手冊我們知道,第一行第一個位置的地址是0x80,第二行一個位置的地址是0xC0。最后就是要顯示我們定義的第幾個字符其對應CGRAM地址的關系式是:

      0x00:第一個(0x40)

      0x01:第二個(0x48)

      0x02:第三個(0x50)

      0x03:第四個(0x58)

      0x04:第五個(0x60)

      0x05:第六個(0x68)

      0x06:第七個(0x70)

      0x07:第八個(0x78)

      每個字符由5X8點陣組成(也可選用5X10) ,想要實現(xiàn)顯示,只需如下圖: 例:以5X8點陣為例,顯示字符 A

      0代表滅,1代表亮 只需將想要顯示的字符的對應位置1,就能顯示該字符

      01110	□█ █ █□
      10001	█ □□□ █
      10001	█ □□□ █
      10001	█ □□□ █
      11111	█ ███ █
      10001	█ □□□ █
      10001	█ □□□ █
      10001	█ □□□ █
      A={0x0e,0x11,0x11,0x11,0x1f,0x11,0x11,0x11}

      代碼 流程

      首先創(chuàng)建自定義字模 把字模存入CGRAM中對應的自定義位置,位置在上表中以顯示出來了 在LCD1602中顯示出來

      void type_model_diy(){ unsigned char code Data_0[]={ 0x0e,0x11,0x11,0x11,0x1f,0x11,0x11,0x11}; // 字母A lcd_Init(); // LCD1602 初始化 lcd_write_com(0x40); // 0100 0000; 指令 0x40 向 CGRAM 地址0 寫入自定義數(shù)據(jù) for(i=0; i<8; i++){ lcd_write_dat(Data_0[i]); // 寫入自定義字符字模 } lcd_write_com(0x00 + 0x80); // 在第一行第一列顯示 第一個字符 lcd_write_dat(0); while(1); }

      END!

      發(fā)布者:全棧程序員棧長,轉載請注明出處:https:///160148.html原文鏈接:https://

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多