12864并行顯示- /*********************************************************
- 功 能:12864并行驅動畫任意線段和園以及圖片.漢字程序
- 單片機:STC12C5A60S2
- 晶 振:11.0592M
- 時 間:2017-3-1
- 作 者:蘇義江修改整理(感謝前輩的辛苦)
- 注 釋:在多功能試驗板成功顯示
- *****************************************************/
- #include<stc12c5a60s2.h>
- #include<stdlib.h>
- #include<math.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define pi 3.1415926
- #define LCDDATA P0
- sbit RS = P2^7;
- sbit RW = P2^6;
- sbit EN = P2^5;
- uchar code hanz[]= {"玩轉12864!"};
- uchar code hanz2[]={"蘇義江愛好單片機"};
- uchar code logo[]= {
- //取模方式:縱向字節倒序
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x0F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFC,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3F,0xFF,0xC3,
- 0xFC,0x00,0x30,0x00,0x06,0x00,0xE0,0x06,0x66,0x19,0x8C,0x31,
- 0x00,0x3F,0xFF,0xC3,0xFC,0x00,0x30,0x00,0x06,0x00,0xE0,0x06,
- 0x66,0x19,0x8C,0x31, 0x00,0x3F,0xFE,0x01,0xFE,0x02,0x39,0x00,
- 0x06,0x00,0xC0,0x0C,0x62,0x19,0x8C,0x31, 0x00,0x3F,0xF8,0x00,
- 0xFE,0x07,0x31,0x80,0xFC,0x00,0xC0,0x0C,0x62,0x19,0x8C,0x31,
- 0x00,0x3F,0xF0,0x00,0xFE,0x06,0x31,0x80,0x78,0x00,0xC0,0x0C,
- 0x66,0x1D,0xDC,0x31, 0x00,0x3F,0xE0,0x01,0xFE,0x06,0x31,0x80,
- 0x30,0x00,0xC0,0x0C,0x00,0x19,0xCC,0x30, 0x00,0x3F,0xC0,0x03,
- 0xFE,0x07,0x39,0x80,0x38,0x00,0xC0,0x1F,0x00,0x18,0x8C,0x00,
- 0x00,0x3F,0xC0,0x03,0xFE,0x07,0x39,0x80,0x38,0x00,0xC0,0x1F,
- 0x00,0x18,0x8C,0x00, 0x00,0x3F,0xC0,0x3F,0xFE,0x06,0x31,0x80,
- 0x38,0x00,0xC0,0x3D,0x18,0x19,0x8C,0x0C, 0x00,0x3F,0x80,0x7F,
- 0xFE,0x06,0x31,0x80,0x38,0x00,0xE0,0x3D,0x18,0x19,0x8C,0x1C,
- 0x00,0x3F,0x80,0xFF,0xFE,0x06,0x31,0x80,0x18,0x00,0xE0,0x3D,
- 0x18,0x19,0x8C,0x3C, 0x00,0x3F,0x81,0xF3,0xFE,0x07,0x31,0x80,
- 0x38,0x00,0xE0,0x3F,0x18,0x19,0xD8,0x0C, 0x00,0x3F,0x81,0xF3,
- 0xFE,0x07,0x31,0x80,0x38,0x00,0xE0,0x3F,0x18,0x19,0xD8,0x0C,
- 0x00,0x3F,0x03,0xC1,0xFE,0x00,0x30,0x00,0x30,0x00,0xE0,0x3F,
- 0x18,0x18,0x00,0x0C, 0x00,0x3F,0x03,0xC0,0xFE,0x00,0x30,0x01,
- 0xF0,0x00,0xE0,0x35,0x18,0x1C,0x00,0x0C, 0x00,0x3F,0x03,0x80,
- 0xFE,0x00,0x3C,0x80,0x00,0x00,0xE0,0x0C,0x18,0x0C,0x00,0x18,
- 0x00,0x3F,0x03,0x80,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x3F,0x03,0x80,0xFE,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3F,0x03,0xC0,
- 0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x3F,0x01,0xC1,0xFE,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF, 0x00,0x3F,0x81,0xFF,0xFE,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3F,0x80,0xFF,
- 0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x3F,0x80,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x3F,0x80,0x7F,0xFE,0x00,0x00,0x00,
- 0x00,0x00,0x08,0x08,0x00,0x00,0x00,0x00, 0x00,0x3F,0xC0,0x0F,
- 0xFE,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x3F,0xE0,0x01,0xFE,0x01,0x01,0x80,0x00,0x60,0x10,0xD0,
- 0x00,0x00,0x00,0x00, 0x00,0x3F,0xF0,0x01,0xFE,0x04,0x44,0x4C,
- 0x89,0xB1,0x93,0x70,0x00,0x00,0x00,0x00, 0x00,0x3F,0xF8,0x00,
- 0xFE,0x0C,0x4C,0x4D,0xD3,0x1B,0x12,0x30,0x78,0xE3,0xF8,0x3C,
- 0x00,0x3F,0xF8,0x00,0xFE,0x0C,0x4C,0x4D,0xD3,0x1B,0x12,0x30,
- 0x78,0xE3,0xF8,0x3C, 0x00,0x3F,0xFC,0x01,0xFE,0x0F,0xCF,0xC5,
- 0xF2,0x12,0x24,0x30,0x81,0x16,0x48,0x60, 0x00,0x3F,0xFF,0x01,
- 0xFE,0x08,0x08,0x06,0x62,0x12,0x24,0x20,0x82,0x14,0x88,0x40,
- 0x00,0x3F,0xFF,0xFF,0xFE,0x08,0x08,0x06,0x63,0x26,0x26,0x60,
- 0x83,0x24,0x88,0x40, 0x00,0x0F,0xFF,0xFF,0xFE,0x07,0x07,0x04,
- 0x41,0xC4,0x63,0xE4,0x71,0xC0,0x92,0x39, 0x00,0x0F,0xFF,0xFF,
- 0xFE,0x07,0x07,0x04,0x41,0xC4,0x63,0xE4,0x71,0xC0,0x92,0x39,
- 0x00,0x07,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00 }; //圖像數據
- void delay(uchar i)
- {
- for(;i>0;i--);
- }
- void delayms( uint i)
- {
- uint j;
- for(;i>0;i--)
- { for(j=1000;j>0;j--);}
- }
- //寫指令
- void writecmd(uchar cmd)//寫指令
- {
- LCDDATA=0x00;
- RW=0;
- RS=0;
- EN=0;
- LCDDATA=cmd;
- delay(2);
- EN=1;
- delay(20);
- EN=0;
- delay(20);
- }
- //寫數據
- void writedate(uchar date)
- {
- //while((readstatus() &0x80 )!=0x00);
- LCDDATA=0x00;
- RW=0;
- RS=1;
- EN=0;
- LCDDATA=date;
- delay(2);
- EN=1;
- delay(20);
- EN=0;
- delay(20);
- }
- //讀12864內部數據
- uchar readdate()
- {
- uchar i;
- //while((readstatus() &0x80 )!=0x00);
-
- RW=1;
- RS=1;
- EN=0;
- delay(10);
- EN=1;
- LCDDATA=0xff;
- delay(10);
- EN=0;
-
- EN=1;
- LCDDATA=0;
- delay(10);
-
- delay(10);
- EN=0;
- i=LCDDATA;
- return i;
- }
- /*******************************************
- 函數名稱:LCD_init
- 功 能: 初始化LCD
- 參 數:無
- 返回值 :無
- ********************************************/
- void LCD_init()
- {
- delayms(30);
- writecmd(0x30);
-
- delay(20);
-
- writecmd(0x30);
- delay(20);
-
- writecmd(0x0c);
-
- delay(20);
-
- writecmd(0x01);
-
- delay(20);
-
- writecmd(0x06);
-
- delay(20);
- }
- //功 能:指定地址輸入指定個數的字
- //addr表示地址 * pt表示數據 num表示數據或漢字個數
- void Disp_HZ(uchar addr,const uchar * pt,uchar num)
- {
- uchar i;
- writecmd(addr);
- for(i = 0;i < (num*2);i++)
- {
- writedate(*(pt++));
- delayms(1);
- }
- }
- //清內部隨機數據
- void Clear_GDRAM(void)
- {
- uchar x,y,i,j;
- writecmd(0x34); //打開擴展指令集
- y=0x80;
- x=0x80;
- for(i=0;i<32;i++)
- {
- writecmd(y);
- writecmd(x);
- for(j=0;j<16;j++)
- {
- writedate(0x00);
- delay(30);
- }
- y++;
- }
- y=0x80;
- x=0x88;
- for(i=0;i<32;i++)
- {
- writecmd(y);
- writecmd(x);
- for(j=0;j<16;j++)
- {
- writedate(0x00);
- delay(30);
- }
- y++;
- }
- writecmd(0x30); //回到基本指令集
-
- }
- //畫圖片
- void Draw_PM(uchar *ptr)
- {
- uint x=0;
- uchar i,j;
- writecmd(0x34); //擴展指令動作
- writecmd(0x36); //擴展指令動作
- for(i=0;i<32;i++) //上半屏顯示
- {
- writecmd(0x80|i); //列位置
- writecmd(0x80); //行位置
- for(j=0;j<16;j++) //256/8=32 byte
- { //列位置每行自動增加
- writedate(*ptr);
- ptr++;
- }
- }
- for(i=0;i<32;i++) //下半屏顯示
- {
- writecmd(0x80|i); //列位置
- writecmd(0x88); //行位置
- for(j=0;j<16;j++) //256/8=32 byte
- {
- writedate(*ptr);
- ptr++;
- }
- }
- writecmd(0x30);
- }
- /*************************************
- 功能描述: 讀取繪圖RAM中指定坐標的數據
- ** 說 明: 參數輸入坐標地址,
- 讀取后從坐標地址參數位返回數據,所以,
- 地址參數在輸入前須使用
- ****************************************
- void LCD_Read_dat_I(uchar *xp,uchar *yp)
- {
- writecmd(*yp); //寫豎坐標(0x80-0x9f)
- writecmd(*xp); //寫橫坐標(AC地址) 上半屏(0x80-0x87) 下半屏(0x88-0x90)
- readdate(); //試讀
- *xp=readdate(); //讀高字節并返回給xp
- *yp=readdate(); //讀低字節并返回給yp
- }
- */
- /*************************************
- //畫點 在整個屏幕上畫一個點 X 0~127 Y 0~63
- 功能描述: 指定坐標點畫點
- ** 輸 入: unsigned char xp,unsigned char yp,bit dat
- X,Y行列坐,dat 1寫或0擦除
- *******************************************/
- /*
- void Draw_point(uchar xp,uchar yp,bit dat)
- {
- uchar xd,rx,ry;
-
- xd=xp/0x10; //計算橫坐標AC步進
- xp%=0x10; //計算AC地址位偏移
- xp++;
- writecmd(0x34);
- writecmd(0x36);
- if(yp>31)
- { //如果yp大于31選下半屏
- yp-=32; //計算yp在下半屏的豎向坐標
- yp+=0x80; //地址命名
- xd+=0x88; //下半屏起點地址是0x88,地址命名
- }
- else
- { //選上半屏
- yp+=0x80; //地址命名
- xd+=0x80; //上半屏起點地址是0x80,地址命名
- }
- rx=xd;ry=yp; //取AC數據函數需要兩個參數返回數據,且參數公用地址,所以使用零時變量
- LCD_Read_dat_I(&rx,&ry); //取當前字節數據
- writecmd(yp); //重指定當前y地址
- writecmd(xd); //重指定當前x地址
- if(dat)
- { //如果是畫點
- if(xp<=8)
- { //如果當前畫點坐標在AC地址數據對應的高字節(取余計算結果與字節移位方向相反)
- writedate(rx|(0x01<<(8-xp)));//讀取的高位數據與翻轉的指定位進行與操作后寫入高位
- writedate(ry); //讀取的低位數據原樣寫回
- }
- else
- { //如果當前畫點坐標在AC地址數據對應的低字節(取余計算結果與字節移位方向相反)
- writedate(rx); //讀取的高位數據原樣寫回
- writedate(ry|(0x01<<(16-xp))); //讀取的低位數據與指定位進行或操作后寫入低位
- }
- }
- else
- { //如果是擦除圖像
- if(xp<=8)
- { //如果當前畫點坐標在AC地址數據對應的高字節(取余計算結果與字節移位方向相反)
- writedate(rx&~(0x01<<(8-xp)));//讀取的高位數據與翻轉的指定位進行與操作后寫入高位
- writedate(ry); //讀取的低位數據原樣寫回
- }
- else
- { //如果當前畫點坐標在AC地址數據對應的低字節(取余計算結果與字節移位方向相反)
- writedate(rx); //讀取的高位數據原樣寫回
- writedate(ry&~(0x01<<(16-xp))); //讀取的低位數據與翻轉的指定位進行與操作后寫入低位
- }
- }
- writecmd(0x30);
- }
- */
- void Draw_point(uchar X,uchar Y,uchar clour)
- // X行 Y列 clour為0時畫點 為其它清除這個點
- {
- uchar x_pos,y_pos,x_bit;
- uint read_data1,read_data2,dat1,dat2;
- //計算LCD位置
- writecmd(0x34);
- writecmd(0x36);
- x_pos=X/16; //取16*16首地址
- if(Y>31)
- x_pos+=8; //計算該點所屬LCD液晶中X坐標位置,上半屏0-7,下半屏8-15
- x_bit=X%16; //該點位于所在16bit中的第幾位
- y_pos=Y%32;
- // writecmd(0x34);
- writecmd(0x36);
- writecmd(0x80+y_pos);
- writecmd(0x80+x_pos);
- readdate(); //此處為什么要中上不知道為什么????
- read_data1 = readdate(); //高八位!
- read_data2 = readdate(); //低八位!
- if(x_bit<8)
- {
- if(clour==0)
- {
- dat1=read_data1|(1<<(7-x_bit));
- }
- else
- {
- dat1=read_data1&~(1<<(7-x_bit));
- }
- dat2=read_data2;
- }
- else
- {
- dat1=read_data1;
- if(clour==0)
- {
- dat2=read_data2|(1<<(15-x_bit));
- }
-
- else
- {
- dat2=read_data2&~(1<<(15-x_bit));
- }
- }
- writecmd(0x36);
- writecmd(0x80+y_pos);
- writecmd(0x80+x_pos);
- writedate(dat1);
- writedate(dat2);
- writecmd(0x30);
- }
- //畫直線X1行起點X2行終點 Y列 clour為0時畫點 為其它清除這個點
- void Draw_zhi(uchar X1,uchar X2,uchar Y,uchar clour)
- {
- uchar i,temp ;
- if(X1>X2) //X軸上,起點大于終點,交換數據
- {
- temp=X2;
- X2=X1;
- X1=temp;
- }
- for(i=X1;i<=X2;i++)
- {
- Draw_point(i,Y,clour);
- }
- }
- //畫豎線 X行 Y1列起點點 Y2列終點 clour為0時畫點 為其它清除這個點
- void Draw_shu(uchar X,uchar Y1,uchar Y2,uchar clour)
- {
- uchar i ,temp;
- if(Y1>Y2) //X軸上,起點大于終點,交換數據
- {
- temp=Y2;
- Y2=Y1;
- Y1=temp;
- }
- for(i=Y1;i<=Y2;i++)
- {
- Draw_point(X,i,clour);
- }
- }
- /*******************************************
- 函數名稱:Draw_line
- 功 能:在整個屏幕上畫一條線 任一的角度都可以畫線。。。
- 參 數:ptr--指向保存圖片位置的指針
- 返回值 :無
- clour為0時畫點 為其它清除這個點
- ********************************************/
- void Draw_line(uchar x0,uchar y0,uchar x1,uchar y1,uchar clour)
- {
- int dx,dy; //定義X.Y軸上增加的變量值
- int sub;
- int temp; //起點、終點大小比較,交換數據時的中間變量
- uchar flag;
- if(x0>x1) //X軸上,起點大于終點,交換數據
- {
- temp=x1;
- x1=x0;
- x0=temp;
- temp=y1;
- y1=y0;
- y0=temp;
- }
- dx=x1-x0; //X軸方向上的增量
- dy=y1-y0; //Y軸方向上的增量
- if(dx==0)
- Draw_shu(x0,y0,y1,clour);
- if(dy==0)
- Draw_zhi(x0,x1,y0,clour);
- if(dy>0)
- flag=1;
- else
- flag=0;
- if((dx!=0)&&(dy!=0))
- {
- /* 布蘭森漢姆(Bresenham)算法畫線 */
- if(flag==1)
- {
- if(dx>=dy) //靠近X軸
- {
- sub=2*dy-dx; //計算下個點的位置
- while(x0!=x1)
- {
- Draw_point(x0,y0,clour); //畫起點
- x0++; // X軸上加1
- if(sub>0) // 判斷下下個點的位置
- {
- y0++; // 為右上相鄰點,即(x0+1,y0+1)
- sub+=2*dy-2*dx;
- }
- else
- sub+=2*dy; // 判斷下下個點的位置
- }
- Draw_point(x0,y0,clour);
- }
- else
- {
- sub=2*dy-dx; //靠近Y軸
- while(y0!=y1)
- {
- Draw_point(x0,y0,clour); //畫起點
- y0++;
- if(sub>0) //判斷下下個點的位置
- {
- x0++;
- sub+=2*dx-2*dy;
- }
- else
- sub+=2*dx;
- }
- Draw_point(x0,y0,clour);
- }
- }
- else
- {
- dy=y0-y1;
- if(dx>=dy) //靠近X軸
- {
- sub=2*dy-dx; //計算下個點的位置
- while(x0!=x1)
- {
- Draw_point(x0,y0,clour); //畫起點
- x0++; // X軸上加1
- if(sub>0) // 判斷下下個點的位置
- {
- y0--; // 為右上相鄰點,即(x0+1,y0+1)
- sub+=2*dy-2*dx;
- }
- else
- sub+=2*dy; // 判斷下下個點的位置
- }
- Draw_point(x0,y0,clour);
- }
- else
- {
- sub=2*dx-dy; //靠近Y軸
- while(y0!=y1)
- {
- Draw_point(x0,y0,clour); //畫起點
- y0--;
- if(sub>0) //判斷下下個點的位置
- {
- x0++;
- sub+=2*dx-2*dy;
- }
- else
- sub+=2*dx;
- }
- Draw_point(x0,y0,clour);
- }
- }
- }
- }
- /****************************
- //畫任意線
- 功能:任意兩點間的直線。根據硬件特點,實現加速。
- * 入口參數:x0 直線起點所在行的位置
- * y0 直線起點所在列的位置
- * x1 直線終點所在行的位置
- ‘ y1 直線終點所在列的位置
- 說明:操作失敗原因是指定地址超出緩沖區范圍。
- ******************************
- void GUI_Line8(uchar x0,uchar y0,uchar x1,uchar y1)
- {
- int temp;
- int dx,dy; //定義起點到終點的橫、縱坐標增加值
- int s1,s2,status,i;
- int Dx,Dy,sub;
- dx=x1-x0;
- if(dx>=0) //X的方向是增加的
- s1=1;
- else //X的方向是降低的
- s1=-1;
- dy=y1-y0; //判斷Y的方向是增加還是降到的
- if(dy>=0)
- s2=1;
- else
- s2=-1;
-
- Dx=fabs(x1-x0); //計算橫、縱標志增加值的絕對值
- Dy=fabs(y1-y0);
- if(Dy>Dx) //
- { //以45度角為分界線,靠進Y軸是status=1,靠近X軸是status=0
- temp=Dx;
- Dx=Dy;
- Dy=temp;
- status=1;
- }
- else
- status=0;
- //////////判斷垂直線和水平線////////////
- if(dx==0) //橫向上沒有增量,畫一條水平線
- Draw_zhi(x0,y0,y1,1);
- if(dy==0) //縱向上沒有增量,畫一條垂直線
- Draw_shu(x0,y0,x1,1);
- //////////Bresenham算法畫任意兩點間的直線//////////
- sub=2*Dy-Dx; //第1次判斷下個點的位置
- for(i=0;i<Dx;i++)
- {
- Draw_point(x0,y0,1); //畫點
- if(sub>=0)
- {
- if(status==1) //在靠近Y軸區,x值加1
- x0+=s1;
- else //在靠近X軸區,y值加1
- y0+=s2;
- sub-=2*Dx; //判斷下下個點的位置
- }
- if(status==1)
- y0+=s2;
- else
- x0+=s1;
- sub+=2*Dy;
-
- }
- }
- */
- /*********************************************************
- 畫圓算法
- x0表示行的地址 y0表示列的地址 r表示圓的半徑
- ****************************************/
- void Draw_yuan(uchar x0,uchar y0,uchar r)
- {
- int a,b;
- int di;
- a=0;
- b=r; //a=0,與b=r為圓的起始點!然后往下走!!
- di=3-2*r; //判斷下個點位置的標志 ??
- while(a<=b) //里面執行完了說明八分之一個圓畫完啦!
- {
- Draw_point(x0-b,y0-a,0); //3
- Draw_point(x0+b,y0-a,0); //0
- Draw_point(x0-a,y0+b,0); //1
- Draw_point(x0-b,y0-a,0); //7
- Draw_point(x0-a,y0-b,0); //2
- Draw_point(x0+b,y0+a,0); //4
- Draw_point(x0+a,y0-b,0); //5
- Draw_point(x0+a,y0+b,0); //6
- Draw_point(x0-b,y0+a,0);
- a++;
- /***使用Bresenham算法畫圓**/
- if(di<0)
- di +=4*a+6;
- else
- {
- di+=10+4*(a-b);
- b--;
- }
- Draw_point(x0+a,y0+b,0); //可在此處做想法。!
- }
- }
- void main()
- {
- delayms(100);
- LCD_init();
- Clear_GDRAM();//必須清2遍徹底清除RAM內數據
- delayms(50);
- Clear_GDRAM();//必須清2遍徹底清除RAM內數據
- delayms(50);
- writecmd(0x01);//加上清楚命令
- delayms(50);
- while(1)
- {
- Draw_zhi(65,126,60,0);//直線
- Draw_shu(65,124,0,0);//豎線
- Draw_line(66,0,120,63,0);//畫任意線
- Draw_line(66,0,120,30,0);//畫任意線
- Draw_yuan(31,31,30);//左半屏畫圓
- delayms(6000);
- Clear_GDRAM();
- delayms(60);
- Disp_HZ(0x90+2,hanz,5);//顯示漢字
- Disp_HZ(0x98,hanz2,8);//顯示漢字
- delayms(6000);
- writecmd(0x01);//加上清楚命令
- delayms(50);
- Draw_PM(logo);//顯示圖片
- delayms(6000);
- Clear_GDRAM();
- delayms(60);
- }
- }
復制代碼
|