新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機驅動LCD1602的制作二

        單片機驅動LCD1602的制作二

        作者: 時間:2016-11-22 來源:網絡 收藏
        具體電路的制作是很簡單的,就接了兩個電阻,一個是10歐姆的背光限流電阻,另一個是2K的LCD極板電壓調節電阻。這兩個電阻的阻值怎么定呢?背光比較簡單,它就相當于在后面接了幾個發光二極管,任何時候你只要在15、16腳串上個100歐的電位器接上電源,調節電位器,覺得亮度合適。此時的阻值便可。LCD液晶極板驅動電壓調節電阻的確定就稍微麻煩一點。在各數據線,控制線接好關通上電源的前提下在第3腳(VEE)和地之間接一個10K的電位器。調節電位器。當3腳電壓高時為全亮,電壓為0時為全暗(液晶全顯示為黑塊)。你用電位器把屏幕從全暗剛好調到變亮。這時便可調試程序。待屏幕能正確顯示后再細調電位器,使對比度合適。這時的阻值便可確定,然后換成等值的固定電阻焊上便可。

        我們接著上次的系統板制做:

        本文引用地址:http://www.104case.com/article/201611/319669.htm













        用戶自定義字符的應用:
        我們從CGROM表上可以看到,在表的最左邊是一列可以允許用戶自定義的CGRAM,從上往下看著是16個,實際只有8個字節可用。它的字符碼是00000000-00000111這8個地址,表的下面還有8個字節,但因為這個CGRAM的字符碼規定0-2位為地址,3位無效,4-7全為零。因此CGRAM的字符碼只有最后三位能用也就是8個字節了。等效為0000X111,X為無效位,最后三位為000-111共8個。
        如果我們要想顯示這8個用戶自定義的字符,操作方法和顯示CGROM的一樣,先設置DDRAM位置,再向DDRAM寫入字符碼,例如“A”就是41H?,F在我們要顯示CGRAM的第一個自定義字符,就向DDRAM寫入00000000B(00H),如果要顯示第8個就寫入00000111(08H),簡單吧!
        好!現在我們來看怎么向這八個自定義字符寫入字模。有個設置CGRAM地址的指令大家還記得嗎?趕快再找出來看看。

        從這個指令可以看出指令數據的高2位已固定是01,只有后面的6位是地址數據,而這6位中的高3位就表示這八個自定義字符,最后的3位就是字模數據的八個地址了。例如第一個自定義字符的字模地址為01000000-01000111八個地址。我們向這8個字節寫入字模數據,讓它能顯示出“℃”
        地址:01000000  數據:00010000 圖示:○○○■○○○○
           01000001     00000110 ○○○○○■■○
           01000010     00001001 ○○○○■○○■
           01000011     00001000 ○○○○■○○○
           01000100     00001000 ○○○○■○○○
           01000101     00001001 ○○○○■○○■
           01000110     00000110 ○○○○○■■○
           01000111     00000000 ○○○○○○○○
        下面我們寫一段程序讓這8個自定義字符顯示出一個心的圖案:
        # include
        unsigned char table1[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
        0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
        0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
        0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
        0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
        0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
        0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
        0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心圖案
        unsigned char table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//字符℃
        #define CLEARSCREEN LCD_write_command(0x01)
        #define LCDIO P2
        sbit LCD1602_RS=P3^0;
        sbit LCD1602_RW=P3^1;
        sbit LCD1602_EN=P3^2;

        void LCD_write_command(unsigned char command);//寫入指令函數
        void LCD_write_dat(unsigned char dat);//寫入數據函數
        void LCD_set_xy( unsigned char x, unsigned char y );//設置顯示位置函數
        void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);//顯示一個字符函數
        void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);//顯示字符串函數
        void LCD_init(void);//初始化函數
        void delay_nms(unsigned int n);//延時函數

        void LCD_init(void)
        {
        CLEARSCREEN;//clear screen
        LCD_write_command(0x38);//set 8 bit data transmission mode
        LCD_write_command(0x0c);//open display (enable lcd display)
        LCD_write_command(0x80);//set lcd first display address
        CLEARSCREEN;//clear screen
        }

        void LCD_write_command(unsigned char command)
        {
        LCDIO=command;
        LCD1602_RS=0;
        LCD1602_RW=0;
        LCD1602_EN=0;
        LCD1602_EN=1;
        delay_nms(10);
        }


        void LCD_write_dat(unsigned char dat)
        {
        LCDIO=dat;
        LCD1602_RS=1;
        LCD1602_RW=0;
        LCD1602_EN=0;
        delay_nms(1);
        LCD1602_EN=1;
        }

        void LCD_set_xy( unsigned char x, unsigned char y )
        {
        unsigned char address;
        if (y == 1)
        address = 0x80 + x;
        else
        address =0xc0+ x;
        LCD_write_command(address);
        }

        void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)
        {
        LCD_set_xy( x, y );
        LCD_write_dat(dat);
        }

        void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s)
        {
        LCD_set_xy( X, Y );
        while (*s)
        {
        LCD_write_dat(*s);
        s ++;
        }
        }

        void delay_nms(unsigned int n)
        {
        unsigned int i=0,j=0;
        for (i=n;i>0;i--)
        for (j=0;j<10;j++);
        }

        void main(void)
        {
        unsigned char i,j,k,tmp;
        LCD_init();
        delay_nms(100);
        tmp=0x40;//設置CGRAM地址的格式字
        k=0;
        for(j=0;j<8;j++)
        {
        for(i=0;i<8;i++)
        {
        LCD_write_command(tmp+i); // 設置自定義字符的 CGRAM 地址
        delay_nms(2);
        LCD_write_dat(table1[k]); // 向CGRAM寫入自定義字符表的數據
        k++;
        delay_nms(2);
        }
        tmp=tmp+8;
        }
        LCD_dsp_string(1,1,"LCD TEST ");//在第一行第一列顯示“LCD TEST”
        LCD_dsp_string(1,2,"SUCCESSFUL ");//在第二行第一列顯示“SUCCESSFUL”
        for (i=0;i<4;i++)
        {
        LCD_dsp_char( 12+i,1,i);//在第一行第12列位置顯示心圖案的上半部
        delay_nms(1);
        }
        for (i=4;i<8;i++)
        {
        LCD_dsp_char( 12+i-4,2,i);在第二行第12列位置顯示心圖案的下半部
        delay_nms(1);
        }
        while (1);
        }
        實際效果如圖:




        關鍵詞: 單片機驅動LCD160

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜春市| 青田县| 扶沟县| 安乡县| 宝清县| 星座| 新邵县| 兰溪市| 绥芬河市| 惠来县| 景谷| 安吉县| 滨州市| 犍为县| 贵港市| 聊城市| 全椒县| 湖口县| 柘荣县| 常州市| 阳曲县| 江城| 永德县| 曲水县| 板桥市| 永兴县| 彭水| 云浮市| 阳信县| 定日县| 余姚市| 油尖旺区| 广州市| 永寿县| 巴马| 诸暨市| 萍乡市| 通城县| 宁夏| 多伦县| 高要市|