新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機采用模擬時序控制點陣圖形液晶程序

        51單片機采用模擬時序控制點陣圖形液晶程序

        作者: 時間:2016-11-28 來源:網絡 收藏
        ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ;連線圖:
        ;//LCM---89C52////LCM---89C52////LCM-------89C52////LCM----------89C52// //
        ;//DB0---P0.0////DB4---P0.4////D/I-------P2.6////CS1----------P2.4////
        ;//DB1---P0.1////DB5---P0.5////R/W-------P2.7////CS2----------P2.5////
        ;//DB2---P0.2////DB6---P0.6////RST--------VCC////CS3----------P3.2////
        ;//DB3---P0.3////DB7---P0.7////E---------P2.3////
        ;注:89C52的晶振頻率為12MHz//
        ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //畫線部分請參照avr的c程序。
        ///#pragma src///生成ASM文件開關,必要時打開///
        #include
        #include
        #include

        #define Uchar unsigned char

        ///////////////////////液晶顯示器接口引腳定義///////////////////////////////

        sbitElcm=P2^3;//
        sbitCS1LCM= P2^4;//
        sbitCS2LCM= P2^5;//
        sbitCS3LCM= P3^2;///這個連接只是做實驗的臨時接法。///
        sbitDilcm=P2^6;//
        sbitRwlcm=P2^7;//
        sfr Datalcm=0x80;//數據口
        unsigned char testi[]={"浸渠叁繩漱塔烴威犧曉玄瑤"};

        ///////////////////////常用操作命令和參數定義///////////////////////////////
        #defineDISPON0x3f///顯示on///
        #defineDISPOFF0x3e///顯示off///
        #defineDISPFIRST0xc0///顯示起始行定義///
        #defineSETX0x40///X定位設定指令(頁)///
        #defineSETY0xb8///Y定位設定指令(列)///
        #defineLcdbusy0x80///LCM忙判斷位///

        /////////////////////////////顯示分區邊界位置///////////////////////////////////
        #defineMODL0x00///左區///
        #defineMODM0x40///左區和中區分界///
        #defineMODR0x80///中區和右區分界///
        #define LCMLIMIT0xC0///顯示區的右邊界///

        /////////////////////////////////全局變量定義///////////////////////////////////////
        Uchar col,row,cbyte;///列x,行(頁)y,輸出數據 ///
        bit xy;///畫線方向標志:1水平///

        ///////////////////////////////////函數列表/////////////////////////////////////////////
        void Lcminit(void);///液晶模塊初始化///
        void Delay(Uchar);///延時,入口數為Ms ///
        void lcdbusyL(void);///busy判斷、等待(左區) ///
        void lcdbusyM(void);///busy判斷、等待(中區) ///
        void lcdbusyR(void);///busy判斷、等待(右區) ///
        void Putedot(Uchar);///半角字符輸出///
        void Putcdot(Uchar);///全角(漢字)輸出///
        void Wrdata(Uchar);///數據輸出給LCM///
        void Lcmcls( void );///LCM全屏幕清零(填充0) ///
        void wtcom(void);///公用busy等待///
        void Locatexy(void);///光標定位///
        void WrcmdL(Uchar);///左區命令輸出///
        void WrcmdM(Uchar);///中區命令輸出///
        void WrcmdR(Uchar);///右區命令輸出///
        void Putstr(Uchar //puts,Uchar i);///中英文字符串輸出///
        void Rollscreen(Uchar x);///屏幕向上滾動演示///
        void Rddata(void);///從液晶片上讀數據///
        void Linehv(Uchar length);///橫(豎)方向畫線///
        void point(void);///打點///
        void Linexy(Uchar endx,Uchar endy);

        /////////////////////////////////////數組列表///////////////////////////////////////////
        Uchar code Ezk[];///ASCII常規字符點陣碼表 ///
        Uchar code Hzk[];///自用漢字點陣碼表///
        Uchar code STR1[];///自定義字符串///
        Uchar code STR2[];//
        Uchar code STR3[];//
        Uchar code STR4[];//


        //////////////////////////////////////////////////////////////////
        /// 演示主程序///
        //////////////////////////////////////////////////////////////////
        void main(void)

        {
        Uchar x,y;
        col=0;
        row=0;
        Delay(40);///延時大約40Ms,等待外設準備好///
        Lcminit();///液晶模塊初始化,包括全屏幕清屏///
        Putstr(STR2,24);///第一行字符輸出,24字節///
        col=0;
        row=2;
        Putstr(STR1,12);///第二行字符輸出,12字節///
        col=0;
        row=4;
        Putstr(STR3,24);///第三行字符輸出,24字節///
        col=0;
        row=6;
        Putstr(STR4,24);///第四行字符輸出,12字節///
        x=0;
        col=0;
        row=0;
        xy = 1;///方向標志。定為水平方向///
        Linehv(192);///畫一條橫線(0,0)-(191,0)///
        col=0;
        row=15;
        xy = 1;
        Linehv(192);///畫一條橫線(0,15)-(191,15)///
        col=0;
        row=32;
        xy = 1;
        Linehv(192);///畫一條橫線(0,32)-(191,32)///
        col=0;
        row=1;
        xy = 0;///方向標志。定為垂直方向///
        Linehv(31);///畫一條豎線(0,1)-(0,31) ///
        col=191;
        row=1;
        xy = 0;
        Linehv(31);///畫一條豎線(191,1)-(191,31) ///
        col=0;///設定斜線的起點坐標///
        row=63;
        Linexy(44,31);///畫一段斜線(0,63)-(44,31)///
        col=44;
        row=31;
        Linexy(190,62);///繼續畫斜線(44,31)-(191,63) ///
        while(1){
        Rollscreen(y);///定位新的顯示起///
        y++;
        y %=8;
        x=testi[y];
        Delay(100); ///延時,控制滾動速度 ///
        };
        }


        //////////////////////////////////////////////////////////////////////////////////////////////////
        ///畫線。任意方向的斜線,不支持垂直的或水平線 ///
        //////////////////////////////////////////////////////////////////////////////////////////////////

        void Linexy(Uchar endx,Uchar endy)
        {
        register Uchar t;
        int xerr=0,yerr=0,delta_x,delta_y,distance;
        Uchar incx,incy;

        ///compute the distance in both directions ///
        delta_x=endx-col;
        delta_y=endy-row;

        /// computethe direction of the increment ,
        an increment of "0" means either a vertical or horizontal lines ///

        if(delta_x>0) incx=1;
        else if( delta_x==0 ) incx=0;
        else incx=-1;


        if(delta_y>0) incy=1;
        else if( delta_y==0 ) incy=0;
        else incy=-1;

        ///determine which distance is greater ///
        delta_x = cabs( delta_x );
        delta_y = cabs( delta_y );

        if( delta_x > delta_y ) distance=delta_x;
        else distance=delta_y;

        /// draw the line ///
        for( t=0;t = distance+1; t++ ) {
        point();
        xerr += delta_x ;
        yerr += delta_y ;
        if( xerr > distance ) {
        xerr-=distance;
        col+=incx;
        }
        if( yerr > distance ) {
        yerr-=distance;
        row+=incy;
        }

        }
        }

        //////////////////////////////////////////////////////////////////////////////////
        ///畫線。只提供X或Y方向的,不支持斜線///
        //////////////////////////////////////////////////////////////////////////////////
        void Linehv(Uchar length)
        {
        Uchar xs,ys;
        if (xy){ys = col;
        for (xs=0;xs
        col = ys + xs;
        point();}
        }
        else{xs = row;
        for (ys=0;ys
        row = xs + ys;
        point();}
        }
        }

        //////////////////////////////////////////////////////////////////////////////////
        ///畫點///
        //////////////////////////////////////////////////////////////////////////////////

        void point(void)
        {
        Ucharx1,y1,x,y;
        x1=col;
        y1=row;
        row=y1>>3;///取Y方向分頁地址///
        Rddata();
        y=y1&0x07;///字節內位置計算///
        x=0x01;
        x=x<///移入所畫點///
        Wrdata(cbyte|x);///畫上屏幕///
        col=x1;///恢復xy坐標///
        row=y1;
        }

        //////////////////////////////////////////////////////////////////////////////////
        ///屏幕滾動定位///
        //////////////////////////////////////////////////////////////////////////////////
        void Rollscreen(Uchar x)
        {
        cbyte = DISPFIRST|x;///定義顯示起始行為x?///
        WrcmdL(cbyte);
        WrcmdM(cbyte);
        WrcmdR(cbyte);
        }

        //////////////////////////////////////////////////////////////////////////////////
        ///一個字串的輸出///
        //////////////////////////////////////////////////////////////////////////////////
        void Putstr(Uchar //puts,Uchar i)
        {
        Uchar j,X;
        for (j=0;j
        {
        X = puts[j];
        if (X&0x80)
        {
        Putcdot(X&0x7f);///只保留低7位///
        }
        else Putedot(X-0x20);///ascii碼表從0x20開始///
        }
        }

        //////////////////////////////////////////////////////////////////////////////////
        ///半角字符點陣碼數據輸出///
        //////////////////////////////////////////////////////////////////////////////////
        void Putedot(Uchar Order)
        {
        Uchar i,bakerx,bakery;///共定義4個局部變量///
        int x;///偏移量,字符量少的可以定義為UCHAR///
        bakerx = col;///暫存x,y坐標,已備下半個字符使用 ///
        bakery = row;
        x=Order // 0x10;///半角字符,每個字符16字節 ///
        ///上半個字符輸出,8列///
        for(i=0;i<8;i++)
        {
        cbyte = Ezk[x];///取點陣碼,rom數組///
        Wrdata(cbyte);///寫輸出一字節///
        x++;
        col++;
        if (col==LCMLIMIT){col=0;row++;row++;}; ///下一列,如果列越界換行///
        if (row>7) row=0;///如果行越界,返回首行///
        }///上半個字符輸出結束 ///

        col = bakerx;///列對齊///
        row = bakery+1;///指向下半個字符行///
        ///下半個字符輸出,8列///
        for(i=0;i<8;i++)
        {
        cbyte = Ezk[x];///取點陣碼///
        Wrdata(cbyte);///寫輸出一字節///
        x++;
        col++;
        if (col==LCMLIMIT){col=0;row=row+2;};///下一列,如果列越界換行///
        if (row>7) row=1;///如果行越界,返回首行///
        }///下半個字符輸出結束 ///
        row=bakery;
        }///整個字符輸出結束///

        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 门头沟区| 濮阳市| 凤凰县| 东光县| 卢龙县| 临湘市| 天祝| 舞钢市| 蓬溪县| 新乐市| 始兴县| 谢通门县| 交口县| 卢湾区| 木兰县| 临泉县| 密山市| 鄂托克前旗| 平舆县| 临江市| 林甸县| 朝阳市| 当阳市| 武川县| 沙田区| 阿坝县| 屏南县| 仁布县| 丽江市| 泗水县| 金溪县| 千阳县| 常德市| 凤山市| 东源县| 皋兰县| 财经| 临猗县| 平顺县| 北票市| 海阳市|