新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機12864漢字液晶模塊顯示文字

        PIC單片機12864漢字液晶模塊顯示文字

        作者: 時間:2018-08-01 來源:網絡 收藏

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

        本文介紹了利用PIC12864漢字液晶模塊來顯示文字

        #include

        __CONFIG(0x1832);

        //芯片配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振蕩

        #define rs RA5 //定義LCD的數據/命令控制口

        #define rw RA4 //定義LCD的讀/寫控制口

        #define e RA3 //定義LCD的使能口

        #define psb RA2 //定義通信方式控制口

        #define rst RA0 //定義復位口

        #define nop() asm(nop) //定義nop()函數

        //深圳乾龍盛電子

        const unsigned char TAB1A[ ]={0xC9,0xEE,0xDB,0xDA,0xC7,0xAC,0xC1,0xFA,0xCA,0xA2,0xB5,0xE7,0xD7,0xD3};

        //WWW.PIC16.COM

        const unsigned char TAB1B[ ]={' ', ' ', 'W', 'W', 'W', '.', 'P', 'I', 'C', '1','6', '.', 'C', 'O', 'M', ' '};

        //TEL0755-28187975

        const unsigned char TAB1C[ ]={'T', 'E', 'L' ,'0' ,'7', '5' ,'5','-', '2', '8','1', '8' ,'7','9' ,'7','5'};

        //FAX0755-28187976

        const unsigned char TAB1D[ ]={'F', 'A', 'X', '0', '7', '5', '5', '-','2', '8','1', '8', '7', '9', '7', '6'};

        unsigned int lcd_x; //定義LCD頁地址寄存器

        unsigned int lcd_y; //定義LCD列地址寄存器

        bit busy; //定義LCD忙標志位

        void init(); //申明I/O口設置函數

        void lcd_init(); //申明LCD初始化函數

        void clear_p(); //申明清屏函數

        void han_wr2a(); //申明顯示公司名稱函數

        void han_wr2b(); //申明顯示公司web函數

        void han_wr2c(); //申明顯示公司tel函數

        void han_wr2d(); //申明顯示公司fax函數

        void wr_zb(); //申明有關顯示設置函數

        void flash(); //申明設置LCD顯示閃爍函數

        void qushu(int counts,const unsigned char *ps); //申明查表獲取顯示數據

        void send_d(unsigned char x); //申明送一字節數據顯示函數

        void send_i(unsigned char x); //申明送一字節控制命令函數

        void chk_busy(); //申明檢測LCD是否工作繁忙函數

        void delay(); //申明延時函數1,供各命令之間的延時和決定顯示快慢

        void delay1(); //申明延時函數2,用以決定顯示閃爍快慢

        //-------------------------------------------

        //主程序

        void main()

        {

        while(1)

        {

        init(); //調用I/O口設置函數

        lcd_init(); //調用LCD初始化函數

        clear_p(); //調用清屏函數

        han_wr2a(); //調用顯示公司名稱函數

        han_wr2b(); //調用顯示公司web函數

        han_wr2c(); //調用顯示公司tel函數

        han_wr2d(); //申明顯示公司fax函數

        delay(); //延長顯示一段時間

        flash(); //調用顯示閃爍函數

        clear_p(); //調用清屏函數

        }

        }

        //-------------------------------------------

        //I/O口設置函數

        void init()

        {

        TRISA=0X00; //設置A口為輸出

        TRISD=0X00; //設置D口為輸出

        ADCON1=0X06; //設置A口為普通I/O口

        }

        //-------------------------------------------

        //LCD初始化函數

        void lcd_init()

        {

        rst=0; //復位LCD

        delay(); //保證復位所需要的時間

        rst=1; //恢復LCD正常工作

        nop();

        psb=1; //設置LCD為8位并口通信

        send_i(0x30); //基本指令操作

        send_i(0x01); //清除顯示

        send_i(0x06); //指定在寫入或讀取時,光標的移動方向

        send_i(0x0c); //開顯示,關光標,不閃爍

        }

        //-------------------------------------------

        //顯示公司名稱函數

        void han_wr2a()

        {

        send_i(0x81); //設置顯示位置:第一行

        qushu(0xe,TAB1A); //調用取數函數,共14個數據,保存在數組TAB1A里

        }

        //-------------------------------------------

        //顯示公司web函數

        void han_wr2b()

        {

        send_i(0x90); //設置顯示位置:第二行

        qushu(0x10,TAB1B); //調用取數函數,共16個數據,保存在數組TAB1B里

        }

        //-------------------------------------------

        //顯示公司tel函數

        void han_wr2c()

        {

        send_i(0x88); //設置顯示位置:第三行

        qushu(0X10,TAB1C); //調用取數函數,共16個數據,保存在數組TAB1C里

        }

        //-------------------------------------------

        //顯示公司fax函數

        void han_wr2d()

        {

        send_i(0x98); //設置顯示位置:第四行

        qushu(0X10,TAB1D); //調用取數函數,共16個數據,保存在數組TAB1D里

        }

        //有關顯示設置函數

        void wr_zb()

        {

        send_i(lcd_y);

        send_i(lcd_x);

        }

        //-------------------------------------------

        //顯示閃爍函數

        void flash()

        {

        send_i(0x08); //關顯示

        delay1(); //延長一定時間

        send_i(0x0c); //開顯示

        delay1();

        delay1(); //延長關顯示兩倍的時間

        send_i(0x08); //關顯示

        delay1();

        send_i(0x0c); //開顯示

        delay1();

        delay1();

        send_i(0x08); //關顯示

        delay1();

        send_i(0x0c); //開顯示

        delay1();

        delay1();

        }

        //-------------------------------------------

        //清屏函數

        void clear_p()

        {

        send_i(0x1); //清除所有顯示

        send_i(0x34); //擴展指令操作

        send_i(0x30); //基本指令操作

        }

        //------------------------------------------

        //查表函數

        void qushu(int counts,const unsigned char *ps)

        {

        int i; //定義循環變量

        for(i=counts;i>0;i--) //循環counts次

        {

        send_d(*ps); //查表取數并調用顯示一個字節數據函數送顯示

        delay(); //延長一定時間,確保能看到數據一個個的顯示出來

        ps++; //取下一個數據

        }

        }

        //-------------------------------------------

        //顯示一字節數據函數

        void send_d(unsigned char x)

        {

        chk_busy(); //檢測LCD是否工作繁忙

        rs=1; //設置該字節數據是顯示數據

        rw=0; //設置該次操作為寫

        PORTD=x; //送數據口PORTD

        e=1; //使能

        nop();

        nop();

        nop();

        e=0; //禁止

        }

        //--------------------------------------------

        //送一字節命令代碼函數

        void send_i(unsigned char x)

        {

        chk_busy(); //檢測LCD是否工作繁忙

        rs=0; //設置該字節數據為控制命令

        rw=0; //設置此次操作為寫

        PORTD=x; //送數據口PORTD

        e=1; //使能

        nop();

        nop();

        nop();

        e=0; //禁止

        }

        //-------------------------------------------

        //檢測LCD是否工作繁忙

        void chk_busy()

        {

        busy=1; //先置位繁忙標志位

        TRISD=0XFF; //更改通信為輸入

        rs=0; //設置該字節數據為命令代碼

        rw=1; //設置此次操作為讀

        while(busy)

        {

        nop();

        nop();

        nop();

        e=1; //使能

        nop();

        nop();

        nop();

        if(!RD7) busy=0; //檢測LCD是否工作繁忙

        nop();

        nop();

        nop();

        e=0; //禁止

        }

        e=0; //禁止

        TRISD=0X00; //恢復通信為輸出

        }

        //-------------------------------------------

        //延時函數

        void delay()

        {

        int i;

        for(i=0;i5000;i++)

        {;}

        }

        //-------------------------------------------

        //延時函數1

        void delay1()

        {

        int i;

        for(i=0;i10;i++)

        {

        delay(); //調用延時函數

        }

        }



        關鍵詞: 單片機 液晶顯示

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鄂托克旗| 仁化县| 黑水县| 遵义县| 耒阳市| 商丘市| 吴忠市| 九江市| 株洲县| 泸水县| 司法| 宿迁市| 铜鼓县| 恩施市| 鲁山县| 东兴市| 光山县| 巴彦县| 铜鼓县| 古交市| 沿河| 泾源县| 卫辉市| 本溪市| 广安市| 广东省| 铁岭市| 西宁市| 金寨县| 环江| 丽江市| 昌黎县| 青川县| 河北区| 兰考县| 灵川县| 华蓥市| 嵩明县| 辛集市| 静安区| 浦江县|