新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > TFT畫出任意斜率的直線

        TFT畫出任意斜率的直線

        作者: 時間:2016-11-26 來源:網絡 收藏
        在之前共享的幾篇關于TFT的應用程序中,大家可以看出程序的主要框架沒有發(fā)生大的變化;變化的只是將帶你用的函數(shù)做了更為靈活的改變!

        所以大家學習程序時,一定要能從長篇的程序中找出精華,并及時拷貝下來做積累,最終能夠靈活的應用!!

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

        這篇文章或許是關于TFT的最后一遍文章了!再有也只是TFT的應用程序!

        只要大家能掌握之前的幾篇文章,就可以自己靈活的應用了!!!

        #include
        #defineuint unsigned int
        #define uchar unsigned char
        #defineTYPE_LCD_DATA1
        #defineTYPE_LCD_COMMAND0
        #defineLCD_SIZE_X128
        #defineLCD_SIZE_Y160
        #defineDATAP0
        sbit LCD_RST= P2^7;//RST 引腳定義
        sbit LCD_RD= P3^2;//RD引腳定義
        sbit LCD_WR= P3^3;//WR引腳定義
        sbit LCD_RS= P2^5;//RS引腳定義
        sbit LCD_CS= P2^6;//CS引腳定義
        uint colors[]=
        {
        0xf800,0x07e0,0x001f,0xffe0,0x0000,0x07ff,0xf81f,0xffff ,0x7bef
        };
        void delay_ms(uint ms)
        {
        unsigned char k;
        while (ms--)
        {
        for (k = 0; k < 228; k++)
        ;
        }
        }


        void LCD_Write(uchar type, uint value)
        {
        LCD_CS = 0;
        LCD_RS = type;// 0: command1: data

        LCD_WR= 0;
        DATA = (uchar)value;;
        LCD_WR = 1;
        LCD_CS = 1;
        }



        void LCD_Wirte_Data16(uint value)// color data
        {
        LCD_CS = 0;
        LCD_RS = 1;
        LCD_WR= 0;
        DATA = (uchar)value;
        LCD_WR= 1;
        LCD_WR= 0;
        DATA = (uchar)(value>>8);
        LCD_WR = 1;
        LCD_CS = 1;
        }


        void Reg_Write(uint reg,uint value)
        {
        LCD_Write(TYPE_LCD_COMMAND,reg);
        LCD_Write(TYPE_LCD_DATA,value);
        }



        void LCD_SetRamAddr(uint xStart, uint xEnd, uint yStart, uint yEnd)
        {
        Reg_Write(0x09, xStart);
        Reg_Write(0x10, yStart);
        Reg_Write(0x11, xEnd);
        Reg_Write(0x12, yEnd);
        Reg_Write(0x18, xStart);
        Reg_Write(0x19, yStart);
        LCD_Write(TYPE_LCD_COMMAND,0x22);// 0x22
        }



        void LCD_init(void)
        {
        uint num;
        Reg_Write(0x0001,0x0002); //MODE_SEL1
        Reg_Write(0x0002,0x0012);//MODE_SEL2
        Reg_Write(0x0003,0x0000);//MODE_SEL3
        Reg_Write(0x0004,0x0010);//MODE_SEL3
        LCD_SetRamAddr(0,127, 0,159);
        for(num=20480;num>0;num--)
        LCD_Wirte_Data16(0xffff);

        Reg_Write(0x0005,0x0008);//VCO_MODE
        Reg_Write(0x0007,0x007f);//VCOMHT_CTRL
        Reg_Write(0x0008,0x0017);//VCOMLT_CTRL
        Reg_Write(0x0009,0x0000);//write SRAM window start X point
        Reg_Write(0x0010,0x0000);//write SRAM window start y point
        Reg_Write(0x0011,0x0083);//write SRAM window end x point
        Reg_Write(0x0012,0x009f);//write SRAM window end y point
        Reg_Write(0x0017,0x0000);//SRAM contrl
        Reg_Write(0x0018,0x0000);//SRAM x position
        Reg_Write(0x0019,0x0000);//SRAM y position
        Reg_Write(0x0006,0x00c5);//DAC_OP_CTRL2
        delay_ms(10); //延時

        }

        //打點函數(shù)
        void Dadian(uint Xposition, uint Yposition,uint n)
        {
        uintnum ;
        LCD_SetRamAddr(Xposition,Xposition,Yposition ,Yposition);
        for(num=2;num>0;num--)
        LCD_Wirte_Data16(colors[n]);
        }

        void Xiexian(uint x1,uint y1,uint x2,uint y2,uint color)
        {
        uint t;
        int xerr=0,yerr=0,delta_x,delta_y,distance;
        int incx,incy;
        uint row,col;
        delta_x = x2-x1;//計算坐標增量
        delta_y = y2-y1;
        col=x1;
        row=y1;
        if(delta_x>0) incx=1;//設置單步方向
        else
        {
        if(delta_x==0) incx=0;//垂直線
        else {incx=-1;delta_x=-delta_x;}
        }
        if(delta_y>0)incy=1;
        else
        {
        if(delta_y==0) incy=0;//水平線
        else
        {
        incy=-1;
        delta_y=-delta_y;
        }
        }
        if(delta_x>delta_y) distance=delta_x;//選取基本增量坐標軸
        else distance=delta_y;

        for(t=0;t<=distance+1;t++)
        {//畫線輸出
        Dadian(col, row, color);
        xerr+=delta_x;
        yerr+=delta_y;
        if(xerr>distance)
        {
        xerr-=distance;
        col+=incx;
        }
        if(yerr>distance)
        {
        yerr-=distance;
        row+=incy;
        }
        }
        }
        void main()
        {
        P2 = 0xff;
        P0 = 0xff;
        LCD_init();
        while(1)
        {
        Xiexian(0,0,100,160,0);
        }
        }



        關鍵詞: TFT任意斜率直

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 马公市| 商水县| 宁阳县| 石屏县| 资阳市| 清镇市| 新竹县| 江阴市| 栾川县| 太仆寺旗| 宜都市| 南召县| 渝北区| 宿州市| 大庆市| 印江| 石嘴山市| 江安县| 上栗县| 四平市| 堆龙德庆县| 田林县| 吕梁市| 大姚县| 伊金霍洛旗| 灌云县| 格尔木市| 马边| 龙泉市| 大悟县| 曲松县| 柳林县| 蚌埠市| 平顶山市| 察雅县| 修文县| 县级市| 五河县| 博爱县| 柳河县| 霍山县|