Guest User

Untitled

a guest
Jan 7th, 2014
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.04 KB | None | 0 0
  1. /* Testing code for driving UG2828GDEAF01 1,5# OLED
  2. ZhangFeng, PRC.
  3. http://vfdclock.jimdo.com
  4. 09-12-2013
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <math.h>
  9.  
  10. #define FASTIO 0
  11.  
  12. // 4-wire SPI(BS1=0; BS2=0)
  13. #define RST_PIN 8
  14. #define CS_PIN 9
  15. #define DC_PIN 10
  16. #define DIN_PIN 11
  17. #define CLK_PIN 12
  18. #define HVEN_PIN 13
  19.  
  20. #define DODELAY __asm__("nop\n\t""nop\n\t");
  21. #define COUNTOF(arr) (sizeof(arr) / sizeof(arr[0]))
  22.  
  23. #ifndef FASTIO
  24. // rst
  25. #define OLED_RES_1 digitalWrite(RST_PIN, HIGH)
  26. #define OLED_RES_0 digitalWrite(RST_PIN, LOW)
  27. // cs
  28. #define OLED_CS_1 digitalWrite(CS_PIN, HIGH)
  29. #define OLED_CS_0 digitalWrite(CS_PIN, LOW)
  30. // DC (Data or Command)
  31. #define OLED_DC_1 digitalWrite(DC_PIN, HIGH)
  32. #define OLED_DC_0 digitalWrite(DC_PIN, LOW)
  33. // data in
  34. #define OLED_DIN_1 digitalWrite(DIN_PIN, HIGH)
  35. #define OLED_DIN_0 digitalWrite(DIN_PIN, LOW)
  36. // clock
  37. #define OLED_CLK_1 digitalWrite(CLK_PIN, HIGH)
  38. #define OLED_CLK_0 digitalWrite(CLK_PIN, LOW)
  39.  
  40. // HVEN(optional)
  41. #define OLED_HVEN_1 digitalWrite(HVEN_PIN, HIGH)
  42. #define OLED_HVEN_0 digitalWrite(HVEN_PIN, LOW)
  43. #else
  44. // Fast IO version
  45. // pin map please check: http://arduino.cc/en/Hacking/Atmega168Hardware
  46. // pin11 = pb3; pin12 = pb4; pin15 = pb5
  47. #define GPIO_Pin_0 (0x01) /* Pin 0 selected */
  48. #define GPIO_Pin_1 (0x02) /* Pin 1 selected */
  49. #define GPIO_Pin_2 (0x04) /* Pin 2 selected */
  50. #define GPIO_Pin_3 (0x08) /* Pin 3 selected */
  51. #define GPIO_Pin_4 (0x10) /* Pin 4 selected */
  52. #define GPIO_Pin_5 (0x20) /* Pin 5 selected */
  53. #define GPIO_Pin_6 (0x40) /* Pin 6 selected */
  54. #define GPIO_Pin_7 (0x80) /* Pin 7 selected */
  55.  
  56. #define RES_PORT PORTB
  57. #define CS_PORT PORTB
  58. #define DC_PORT PORTB
  59. #define DIN_PORT PORTB
  60. #define CLK_PORT PORTB
  61. #define HVEN_PORT PORTB
  62. #define RES_PORTPIN GPIO_Pin_0
  63. #define CS_PORTPIN GPIO_Pin_1
  64. #define DC_PORTPIN GPIO_Pin_2
  65. #define DIN_PORTPIN GPIO_Pin_3
  66. #define CLK_PORTPIN GPIO_Pin_4
  67. #define HVEN_PORTPIN GPIO_Pin_5
  68.  
  69. #define OLED_RES_1 RES_PORT |= (RES_PORTPIN)
  70. #define OLED_RES_0 RES_PORT &= ~(RES_PORTPIN)
  71. #define OLED_CS_1 CS_PORT |= (CS_PORTPIN)
  72. #define OLED_CS_0 CS_PORT &= ~(CS_PORTPIN)
  73. #define OLED_DC_1 DC_PORT |= (DC_PORTPIN)
  74. #define OLED_DC_0 DC_PORT &= ~(DC_PORTPIN)
  75. #define OLED_DIN_1 DIN_PORT |= (DIN_PORTPIN)
  76. #define OLED_DIN_0 DIN_PORT &= ~(DIN_PORTPIN)
  77. #define OLED_CLK_1 CLK_PORT |= (CLK_PORTPIN)
  78. #define OLED_CLK_0 CLK_PORT &= ~(CLK_PORTPIN)
  79. #define OLED_HVEN_1 HVEN_PORT |= (HVEN_PORTPIN)
  80. #define OLED_HVEN_0 HVEN_PORT &= ~(HVEN_PORTPIN)
  81. #endif
  82.  
  83. #define Max_Column 0x7f // 128-1
  84. #define Max_Row 0x7f // 128-1
  85. #define Brightness 0x0F
  86.  
  87. #define MAKECOLOR64k(r,g,b) (unsigned short int)((((unsigned short int)(r)>>3)<<11)|(((unsigned short int)(g)>>2)<<5)|((unsigned short int)(b)>>3))
  88.  
  89. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  90. // Delay Time
  91. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  92. void uDelay(unsigned char l)
  93. {
  94. while(l--)
  95. {
  96. __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
  97. __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
  98. };
  99. }
  100.  
  101. void Write_Command(unsigned char Data)
  102. {
  103. unsigned char i;
  104. OLED_CS_0;
  105. OLED_DC_0;
  106. for (i=0; i<8; i++)
  107. {
  108. OLED_CLK_0;
  109. //((Data&0x80)>>7)?OLED_DIN_1:OLED_DIN_0;
  110. if((Data&0x80)>>7)
  111. OLED_DIN_1;
  112. else
  113. OLED_DIN_0;
  114. Data = Data << 1;
  115. uDelay(1);
  116. OLED_CLK_1;
  117. uDelay(1);
  118. }
  119. OLED_CLK_0;
  120. OLED_DC_1;
  121. OLED_CS_1;
  122. }
  123.  
  124. void Write_Data(unsigned char Data)
  125. {
  126. unsigned char i;
  127.  
  128. OLED_CS_0;
  129. OLED_DC_1;
  130. for (i=0; i<8; i++)
  131. {
  132. OLED_CLK_0;
  133. if((Data&0x80)>>7)
  134. OLED_DIN_1;
  135. else
  136. OLED_DIN_0;
  137. Data = Data << 1;
  138. uDelay(1);
  139. OLED_CLK_1;
  140. uDelay(1);
  141. }
  142. OLED_CLK_0;
  143. OLED_DC_1;
  144. OLED_CS_1;
  145. }
  146.  
  147. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  148. // Gray Scale Table Setting (Full Screen)
  149. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  150. void Set_Gray_Scale_Table(void)
  151. {
  152. Write_Command(0xB8);
  153. Write_Data(0x01); // Gray Scale Level 1
  154. Write_Data(0x03); // Gray Scale Level 3
  155. Write_Data(0x05); // Gray Scale Level 5
  156. Write_Data(0x07); // Gray Scale Level 7
  157. Write_Data(0x0B); // Gray Scale Level 9
  158. Write_Data(0x10); // Gray Scale Level 11
  159. Write_Data(0x16); // Gray Scale Level 13
  160. Write_Data(0x1A); // Gray Scale Level 15
  161. Write_Data(0x1F); // Gray Scale Level 17
  162. Write_Data(0x24); // Gray Scale Level 19
  163. Write_Data(0x29); // Gray Scale Level 21
  164. Write_Data(0x2E); // Gray Scale Level 23
  165. Write_Data(0x33); // Gray Scale Level 25
  166. Write_Data(0x38); // Gray Scale Level 27
  167. Write_Data(0x3D); // Gray Scale Level 29
  168. Write_Data(0x42); // Gray Scale Level 31
  169. Write_Data(0x47); // Gray Scale Level 33
  170. Write_Data(0x4C); // Gray Scale Level 35
  171. Write_Data(0x51); // Gray Scale Level 37
  172. Write_Data(0x56); // Gray Scale Level 39
  173. Write_Data(0x5A); // Gray Scale Level 41
  174. Write_Data(0x5E); // Gray Scale Level 43
  175. Write_Data(0x62); // Gray Scale Level 45
  176. Write_Data(0x65); // Gray Scale Level 47
  177. Write_Data(0x68); // Gray Scale Level 49
  178. Write_Data(0x6B); // Gray Scale Level 51
  179. Write_Data(0x6E); // Gray Scale Level 53
  180. Write_Data(0x71); // Gray Scale Level 55
  181. Write_Data(0x74); // Gray Scale Level 57
  182. Write_Data(0x77); // Gray Scale Level 59
  183. Write_Data(0x7A); // Gray Scale Level 61
  184. Write_Data(0x7D); // Gray Scale Level 63
  185. }
  186.  
  187. void Clear_Window(unsigned char a, unsigned char b, unsigned char c, unsigned char d)
  188. {
  189. Write_Command(0x8E);
  190. Write_Data(a); // Column Address of Start
  191. Write_Data(c); // Row Address of Start
  192. Write_Data(b); // Column Address of End
  193. Write_Data(d); // Row Address of End
  194. delay(10); // delay 5ms for its drawing
  195. }
  196.  
  197.  
  198. void OLED_InitIOs(void)
  199. {
  200. OLED_RES_1;
  201. OLED_CS_1;
  202. OLED_CLK_1;
  203. OLED_DIN_1;
  204. OLED_DC_1;
  205. }
  206.  
  207. //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  208. // Initialization
  209. //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  210. void OLED_Init(void)
  211. {
  212. unsigned char i;
  213.  
  214. OLED_RES_0;
  215. for(i=0;i<200;i++)
  216. {
  217. delay(1); // delay
  218. }
  219. OLED_RES_1;
  220.  
  221. // Display Off (0x00/0x01)
  222. Write_Command(0xAE);
  223. Write_Command(0xA0);
  224. Write_Data(0x74); // [0x74]: 64k Colors Mode; [0xB4]:262k Colors Mode;256 Colors Mode (0x34)
  225. Write_Command(0xA1);
  226. Write_Data(0x00);
  227. Write_Command(0xA2);
  228. Write_Data(0x80);
  229. Write_Command(0xA6);
  230. Write_Command(0xAD);
  231. Write_Data(0x8E);
  232. Write_Command(0xB0);
  233. Write_Data(0x05);
  234. Write_Command(0xB1);
  235. Write_Data(0x11);
  236. Write_Command(0xB3);
  237. Write_Data(0xF0);
  238. // gray table
  239. Set_Gray_Scale_Table();
  240.  
  241. Write_Command(0xBB);
  242. Write_Data(0x1C);
  243. Write_Data(0x1C);
  244. Write_Data(0x1C);
  245.  
  246. Write_Command(0xBE);
  247. Write_Data(0x3F);
  248.  
  249. Write_Command(0xC1);
  250. Write_Data(0xDC);
  251. Write_Data(0xD2);
  252. Write_Data(0xFF);
  253.  
  254. Write_Command(0xC7);
  255. Write_Data(0x0A);
  256.  
  257. Write_Command(0xCA);
  258. Write_Data(0x7F);
  259.  
  260. Write_Command(0xAF);
  261. }
  262.  
  263. void EnableFill(unsigned char d)
  264. {
  265. Write_Command(0x92);
  266. Write_Data(!!d); // Default => 0x00
  267. }
  268.  
  269. //===============================================================================//
  270. // Graphic Acceleration(by hardware)
  271. //===============================================================================//
  272. void Draw_Line64k(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned short int col)
  273. {
  274. Write_Command(0x83);
  275. Write_Data(x1); // Column Address of Start
  276. Write_Data(y1); // Row Address of Start
  277. Write_Data(x2); // Column Address of End
  278. Write_Data(y2); // Row Address of End
  279. Write_Data(col>>8); // Line Color - CCCCCBBB
  280. Write_Data(col&0xff); // Line Color - BBBAAAAA
  281. delay(1); // delay 5ms for its drawing
  282. }
  283.  
  284. void Draw_Rectangle64k(unsigned char xLeft, unsigned char yTop, unsigned char xRight, unsigned char yBottom, unsigned short int colOutline, unsigned short int colFill)
  285. {
  286. Write_Command(0x84);
  287. Write_Data(xLeft);
  288. Write_Data(yTop);
  289. Write_Data(xRight);
  290. Write_Data(yBottom);
  291. Write_Data(colOutline>>8); // Line Color - CCCCCBBB
  292. Write_Data(colOutline&0xff); // Line Color - BBBAAAAA
  293. Write_Data(colFill>>8); // Line Color - CCCCCBBB
  294. Write_Data(colFill&0xff); // Line Color - BBBAAAAA
  295. delay(2); // delay 5ms for its drawing
  296. }
  297.  
  298. void Draw_Circle64k(unsigned char x, unsigned char y, unsigned char r, unsigned short int colOutline, unsigned short int colFill)
  299. {
  300. Write_Command(0x86);
  301. Write_Data(x); // Column Address of Start
  302. Write_Data(y); // Row Address of Start
  303. Write_Data(r); // Radius
  304. Write_Data(colOutline>>8); // Line Color - CCCCCBBB
  305. Write_Data(colOutline&0xff); // Line Color - BBBAAAAA
  306. Write_Data(colFill>>8); // Fill Color - CCCCCBBB
  307. Write_Data(colFill&0xff); // Fill Color - BBBAAAAA
  308. delay(2); // delay 10ms for its drawing
  309. }
  310.  
  311. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  312. // Show Regular Pattern (Partial or Full Screen)
  313. //
  314. // a: Column Address of Start
  315. // b: Column Address of End
  316. // c: Row Address of Start
  317. // d: Row Address of End
  318. // e: BBBBBGGG
  319. // f: GGGRRRRR
  320. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  321. void Fill_Block64k(unsigned char xLeft, unsigned char yTop, unsigned char xRight, unsigned char yBottom, unsigned short int col)
  322. {
  323. EnableFill(0x01);
  324. Draw_Rectangle64k(xLeft, yTop, xRight, yBottom, col, col);
  325. EnableFill(0x00);
  326. }
  327.  
  328. void Fill_Block64k_Slow(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned short int col)
  329. {
  330. unsigned char i,j;
  331.  
  332. Set_Column_Address(x1,x2);
  333. Set_Row_Address(y1,y2);
  334. Set_Write_RAM();
  335.  
  336. for(i=0;i<(y2-y1+1);i++)
  337. {
  338. for(j=0;j<(x2-x1+1);j++)
  339. {
  340. Write_Data(col>>8); // Line Color - CCCCCBBB
  341. Write_Data(col&0xff); // Line Color - BBBAAAAA
  342. }
  343. }
  344. }
  345.  
  346. void Draw_Point64k_Slow(unsigned char x, unsigned char y, unsigned short int col)
  347. {
  348. Set_Column_Address(x,x);
  349. Set_Row_Address(y,y);
  350. Set_Write_RAM();
  351. Write_Data(col>>8); // Line Color - CCCCCBBB
  352. Write_Data(col&0xff); // Line Color - BBBAAAAA
  353. }
  354.  
  355. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  356. // Show Color Bar (Full Screen)
  357. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  358. void Rainbow(void)
  359. {
  360. // White => Column 1~16
  361. Fill_Block64k(0x00,0x00,0x0F,Max_Row,MAKECOLOR64k(0xFF,0xFF,0xFF));
  362.  
  363. // Yellow => Column 17~32
  364. Fill_Block64k(0x10,0x00,0x1F,Max_Row,MAKECOLOR64k(0xFF,0xFF,0x00));
  365.  
  366. // Purple => Column 33~48
  367. Fill_Block64k(0x20,0x00,0x2F,Max_Row,MAKECOLOR64k(0xFF,0x00,0xFF));
  368.  
  369. // Cyan => Column 49~64
  370. Fill_Block64k(0x30,0x00,0x3F,Max_Row,MAKECOLOR64k(0x00,0xFF,0xFF));
  371.  
  372. // Red => Column 65~80
  373. Fill_Block64k(0x40,0x00,0x4F,Max_Row,MAKECOLOR64k(0xFF,0x00,0x00));
  374.  
  375. // Green => Column 81~96
  376. Fill_Block64k(0x50,0x00,0x5F,Max_Row,MAKECOLOR64k(0x00,0xFF,0x00));
  377.  
  378. // Blue => Column 97~112
  379. Fill_Block64k(0x60,0x00,0x6F,Max_Row,MAKECOLOR64k(0x00,0x00,0xFF));
  380.  
  381. // Black => Column 113~128
  382. Fill_Block64k(0x70,0x00,Max_Column,Max_Row,MAKECOLOR64k(0x00,0x00,0x00));
  383. }
  384. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  385. // Instruction Setting
  386. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  387. void Set_Column_Address(unsigned char a, unsigned char b)
  388. {
  389. Write_Command(0x15);
  390. Write_Data(a); // Default => 0x00
  391. Write_Data(b); // Default => 0x83
  392. }
  393.  
  394. void Set_Row_Address(unsigned char a, unsigned char b)
  395. {
  396. Write_Command(0x75);
  397. Write_Data(a); // Default => 0x00
  398. Write_Data(b); // Default => 0x83
  399. }
  400.  
  401. void Set_Write_RAM(void)
  402. {
  403. Write_Command(0x5C); // Enable MCU to Write into RAM
  404. }
  405.  
  406. //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  407. // Patterns
  408. //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  409. void Show_64k_Pattern_BigEndian(unsigned char *Data_Pointer, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2)
  410. {
  411. unsigned char *Src_Pointer;
  412. unsigned char i,j;
  413.  
  414. Src_Pointer=Data_Pointer;
  415. Set_Column_Address(x1,x2);
  416. Set_Row_Address(y1,y2);
  417. Set_Write_RAM();
  418.  
  419. for(i=0;i<(y2-y1+1);i++)
  420. {
  421. for(j=0;j<(x2-x1+1);j++)
  422. {
  423. Write_Data(*Src_Pointer);
  424. Src_Pointer++;
  425. Write_Data(*Src_Pointer);
  426. Src_Pointer++;
  427. }
  428. }
  429. }
  430.  
  431. void Show_64k_Pattern_LittleEndia(unsigned char *Data_Pointer, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2)
  432. {
  433. unsigned char *Src_Pointer;
  434. unsigned char i,j;
  435.  
  436. Src_Pointer=Data_Pointer;
  437. Set_Column_Address(x1,x2);
  438. Set_Row_Address(y1,y2);
  439. Set_Write_RAM();
  440.  
  441. for(i=0;i<(y2-y1+1);i++)
  442. {
  443. for(j=0;j<(x2-x1+1);j++)
  444. {
  445. Write_Data(*(Src_Pointer+1));
  446. Write_Data(*(Src_Pointer));
  447. Src_Pointer+=2;
  448. }
  449. }
  450. }
  451.  
  452. void Show_256k_Pattern(unsigned char *Data_Pointer, unsigned char a, unsigned char b, unsigned char c, unsigned char d)
  453. {
  454. unsigned char *Src_Pointer;
  455. unsigned char i,j;
  456.  
  457. Src_Pointer=Data_Pointer;
  458. Set_Column_Address(a,b);
  459. Set_Row_Address(c,d);
  460. Set_Write_RAM();
  461.  
  462. for(i=0;i<(d-c+1);i++)
  463. {
  464. for(j=0;j<(b-a+1);j++)
  465. {
  466. Write_Data(*Src_Pointer);
  467. Src_Pointer++;
  468. Write_Data(*Src_Pointer);
  469. Src_Pointer++;
  470. Write_Data(*Src_Pointer);
  471. Src_Pointer++;
  472. }
  473. }
  474. }
  475.  
  476. const unsigned char Icon24x24x64k[] ={
  477. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  478. 0x7b,0xf7,0xd6,0xee,0x73,0xe6,0x52,0xe6,0x51,0xe6,0x93,0xe6,0xd6,0xee,0x7b,0xf7,
  479. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  480.  
  481. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x18,0xef,0x30,0xde,
  482. 0x0e,0xe6,0x6f,0xee,0x8f,0xee,0xd0,0xf6,0xf0,0xf6,0x90,0xee,0x6f,0xee,0x0e,0xe6,
  483. 0x10,0xe6,0xf8,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  484.  
  485. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbd,0xff,0x52,0xe6,0x0e,0xe6,0xf1,0xf6,
  486. 0x50,0xff,0x2e,0xff,0x0c,0xff,0xec,0xfe,0xec,0xfe,0xec,0xfe,0x0d,0xff,0x10,0xff,
  487. 0xd0,0xf6,0x0d,0xe6,0x31,0xe6,0xbd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  488.  
  489. 0xff,0xff,0xff,0xff,0xff,0xff,0x9c,0xf7,0xef,0xdd,0x8f,0xee,0x2f,0xff,0xcb,0xfe,
  490. 0xa8,0xfe,0xc8,0xfe,0xa8,0xfe,0xa8,0xfe,0xa7,0xfe,0xa7,0xfe,0x87,0xfe,0x87,0xfe,
  491. 0x8a,0xfe,0xee,0xfe,0x4d,0xee,0xae,0xdd,0x9d,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,
  492.  
  493. 0xff,0xff,0xff,0xff,0xbd,0xff,0xef,0xdd,0x8e,0xf6,0x0c,0xff,0xa8,0xfe,0xa8,0xfe,
  494. 0xa9,0xfe,0xc8,0xfe,0xa9,0xfe,0xa8,0xfe,0xa8,0xfe,0xa8,0xfe,0x68,0xfe,0x67,0xfe,
  495. 0x66,0xfe,0x66,0xfe,0xaa,0xfe,0x2c,0xee,0xce,0xdd,0xbd,0xff,0xff,0xff,0xff,0xff,
  496.  
  497. 0xff,0xff,0xff,0xff,0x93,0xe6,0x6c,0xee,0x0b,0xff,0xa8,0xfe,0xa9,0xfe,0xc9,0xfe,
  498. 0xa9,0xfe,0xa8,0xfe,0xa8,0xfe,0xa8,0xfe,0xa8,0xfe,0x88,0xfe,0x67,0xfe,0x67,0xfe,
  499. 0x67,0xfe,0x47,0xfe,0x06,0xfe,0x68,0xfe,0x0b,0xee,0x73,0xe6,0xff,0xff,0xff,0xff,
  500.  
  501. 0xff,0xff,0x5a,0xf7,0x0b,0xe6,0xca,0xfe,0xa8,0xfe,0xa9,0xfe,0xc9,0xfe,0xc9,0xfe,
  502. 0xc8,0xfe,0xc8,0xfe,0xa8,0xfe,0xa8,0xfe,0x88,0xfe,0x67,0xfe,0x87,0xfe,0x87,0xfe,
  503. 0x26,0xfe,0x26,0xfe,0x26,0xfe,0x25,0xfe,0x28,0xfe,0xaa,0xe5,0x39,0xef,0xff,0xff,
  504.  
  505. 0xff,0xff,0x52,0xe6,0x89,0xf6,0xe8,0xfe,0xc9,0xfe,0xa9,0xfe,0xa9,0xfe,0x88,0xfe,
  506. 0xc6,0xe5,0x27,0xee,0xa8,0xfe,0x67,0xfe,0x67,0xfe,0x67,0xfe,0xe6,0xed,0x65,0xe5,
  507. 0x26,0xfe,0x26,0xfe,0x26,0xfe,0xe6,0xfd,0xe5,0xfd,0xa6,0xf5,0x31,0xde,0xff,0xff,
  508.  
  509. 0x9d,0xf7,0xeb,0xe5,0x87,0xfe,0xc7,0xfe,0xc8,0xfe,0xa8,0xfe,0xe8,0xfe,0x45,0xd5,
  510. 0xc0,0x8a,0xa2,0xab,0x47,0xf6,0x87,0xfe,0x87,0xfe,0x06,0xf6,0x82,0xa3,0xe1,0x92,
  511. 0x24,0xdd,0x26,0xfe,0xe6,0xfd,0xe5,0xf5,0xa4,0xfd,0x44,0xfd,0x49,0xdd,0x9d,0xf7,
  512.  
  513. 0x19,0xef,0x86,0xe5,0x87,0xfe,0x67,0xfe,0x87,0xfe,0x87,0xfe,0xa7,0xfe,0xe3,0xb3,
  514. 0x80,0x8a,0xc0,0x92,0xa6,0xe5,0x67,0xfe,0x87,0xfe,0x45,0xe5,0xc0,0x92,0xa0,0x8a,
  515. 0x23,0xbc,0x06,0xfe,0xa5,0xf5,0x84,0xf5,0x44,0xf5,0x23,0xfd,0xe4,0xdc,0x39,0xef,
  516.  
  517. 0xd7,0xee,0xc5,0xe5,0x87,0xfe,0x67,0xfe,0x67,0xfe,0x67,0xfe,0x87,0xfe,0x66,0xbc,
  518. 0x00,0x72,0xe2,0x8a,0xc8,0xed,0x06,0xfe,0x06,0xfe,0x87,0xed,0xc2,0x8a,0x40,0x72,
  519. 0x45,0xc4,0xa5,0xfd,0x64,0xf5,0x64,0xf5,0x24,0xf5,0x03,0xfd,0xc3,0xe4,0xd5,0xee,
  520.  
  521. 0x95,0xe6,0xe5,0xed,0x87,0xfe,0x67,0xfe,0x67,0xfe,0x47,0xfe,0x26,0xfe,0x2b,0xf6,
  522. 0xec,0xbc,0x8c,0xd5,0x07,0xfe,0xe5,0xfd,0xc4,0xfd,0xc6,0xfd,0x2b,0xcd,0xab,0xbc,
  523. 0x89,0xf5,0x63,0xfd,0x44,0xf5,0x24,0xf5,0x24,0xf5,0x23,0xfd,0xc2,0xe4,0x73,0xe6,
  524.  
  525. 0xb6,0xee,0xa5,0xed,0x67,0xfe,0x67,0xfe,0x27,0xfe,0x26,0xfe,0x26,0xfe,0x26,0xfe,
  526. 0x8b,0xfe,0x49,0xfe,0xe5,0xfd,0xc6,0xf5,0xa5,0xfd,0x84,0xf5,0xe7,0xfd,0x09,0xfe,
  527. 0x64,0xfd,0x43,0xf5,0x24,0xf5,0x04,0xf5,0x24,0xf5,0x23,0xf5,0xc2,0xe4,0x94,0xe6,
  528.  
  529. 0xf8,0xee,0x85,0xe5,0x46,0xfe,0x27,0xfe,0x26,0xfe,0x25,0xfe,0xe5,0xf5,0xe6,0xf5,
  530. 0xe6,0xfd,0xe6,0xfd,0xe7,0xfd,0xc7,0xfd,0xa7,0xfd,0xa6,0xfd,0x65,0xf5,0x44,0xf5,
  531. 0x24,0xed,0x23,0xfd,0x24,0xfd,0x24,0xf5,0x04,0xf5,0x03,0xfd,0xa3,0xe4,0xf7,0xee,
  532.  
  533. 0x5b,0xf7,0x87,0xe5,0x26,0xfe,0x26,0xfe,0x26,0xfe,0x45,0xdd,0xe6,0xd4,0xe6,0xfd,
  534. 0x07,0xfe,0x29,0xfe,0x2b,0xfe,0x2b,0xfe,0x0b,0xfe,0xe9,0xfd,0xc8,0xfd,0x86,0xfd,
  535. 0xe5,0xe4,0x44,0xcc,0x03,0xf5,0x24,0xf5,0x04,0xf5,0xe3,0xfc,0xc5,0xdc,0x5b,0xf7,
  536.  
  537. 0xff,0xff,0xcd,0xdd,0xe5,0xf5,0x26,0xfe,0xe5,0xf5,0x07,0xcd,0x49,0xdd,0xe5,0xd4,
  538. 0x05,0xdd,0x87,0xed,0xea,0xf5,0x2c,0xfe,0x0c,0xfe,0xa9,0xf5,0x46,0xed,0x83,0xd4,
  539. 0x86,0xcc,0xa8,0xcc,0xa3,0xe4,0x03,0xfd,0x03,0xfd,0xc3,0xf4,0x6b,0xdd,0xde,0xff,
  540.  
  541. 0xff,0xff,0x95,0xe6,0x86,0xe5,0x06,0xfe,0xe6,0xfd,0xa8,0xed,0xe7,0xfd,0xa9,0xe5,
  542. 0xe9,0xcc,0x67,0xbc,0x67,0xbc,0x67,0xbc,0x47,0xbc,0x27,0xb4,0x47,0xb4,0xc9,0xc4,
  543. 0x48,0xed,0x26,0xf5,0x04,0xf5,0x03,0xfd,0x03,0xfd,0xc4,0xe4,0x95,0xe6,0xff,0xff,
  544.  
  545. 0xff,0xff,0xbe,0xff,0xac,0xdd,0xc6,0xf5,0xe6,0xfd,0xc6,0xfd,0x85,0xfd,0xc5,0xfd,
  546. 0xc7,0xfd,0xe9,0xf5,0xca,0xf5,0x8a,0xed,0x6a,0xed,0x8a,0xed,0xa9,0xf5,0x66,0xfd,
  547. 0x23,0xfd,0x04,0xf5,0x03,0xf5,0x03,0xfd,0x04,0xf5,0x6a,0xdd,0xbe,0xff,0xff,0xff,
  548.  
  549. 0xff,0xff,0xff,0xff,0x19,0xef,0x47,0xdd,0xc6,0xfd,0xa5,0xfd,0x64,0xf5,0x65,0xf5,
  550. 0x64,0xf5,0x43,0xfd,0x23,0xfd,0x23,0xfd,0x23,0xfd,0x03,0xfd,0x02,0xfd,0x03,0xf5,
  551. 0x03,0xf5,0x03,0xf5,0x23,0xfd,0x25,0xfd,0xe6,0xdc,0x18,0xef,0xff,0xff,0xff,0xff,
  552.  
  553. 0xff,0xff,0xff,0xff,0xff,0xff,0xb5,0xe6,0x26,0xd5,0xc7,0xf5,0x85,0xfd,0x44,0xf5,
  554. 0x24,0xf5,0x44,0xf5,0x23,0xf5,0x24,0xf5,0x23,0xf5,0x23,0xf5,0x03,0xf5,0xe3,0xf4,
  555. 0xe3,0xf4,0x45,0xfd,0x66,0xf5,0xe5,0xdc,0x95,0xee,0xff,0xff,0xff,0xff,0xff,0xff,
  556.  
  557. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb6,0xe6,0x49,0xdd,0x87,0xf5,0xa7,0xfd,
  558. 0x66,0xfd,0x24,0xf5,0x23,0xf5,0x23,0xf5,0x03,0xf5,0xe3,0xf4,0x04,0xf5,0x46,0xfd,
  559. 0x67,0xfd,0x46,0xed,0x07,0xd5,0xb6,0xe6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  560.  
  561. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5a,0xf7,0xce,0xdd,0x27,0xdd,
  562. 0x47,0xed,0x67,0xf5,0x87,0xfd,0x67,0xfd,0x67,0xfd,0x87,0xfd,0x67,0xfd,0x46,0xed,
  563. 0x06,0xdd,0xad,0xdd,0x3a,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  564.  
  565. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x19,0xef,
  566. 0x10,0xe6,0x6b,0xdd,0x49,0xe5,0x48,0xe5,0x28,0xe5,0x48,0xdd,0x6a,0xdd,0x10,0xe6,
  567. 0x18,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  568.  
  569. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  570. 0xff,0xff,0xff,0xff,0x7c,0xf7,0x5a,0xf7,0x5a,0xef,0x7c,0xf7,0xff,0xff,0xff,0xff,
  571. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  572.  
  573. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  574. 0xff,0xff,0xff,0xff,0x7c,0xf7,0x5a,0xf7,0x5a,0xef,0x7c,0xf7,0xff,0xff,0xff,0xff,
  575. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  576. };
  577.  
  578. void draw_lines(void)
  579. {
  580. unsigned char x1,y1,x2,y2;
  581. unsigned short int i;
  582.  
  583. // draw unfilled rectangles
  584. EnableFill(0x00);
  585. for (i=0; i<2000; i++) {
  586. x1=rand()%127;
  587. x2=rand()%127;
  588. y1=rand()%127;
  589. y2=rand()%127;
  590. Draw_Line64k(min(x1,x2),min(y1,y2),max(x1,x2),max(y1,y2), MAKECOLOR64k(rand(), rand(),rand()));
  591. }
  592. }
  593.  
  594. void draw_rects(void)
  595. {
  596. unsigned char x1,y1,x2,y2;
  597. unsigned short int i;
  598.  
  599. // draw unfilled rectangles
  600. EnableFill(0x00);
  601. for (i=0; i<2000; i++) {
  602. x1=rand()%127;
  603. x2=rand()%127;
  604. y1=rand()%127;
  605. y2=rand()%127;
  606. Draw_Rectangle64k(min(x1,x2),min(y1,y2),max(x1,x2),max(y1,y2), MAKECOLOR64k(rand(), rand(),rand()), 0x0000);
  607. }
  608.  
  609. // draw filled rectangles
  610. EnableFill(0x01);
  611. for (i=0; i<2000; i++) {
  612. x1=rand()%127;
  613. x2=rand()%127;
  614. y1=rand()%127;
  615. y2=rand()%127;
  616. Draw_Rectangle64k(min(x1,x2),min(y1,y2),max(x1,x2),max(y1,y2), MAKECOLOR64k(rand(), rand(),rand()), MAKECOLOR64k(rand(), rand(),rand()));
  617. }
  618. }
  619.  
  620. void draw_circles(void)
  621. {
  622. unsigned char x,y,r;
  623. unsigned short int i;
  624.  
  625. // draw unfilled circles
  626. EnableFill(0x00);
  627. for (i=0; i<2000; i++) {
  628. x=rand()%128;
  629. y=rand()%128;
  630. r=rand()%60;
  631. Draw_Circle64k(x, y, r, MAKECOLOR64k(rand(), rand(),rand()), 0x0000);
  632. }
  633.  
  634. // draw filled circles
  635. EnableFill(0x01);
  636. for (i=0; i<2000; i++) {
  637. x=rand()%128;
  638. y=rand()%128;
  639. r=rand()%60;
  640. Draw_Circle64k(x, y, r, MAKECOLOR64k(rand(), rand(),rand()), MAKECOLOR64k(rand(), rand(),rand()));
  641. }
  642. }
  643.  
  644. void draw_wheels(void)
  645. {
  646. float al,pi=3.14159;
  647. unsigned char l=25, x,y,i;
  648.  
  649. EnableFill(0x00);
  650. for (i=0; i<30; i++) {
  651. for (al=0; al<2*pi; al+=pi/24.0) {
  652. x=(unsigned char)(l*cos(al))+64;
  653. y=(unsigned char)(64-l*sin(al));
  654. Draw_Circle64k(x,y,25, MAKECOLOR64k(rand(), rand(),rand()), MAKECOLOR64k(rand(), rand(),rand()));
  655. }
  656. }
  657. }
  658.  
  659. void draw_lines_flower1(void)
  660. {
  661. float pi=3.14159,al,f;
  662. unsigned char x1,y1,x2,y2, d=30;
  663.  
  664. for(al=0.0; al<pi*2; al+=pi/360) {
  665. f=(d*(1.0+1.0/4.0*cos(12.0*al)))*(1.0+sin(4.0*al));
  666. x1=64+f*cos(al);
  667. x2=64+f*cos(al+pi/5.0);
  668. y1=64-f*sin(al);
  669. y2=64-f*sin(al+pi/5.0);
  670. Draw_Line64k(x1,y1,x2,y2, MAKECOLOR64k(rand(), rand(),rand()));
  671. }
  672. }
  673.  
  674. void draw_lines_flower(void)
  675. {
  676. float pi=3.14159,al,f;
  677. unsigned char x1,y1,x2,y2, d=30;
  678.  
  679. for(al=0.0; al<pi*2; al+=pi/360) {
  680. f=(d*(1.0+sin(4.0*al)));
  681. x1=64+f*cos(al);
  682. x2=64+f*cos(al+pi/5.0);
  683. y1=64-f*sin(al);
  684. y2=64-f*sin(al+pi/5.0);
  685. Draw_Line64k(x1,y1,x2,y2, MAKECOLOR64k(rand(), rand(),rand()));
  686. }
  687. }
  688.  
  689. extern "C" {
  690.  
  691. // 3D code from joaquim <[email protected]>
  692. typedef struct {
  693. double x, y, z;
  694. }
  695. Vector3D ;
  696.  
  697. typedef struct {
  698. int x;
  699. int y;
  700. int z;
  701. }
  702. ScreenPoint;
  703.  
  704. #define xAxis 64
  705. #define yAxis 64
  706. #define zAxis -350
  707. #define viewFov 80 // for big or small
  708. #define rotSpeed 5
  709. double thetaX = 0;
  710. #define FACENUMBER 72
  711.  
  712. #define xCenter 64
  713. #define yCenter 64
  714.  
  715. const uint16_t pontos[] = {
  716. 0, 0, 25,
  717. 60, 0, 25,
  718. 80, 80, 25,
  719. 160, 80, 25,
  720. 180, 0, 25,
  721. 240, 0, 25,
  722. 160,220, 25,
  723. 80,220, 25,
  724.  
  725. 80,100, 25,
  726. 160,100, 25,
  727. 140,180, 25,
  728. 100,180, 25,
  729.  
  730. 0, 0,-25,
  731. 60, 0,-25,
  732. 80, 80,-25,
  733. 160, 80,-25,
  734. 180, 0,-25,
  735. 240, 0,-25,
  736. 160,220,-25,
  737. 80,220,-25,
  738.  
  739. 80,100,-25,
  740. 160,100,-25,
  741. 140,180,-25,
  742. 100,180,-25
  743. };
  744.  
  745. const uint8_t face[ FACENUMBER ] = {
  746. 0,1, 1,2, 2,3, 3,4, 4,5, 5,6, 6,7, 7,0,
  747. 8,9, 9,10, 10,11, 11,8,
  748.  
  749. 12,13, 13,14, 14,15, 15,16, 16,17, 17,18, 18,19, 19,12,
  750. 20,21, 21,22, 22,23, 23,20,
  751.  
  752. 0,12, 1,13, 2,14, 3,15, 4,16, 5,17, 6,18, 7,19,
  753. 8,20, 9,21, 10,22, 11,23
  754.  
  755. };
  756.  
  757. const double _sin_tab[] = {
  758. 0.000000,0.017452,0.034899,0.052335,0.069756,0.087155,0.104528,0.121869,0.139173
  759. ,0.156434,0.173648,0.190808,0.207911,0.224951,0.241921,0.258819,0.275637,0.292371
  760. ,0.309016,0.325568,0.342020,0.358367,0.374606,0.390731,0.406736,0.422618,0.438371
  761. ,0.453990,0.469471,0.484809,0.499999,0.515038,0.529919,0.544639,0.559192,0.573576
  762. ,0.587785,0.601815,0.615661,0.629320,0.642787,0.656059,0.669130,0.681998,0.694658
  763. ,0.707106,0.719339,0.731353,0.743144,0.754709,0.766044,0.777145,0.788010,0.798635
  764. ,0.809016,0.819152,0.829037,0.838670,0.848048,0.857167,0.866025,0.874619,0.882947
  765. ,0.891006,0.898794,0.906307,0.913545,0.920504,0.927183,0.933580,0.939692,0.945518
  766. ,0.951056,0.956304,0.961261,0.965925,0.970295,0.974370,0.978147,0.981627,0.984807
  767. ,0.987688,0.990268,0.992546,0.994521,0.996194,0.997564,0.998629,0.999390,0.999847
  768. ,1.000000
  769. };
  770.  
  771. double _sin( int angle ) {
  772. if ( angle >= 0 && angle <= 90 ) {
  773. return _sin_tab[angle];
  774. }
  775. else if ( angle >= 91 && angle <= 180 ) {
  776. return _sin_tab[90 - (angle - 90)];
  777. }
  778. else if ( angle >= 181 && angle <= 270 ) {
  779. return - _sin_tab[angle - 180];
  780. }
  781. else if ( angle >= 271 && angle <= 360 ) {
  782. return - _sin_tab[90 - (angle - 270)];
  783. }
  784.  
  785. return 0;
  786. }
  787.  
  788. double _cos( int angle ) {
  789. return _sin((angle+90)%360);
  790. }
  791.  
  792. void Delay( int ms) {
  793. int i;
  794. while(ms--){
  795. i=2600; //empirically determined fudge factor 16mhz
  796. while(i--);
  797. }
  798. }
  799.  
  800. /**
  801. * [(1 ,0 ,0),
  802. * (0 ,cos(a) ,-sin(a)),
  803. * (0 ,sin(a) ,cos(a))]
  804. * @param Vector3D
  805. * @param theta
  806. */
  807. Vector3D rotateX(int x, int y, int z, int theta) {
  808. Vector3D newv;
  809. newv.x = x;
  810. newv.y = y * _cos(theta) + z * -_sin(theta);
  811. newv.z = y * _sin(theta) + z * _cos(theta);
  812. return newv;
  813. }
  814.  
  815. /**
  816. * [(cos(a) ,0 ,sin(a)),
  817. * (0 ,1 ,0),
  818. * (-sin(a),0 ,cos(a))]
  819. * @param Vector3D
  820. * @param theta
  821. */
  822. Vector3D rotateY(Vector3D vector, int theta) {
  823. Vector3D newv;
  824. newv.x = vector.x * _cos(theta) + vector.z * _sin(theta);
  825. newv.y = vector.y;
  826. newv.z = vector.x * -_sin(theta) + vector.z * _cos(theta);
  827. return newv;
  828. }
  829.  
  830. /**
  831. * [(cos(a),-sin(a),0),
  832. * (sin(a),cos(a) ,0),
  833. * (0 ,0 ,1)]
  834. * @param Vector3D
  835. * @param theta
  836. */
  837. Vector3D rotateZ(Vector3D vector, int theta) {
  838. Vector3D newv;
  839. newv.x = vector.x * _cos(theta) + vector.y * -_sin(theta);
  840. newv.y = vector.x * _sin(theta) + vector.y * _cos(theta);
  841. newv.z = vector.z;
  842. return newv;
  843. }
  844.  
  845. // -----------------------------------------------------------------------------
  846. ScreenPoint RotateFace( int faceNum, int angleX, int angleY, int angleZ ) {
  847. ScreenPoint screenPoint;
  848. Vector3D v3D;
  849.  
  850. v3D = rotateX(pontos[(face[faceNum] * 3)] - xCenter, pontos[(face[faceNum] * 3) + 1] - yCenter, pontos[(face[faceNum] * 3) + 2], angleX);
  851. v3D = rotateY(v3D, angleY);
  852. v3D = rotateZ(v3D, angleZ);
  853.  
  854. screenPoint.x = ((viewFov * v3D.x) / (v3D.z - zAxis)) + xAxis;
  855. screenPoint.y = ((viewFov * v3D.y) / (v3D.z - zAxis)) + yAxis;
  856. screenPoint.z = (int)v3D.z;
  857. return screenPoint;
  858. }
  859.  
  860. void DrawScreen( void ) {
  861. Clear_Window(0x00,0x83,0x00,0x83);
  862. delay(10);
  863. }
  864. void DrawClipLine(int xwmin,int ywmin,int xwmax,int ywmax, int x1,int y1,int x2,int y2, unsigned short int col);
  865. void DrawLine(int X1, int Y1, int X2, int Y2, uint16_t col) ;
  866.  
  867. void DrawDemo( void ) {
  868. uint8_t x = 0;
  869. uint8_t x1,y1,x2,y2;
  870. ScreenPoint screenPointA, screenPointB;
  871.  
  872. Clear_Window(0x00,0x83,0x00,0x83);
  873. // delay(10);
  874.  
  875. thetaX = thetaX + rotSpeed;
  876.  
  877. if (thetaX > 360) thetaX = 0;
  878.  
  879. do {
  880. screenPointA = RotateFace( x, thetaX, thetaX, thetaX );
  881. x++;
  882. screenPointB = RotateFace( x, thetaX, thetaX, thetaX );
  883. x++;
  884. DrawClipLine(10,10,120,120,screenPointA.x,screenPointA.y,screenPointB.x,screenPointB.y, MAKECOLOR64k(rand(), rand(),rand()));
  885. //DrawLine(screenPointA.x,screenPointA.y,screenPointB.x,screenPointB.y, MAKECOLOR64k(rand(), rand(),rand()));
  886.  
  887. }
  888. while ( x < FACENUMBER );
  889. delay(1);
  890. }
  891.  
  892. static int clipTest(float p,float q,float *u1,float *u2)
  893. {
  894. int flag = 1;
  895. float r;
  896. if(p<0.0)
  897. {
  898. r=q/p;
  899. if(r>*u2)
  900. flag=0;
  901. else if(r>*u1)
  902. *u1=r;
  903. }
  904. else if(p>0.0)
  905. {
  906. r=q/p;
  907. if(r<*u1)
  908. flag=0;
  909. else if(r<*u2)
  910. *u2=r;
  911. }
  912. else if(q<0.0)
  913. flag=0;
  914. return(flag);
  915. }
  916.  
  917. void DrawClipLine(int xwmin,int ywmin,int xwmax,int ywmax, int x1,int y1,int x2,int y2, unsigned short int col)
  918. {
  919. float u1=0.0,u2=1.0,dx=x2-x1,dy;
  920.  
  921. if(clipTest(-dx,x1-xwmin,&u1,&u2))
  922. if(clipTest(dx,xwmax-x1,&u1,&u2))
  923. {
  924. dy=y2-y1;
  925. if(clipTest(-dy,y1-ywmin,&u1,&u2))
  926. if(clipTest(dy,ywmax-y1,&u1,&u2))
  927. {
  928. if(u2<1.0)
  929. {
  930. x2=x1+u2*dx;
  931. y2=y1+u2*dy;
  932. }
  933. if(u1>0.0)
  934. {
  935. x1=x1+u1*dx;
  936. y1=y1+u1*dy;
  937. }
  938.  
  939. if (x1>x2 ||y1>y2)
  940. DrawLine(x1,y1,x2,y2,col);
  941. else
  942. Draw_Line64k(x1,y1,x2,y2, col);
  943. }
  944. }
  945. }
  946.  
  947. #define DrawPoint Draw_Point64k_Slow
  948. /* Draw_line : algorithm by Jack Bresenham */
  949. void DrawLine(int X1, int Y1, int X2, int Y2, uint16_t col)
  950. {
  951. int dy;
  952. int dx;
  953. int StepX, StepY;
  954. int Fraction;
  955.  
  956. dy = Y2 - Y1;
  957. dx = X2 - X1;
  958.  
  959. if (dy < 0)
  960. {
  961. dy = -dy;
  962. StepY = -1;
  963. }
  964. else
  965. StepY = 1;
  966.  
  967. if (dx < 0)
  968. {
  969. dx = -dx;
  970. StepX = -1;
  971. }
  972. else
  973. StepX = 1;
  974.  
  975. dy <<= 1; // dy is now 2*dy
  976. dx <<= 1; // dx is now 2*dx
  977. DrawPoint( X1, Y1, col);
  978.  
  979. if (dx > dy)
  980. {
  981. Fraction = dy - (dx >> 1); // same as 2*dy - dx
  982. while (X1 != X2)
  983. {
  984. if (Fraction >= 0)
  985. {
  986. Y1 += StepY;
  987. Fraction -= dx; // same as fraction -= 2*dx
  988. }
  989.  
  990. X1 += StepX;
  991. Fraction += dy; // same as fraction -= 2*dy
  992. DrawPoint( X1, Y1, col);
  993. }
  994. }
  995. else
  996. {
  997. Fraction = dx - (dy >> 1);
  998. while (Y1 != Y2)
  999. {
  1000. if (Fraction >= 0)
  1001. {
  1002. X1 += StepX;
  1003. Fraction -= dy;
  1004. }
  1005. Y1 += StepY;
  1006. Fraction += dx;
  1007. DrawPoint( X1, Y1, col);
  1008. }
  1009. }
  1010. }
  1011.  
  1012. } //extern "C" {
  1013.  
  1014. // -----------------------------------------------------------------------------
  1015.  
  1016.  
  1017. void setup() {
  1018. long i;
  1019. // set the digital pin as output:
  1020. pinMode(RST_PIN, OUTPUT);
  1021. pinMode(CS_PIN, OUTPUT);
  1022. pinMode(DC_PIN, OUTPUT);
  1023. pinMode(DIN_PIN, OUTPUT);
  1024. pinMode(CLK_PIN, OUTPUT);
  1025. pinMode(HVEN_PIN, OUTPUT);
  1026.  
  1027. OLED_HVEN_1; //+12V on
  1028. OLED_InitIOs();
  1029. OLED_Init();
  1030.  
  1031. Clear_Window(0x00,0x83,0x00,0x83);
  1032. delay(10);
  1033.  
  1034. while(1)
  1035. {
  1036. DrawDemo();
  1037. }
  1038.  
  1039. draw_lines();
  1040.  
  1041. Clear_Window(0x00,0x83,0x00,0x83);
  1042. delay(10);
  1043. draw_rects();
  1044.  
  1045. Clear_Window(0x00,0x83,0x00,0x83);
  1046. delay(10);
  1047. draw_circles();
  1048.  
  1049. Clear_Window(0x00,0x83,0x00,0x83);
  1050. delay(10);
  1051. draw_wheels();
  1052.  
  1053. // do filling color
  1054. Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0x00,0x00,0x00));
  1055. delay(500);
  1056. Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0xFF,0x00,0x00));
  1057. delay(500);
  1058. Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0x00,0xFF,0x00));
  1059. delay(500);
  1060. Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0x00,0x00,0xFF));
  1061. delay(500);
  1062. Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0xFF,0xFF,0x00));
  1063. delay(500);
  1064. Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0x00,0xFF,0xFF));
  1065. delay(500);
  1066. Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0xFF,0x00,0xFF));
  1067. delay(500);
  1068. Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0xFF,0xFF,0xFF));
  1069. delay(500);
  1070.  
  1071. Clear_Window(0x00,0x83,0x00,0x83);
  1072. delay(10);
  1073. Rainbow();
  1074. delay(500);
  1075. // show icon
  1076. Show_64k_Pattern_LittleEndia((unsigned char *)Icon24x24x64k,50,50,50+23,50+23);
  1077. }
  1078.  
  1079. // do put code in loop func
  1080. void loop()
  1081. {
  1082. while(1)
  1083. {
  1084. }
  1085. }
Advertisement
Add Comment
Please, Sign In to add comment