新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > LCD12864的串口驅(qū)動(asm/c51)

        LCD12864的串口驅(qū)動(asm/c51)

        作者: 時間:2016-11-10 來源:網(wǎng)絡(luò) 收藏

        串行數(shù)據(jù)傳送共分三個字節(jié)完成:
        第一字節(jié):串口控制—格式 11111ABC
        A 為數(shù)據(jù)傳送方向控制:H 表示數(shù)據(jù)從LCD 到MCU,L 表示數(shù)據(jù)從MCU 到LCD
        B 為數(shù)據(jù)類型選擇:H 表示數(shù)據(jù)是顯示數(shù)據(jù),L 表示數(shù)據(jù)是控制指令
        C 固定為0
        第二字節(jié):(并行)8 位數(shù)據(jù)的高4 位—格式 DDDD0000
        第三字節(jié):(并行)8 位數(shù)據(jù)的低4 位—格式 0000DDDD
        串行接口時序參數(shù):(測試條件:T=25℃ VDD=4.5V)

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

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        2. 串口程序

        PSB 接低時,串口模式被選擇。在該模式下,只用兩根線(SID 與 SCLK)來完
        成數(shù)據(jù)傳輸。當(dāng)同時使用多顆 ST7920 時,CS 線被配合使用,CS 是高有效。
        ST7920 的他不時鐘SCLK 有獨立的操作時序,當(dāng)多個連續(xù)的指令需要被送
        入時,指令執(zhí)行時間需要被考慮。必須等待上一個指令執(zhí)行完畢才送入下一個指
        令,因為 ST7920 內(nèi)部沒有傳送/接收緩沖區(qū)。
        一個完整的串行傳輸周期由一下部分組成:
        首先送入啟動字節(jié),送入 5 個連續(xù)的“1”用來啟動一個周期,此時傳輸計
        數(shù)被重置,并且串行傳輸被同步。緊接的兩個位指定傳輸方向(RW,確定讀還
        是寫)和傳輸性質(zhì)(RS,確定是命令寄存器還是數(shù)據(jù)寄存器),最后的第八位是
        一個“0”。
        送完啟動字節(jié)之后,可以送入指令或是顯示數(shù)據(jù)(或是字型代碼)。指令或
        者代碼是以字節(jié)為單位的,每個字節(jié)的內(nèi)容(指令或數(shù)據(jù))在被送入時分為兩個
        字節(jié)來處理:高四位放在第一個字節(jié)的高四位,低四位放在第二個字節(jié)的高四位。
        無關(guān)位都補“0”。請參照第四章串行通訊時序圖。

        ;//////////////////////////////////////////
        ;AT89S52串口驅(qū)動LCD12864
        ;LCD與AT89S52之間的接口:
        ;CS-P2.4,SID-P2.5,CLK-P2.6
        ;PSB-P2.1,LRET-P2.3。
        ;//////////////////////////////////////////
        CS EQU P2.4
        SID EQU P2.5
        CLK EQU P2.6
        PSB EQU P2.1
        LRET EQU P2.3

        COM DATA 40H;指令暫存器
        DAT DATA 41H;顯示數(shù)據(jù)暫存器
        ADDR DATA 42H;顯示地址寄存器

        ORG 0000H
        SJMP START
        ORG 0030H
        ;主程序
        START:CLR PSB
        SETB LRET
        MOV SP,50H
        CLR A
        LCALL DEL40
        LCALL INIR

        MOV ADDR,#80H;顯示第一頁內(nèi)容
        MOV DPTR,#DISA1
        LCALL LINE
        MOV ADDR,#90H
        MOV DPTR,#DISA2
        LCALL LINE
        MOV ADDR,#88H
        MOV DPTR,#DISA3
        LCALL LINE
        MOV ADDR,#98H
        MOV DPTR,#DISA4
        LCALL LINE
        LCALL DEL2S

        MOV ADDR,#80H;顯示第二頁內(nèi)容
        MOV DPTR,#DISA5
        LCALL LINE
        MOV ADDR,#90H
        MOV DPTR,#DISA6
        LCALL LINE
        MOV ADDR,#88H
        MOV DPTR,#DISA7
        LCALL LINE
        MOV ADDR,#98H
        MOV DPTR,#DISA8
        LCALL LINE
        LCALL DEL2S

        MOV ADDR,#80H;顯示第三頁內(nèi)容
        MOV DPTR,#DISB1
        LCALL LINE
        MOV ADDR,#90H
        MOV DPTR,#DISB2
        LCALL LINE
        MOV ADDR,#88H
        MOV DPTR,#DISB3
        LCALL LINE
        MOV ADDR,#98H
        MOV DPTR,#DISB4
        LCALL LINE
        LCALL DEL2S

        MOV ADDR,#80H;顯示第四頁內(nèi)容
        MOV DPTR,#DISB5
        LCALL LINE
        MOV ADDR,#90H
        MOV DPTR,#DISB6
        LCALL LINE
        MOV ADDR,#88H
        MOV DPTR,#DISB7
        LCALL LINE
        MOV ADDR,#98H
        MOV DPTR,#DISB8
        LCALL LINE
        LCALL DEL2S

        LJMP START

        ;函數(shù)TSWC 指令的同步位元字串寫入
        TSWC: SETB CS
        SETB SID
        MOV R0,#05H
        D1:SETB CLK
        CLR CLK
        DJNZ R0,D1
        CLR SID
        MOV R0,#03H
        D2:SETB CLK
        CLR CLK
        DJNZ R0,D2
        RET
        ;函數(shù)HDB4 寫入數(shù)據(jù)的高4位
        HDB4: SETB CS
        MOV R1,#04H
        D3:RLC A
        MOV SID,C
        SETB CLK
        CLR CLK
        DJNZ R1,D3
        RET
        ;函數(shù)ZEN4 寫入數(shù)據(jù)的低4位
        ZEN4: CLR SID
        MOV R1,#04H
        D4:SETB CLK
        CLR CLK
        DJNZ R1,D4
        RET
        ;函數(shù)WCOM 指令寫入程序
        WCOM: LCALL TSWC
        MOV A,COM
        LCALL HDB4
        LCALL ZEN4
        LCALL HDB4
        LCALL ZEN4
        CLR CS
        LCALL DEL2M
        RET

        ;函數(shù)INIR 初始化LCD12864
        INIR: MOV COM,#00110000B;設(shè)置基本指令
        LCALL WCOM
        MOV COM,#00110000B;設(shè)置8-BIT
        LCALL WCOM
        MOV COM,#00001100B;顯示開,關(guān)光標(biāo),光反白
        LCALL WCOM
        MOV COM,#00000001B;清屏,AC=0
        LCALL WCOM
        MOV COM,#00000110B;進(jìn)入點設(shè)定
        LCALL WCOM
        RET
        ;函數(shù)TSWD 顯示數(shù)據(jù)的同步位元字串寫入
        TSWD: SETB CS
        SETB SID
        MOV R3,#05H
        E2:SETB CLK
        CLR CLK
        DJNZ R3,E2
        CLR SID
        SETB CLK
        CLR CLK
        SETB SID
        SETB CLK
        CLR CLK
        CLR SID
        SETB CLK
        CLR CLK
        RET

        ;函數(shù)WDAT 顯示數(shù)據(jù)寫入程序
        WDAT: LCALL TSWD
        MOV A,DAT
        LCALL HDB4
        LCALL ZEN4
        LCALL HDB4
        LCALL ZEN4
        CLR CS
        LCALL DEL2M
        RET
        ;函數(shù)LINE 寫入一行顯示數(shù)據(jù)程序
        LINE:MOV A,ADDR
        MOV COM,A
        LCALL WCOM
        MOV R2,#10H
        E1:CLR A
        MOVC A,@A+DPTR
        MOV DAT,A
        LCALL WDAT
        INC DPTR
        DJNZ R2,E1
        RET
        ;函數(shù)DEL40 40MS延時
        DEL40:MOV R0,#40
        DE1:MOV R1,#250
        DE2:NOP
        NOP
        DJNZ R1,DE2
        DJNZ R0,DE1
        RET
        ;函數(shù)DEL2M 2MS延時
        DEL2M:MOV R0,#2
        DE3:MOV R1,#250
        DJNZ R1,$
        DJNZ R0,DE3
        RET
        ;函數(shù)DEL2S 2S延時
        DEL2S:MOV R5,#50
        DE4:LCALL DEL40
        DJNZ R5,DE4
        RET
        ;顯示內(nèi)容區(qū)
        DISA1:DB "青島佰謙工貿(mào)公司"
        DISA2:DB "WWW.Baidu.COM.cn"
        DISA3:DB " 13210813637 "
        DISA4:DB "128*64全點陣顯示"
        DISA5:DB "圖形以及字符顯示"
        DISA6:DB "2009年 7月 29 日"
        DISA7:DB "設(shè)計者:趙玉慶 "
        DISA8:DB "AT89C52 與ST7920"

        DISB1:DB "昨夜星辰昨夜風(fēng),"
        DISB2:DB "畫樓西畔桂堂東。"
        DISB3:DB "身無彩鳳雙飛翼,"
        DISB4:DB "心有靈犀一點通。"
        DISB5:DB "隔座送鉤春酒暖,"
        DISB6:DB "分曹射覆蠟燈紅。"
        DISB7:DB "嗟余聽鼓應(yīng)官去,"
        DISB8:DB "走馬蘭臺類轉(zhuǎn)蓬。"

        END

        .......................lcd12864 串口驅(qū)動程序(c51:已調(diào)試過).................................................

        #include
        #define uchar unsigned char
        sbit cs=P2^4;
        sbit sid=P2^5;
        sbit clk=P2^6;
        sbit psb=P2^1;
        sbit res=P2^3;
        uchar a,i;
        uchar code table1[]="實用開關(guān)電源手冊";
        uchar code table2[]="Lcent Technologi";
        uchar code table3[]="51單片機開發(fā)原理";
        uchar code table4[]="STC89C52_LCD1286";

        void d1ms(void) //誤差 0us
        {
        unsigned char a,b,c;
        for(c=1;c>0;c--)
        for(b=142;b>0;b--)
        for(a=2;a>0;a--);
        }

        void d10ms(void) //誤差 0us
        {
        unsigned char a,b,c;
        for(c=1;c>0;c--)
        for(b=38;b>0;b--)
        for(a=130;a>0;a--);
        }


        void synbit()
        {
        uchar j;
        sid=1;
        for(j=0;j<5;j++)
        {
        clk=1;
        clk=0;
        }
        }

        void zorn()
        {
        uchar j;
        for(j=0;j<4;j++)
        {
        sid=0;
        clk=1;
        clk=0;
        }
        }

        void send(uchar date)
        {
        uchar j;
        for(j=0;j<4;j++)
        {
        sid=(bit)(date&0x80);
        clk=1;
        clk=0;
        date=date<<1;
        }
        zorn();
        for(j=0;j<4;j++)
        {
        sid=(bit)(date&0x80);
        clk=1;
        clk=0;
        date=date<<1;
        }
        zorn();
        }

        void write_com(uchar com)
        {
        uchar j;
        cs=1;
        synbit();
        sid=0;
        for(j=0;j<3;j++)
        {
        clk=1;
        clk=0;
        }
        send(com);
        cs=0;
        d1ms();
        }

        void init()
        {
        write_com(0x30);
        write_com(0x30);
        write_com(0x01);
        write_com(0x02);
        write_com(0x06);
        write_com(0x0c);
        write_com(0x14);
        }

        void write_date(uchar date)
        {
        cs=1;
        synbit();
        sid=0;
        clk=1;
        clk=0;
        sid=1;
        clk=1;
        clk=0;
        sid=0;
        clk=1;
        clk=0;
        send(date);
        cs=0;
        d1ms();
        }
        void displcd()
        {
        write_com(0x80);
        for(i=0;i<0x10;i++)
        {
        write_date(table1[i]);
        }
        write_com(0x88);
        for(i=0;i<0x10;i++)
        {
        write_date(table2[i]);
        }
        write_com(0x90);
        for(i=0;i<0x10;i++)
        {
        write_date(table3[i]);
        }
        write_com(0x98);
        for(i=0;i<0x10;i++)
        {
        write_date(table4[i]);
        }
        }

        void main()
        {
        cs=0;
        sid=0;
        clk=0;
        SP=0x30;
        res=0;
        d10ms();
        res=1;
        psb=0;
        init();
        displcd();
        while(1);
        }



        關(guān)鍵詞: LCD12864串口驅(qū)

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 白玉县| 维西| 孝义市| 阿拉善右旗| 辽源市| 清远市| 沅陵县| 陈巴尔虎旗| 屏山县| 岢岚县| 乌鲁木齐县| 四平市| 卫辉市| 水城县| 台南市| 大名县| 上饶县| 内江市| 灵川县| 霍山县| 界首市| 团风县| 洱源县| 衡阳县| 沂水县| 阿荣旗| 碌曲县| 威信县| 汉寿县| 曲周县| 攀枝花市| 龙岩市| 若羌县| 五莲县| 横山县| 诸暨市| 营山县| 北海市| 祁连县| 互助| 敦化市|