久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7659|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

LCD12864單片機程序 畫線,畫點,字母,漢字等 含有基本驅(qū)動和基本繪圖函數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:112317 發(fā)表于 2016-4-6 18:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式





所有源碼下載: My_LCDdriver.rar (111.33 KB, 下載次數(shù): 170)

//LCD驅(qū)動程序,包含8*8字符,8*16字符,8*8數(shù)字,16*16漢字
//畫方框(也可用于畫直線),8*8反色,16*16反色,128*64圖片顯示
//下面給出外部接口及程序接口


主要程序如下:
  1. /*--------------------------------------------------------------*/
  2. //讀出指令(狀態(tài))
  3. unsigned char LCD_read_cmd(void)
  4. {
  5.         unsigned char read_cmd;

  6.         Data_IO = 0xff;                //輸入
  7.         RS = 0;                                //指令
  8.         RW = 1;                                //讀出
  9.         E  = 1;                                //高電平讀出
  10.         read_cmd = Data_IO;        //指令
  11.         E  = 0;

  12.         return (read_cmd);
  13. }


  14. /*--------------------------------------------------------------*/
  15. //讀出數(shù)據(jù)
  16. //先只須空讀一次, 以后接著就無須空讀
  17. //空讀之后讀出的數(shù)據(jù)都是有效的!!!
  18. unsigned char LCD_read_dat(void)
  19. {
  20.         unsigned char read_dat;

  21.         Data_IO = 0xff;                //輸入
  22.         RS = 1;                                //數(shù)據(jù)
  23.         RW = 1;                                //讀出
  24.         E  = 1;                                //高電平讀出
  25.         read_dat = Data_IO;        //數(shù)據(jù)       
  26.         E  = 0;       

  27.         return (read_dat);
  28. }


  29. /*--------------------------------------------------------------*/
  30. //檢查忙標(biāo)志位
  31. void LCD_check_busy(void)
  32. {
  33.         unsigned char lcd_status;

  34.         do{
  35.                 lcd_status = LCD_read_cmd();
  36.         }while(lcd_status & 0x80);
  37. }


  38. /*--------------------------------------------------------------*/
  39. //寫入指令
  40. void LCD_write_cmd(unsigned char cmd)
  41. {
  42.         LCD_check_busy();
  43.         RS = 0;                        //指令
  44.         RW = 0;                        //寫入

  45.         Data_IO = cmd;        //指令
  46.         E  = 1;
  47.         E  = 0;                        //下降沿寫入
  48. }


  49. /*--------------------------------------------------------------*/
  50. //寫入數(shù)據(jù)
  51. void LCD_write_dat(unsigned char dat)
  52. {
  53.         LCD_check_busy();
  54.         RS = 1;                        //數(shù)據(jù)
  55.         RW = 0;                        //寫入

  56.         Data_IO = dat;        //數(shù)據(jù)
  57.         E  = 1;
  58.         E  = 0;                        //下降沿寫入
  59. }


  60. /*--------------------------------------------------------------*/
  61. //液晶字節(jié)定位(8*1)
  62. //液晶規(guī)劃:
  63. //x: 0 - 7        (行)
  64. //y: 0 -127        (列)
  65. void LCD_byte_pos(unsigned char x, unsigned char y)
  66. {
  67.         if(y < 64)           LCD_sel_left                //左半屏
  68.         else {y -= 64; LCD_sel_right}        //右半屏
  69.         LCD_write_cmd(X_Page_Addr + x);        //頁地址0-7
  70.         LCD_write_cmd(Y_Col_Addr + y);        //列地址0-63
  71. }


  72. /*--------------------------------------------------------------*/
  73. //液晶字符定位(8*8)
  74. //液晶規(guī)劃:
  75. //x: 0 - 7        (行)
  76. //y: 0 -15        (列)
  77. void LCD_char_pos(unsigned char x, unsigned char y)
  78. {
  79.         y <<= 3;
  80.         LCD_byte_pos(x, y);
  81. }


  82. /*--------------------------------------------------------------*/
  83. //顯示清屏
  84. void LCD_clr_scr(unsigned char sel_dat)
  85. {
  86.         unsigned char i, j;
  87.        
  88.         if(sel_dat == 0)                LCD_sel_left
  89.         else if(sel_dat == 1)        LCD_sel_right
  90.         else if(sel_dat == 2)        LCD_sel_all
  91.         for(j = 0; j < 8; j++)
  92.         {
  93.                 LCD_write_cmd(X_Page_Addr + j);
  94.                 LCD_write_cmd(Y_Col_Addr);
  95.                 for(i = 0; i < 64; i++) LCD_write_dat(0x00);
  96.         }
  97. }


  98. /*--------------------------------------------------------------*/
  99. //顯示清行
  100. //row:        0 - 7        共8行
  101. void LCD_clr_row(unsigned char row)
  102. {
  103.         unsigned char i;

  104.         LCD_sel_all
  105.         LCD_write_cmd(Y_Col_Addr);
  106.         LCD_write_cmd(X_Page_Addr + row);

  107.         for(i = 0; i < 64; i++) LCD_write_dat(0x00);
  108. }


  109. /*--------------------------------------------------------------*/
  110. //讀出8bytes數(shù)據(jù)
  111. //液晶規(guī)劃:
  112. //x: 0 - 7        (行)
  113. //y: 0 -15        (列)
  114. void LCD_read_8bytes(unsigned char x, unsigned char y, unsigned char *read_dat)
  115. {
  116.         unsigned char i;

  117.         LCD_char_pos(x, y); LCD_read_dat();        //空讀一次!!!
  118.         for(i = 0; i < 8; i++)
  119.         {
  120.                 *read_dat = LCD_read_dat();
  121.                 read_dat++;       
  122.         }
  123. }


  124. /*--------------------------------------------------------------*/
  125. //#if         (Font_type == 0)        //(8*16字體)
  126. /*--------------------------------------------------------------*/
  127. //液晶字符輸出(8*16字體)
  128. //x: 0 -3   (行)
  129. //y: 0 -15        (列)
  130. void LCD_printc16(unsigned char x, unsigned char y, unsigned char c_dat)
  131. {
  132.         unsigned char i, j;

  133.         for(j = 0; j < 2; j++)
  134.         {
  135.                 LCD_char_pos((x * 2 + j), y);
  136.                 for(i = 0; i < 8; i++) LCD_write_dat(Font_code16[c_dat - 32][8 * j + i]);               
  137.         }
  138. }

  139. /*--------------------------------------------------------------*/
  140. //液晶字符串輸出(8*16字體)
  141. //x: 0 - 3 (行)
  142. //y: 0 -15 (列)
  143. void LCD_prints16(unsigned char x, unsigned char y, unsigned char *s_dat)
  144. {
  145.         while(*s_dat) LCD_printc16(x, y++, *s_dat++);
  146. }

  147. /*--------------------------------------------------------------*/
  148. //#elif         (Font_type == 1)        //(8*8字體)
  149. /*--------------------------------------------------------------*/
  150. //液晶字符輸出(8*8字體)
  151. //x: 0 - 7        (行)
  152. //y: 0 -15        (列)
  153. void LCD_printc(unsigned char x, unsigned char y, unsigned char c_dat)
  154. {
  155.         unsigned char i;

  156.         LCD_char_pos(x, y);
  157.         LCD_write_dat(0x00);                                                //補空, 1bytes
  158.         for(i = 0; i < 6; i++) LCD_write_dat(Font_code[c_dat - 32][i]);
  159.         LCD_write_dat(0x00);   LCD_write_dat(0x00);        //補空, 2bytes
  160. }

  161. /*--------------------------------------------------------------*/
  162. //液晶字符輸出(6*8字體)
  163. //x: 0 - 7        (行)
  164. //y: 0 -21        (列)
  165. void LCD_printcs(unsigned char x, unsigned char y, unsigned char c_dat)
  166. {
  167.         unsigned char i;
  168.         y = y * 6 + 1;                                        //最左邊和最右邊各空一字節(jié)
  169.         //LCD_write_dat_pos(x, y, 0x00);        //前面補一個空字節(jié)
  170.         for(i = 0; i < 6; i++) LCD_write_dat_pos(x, y + i + 1, Font_code[c_dat - 32][i]);
  171. }

  172. /*--------------------------------------------------------------*/
  173. //液晶字符串輸出(6*8字體)
  174. //x: 0 - 3 (行)
  175. //y: 0 -21 (列)
  176. /*void LCD_printss(unsigned char x, unsigned char y, unsigned char *s_dat)
  177. {
  178.         while(*s_dat) LCD_printcs(x, y++, *s_dat++);
  179. }
  180. #endif


  181. /*--------------------------------------------------------------*/
  182. //液晶字符串輸出(8*8字體)
  183. //x: 0 - 7 (行)
  184. //y: 0 -15 (列)
  185. void LCD_prints(unsigned char x, unsigned char y, unsigned char *s_dat)
  186. {
  187.         while(*s_dat) LCD_printc(x, y++, *s_dat++);
  188. }


  189. /*--------------------------------------------------------------*/
  190. //液晶字符反色區(qū)域(8*8字體)
  191. //x: 0 - 7        (行)
  192. //y: 0 -15        (列)
  193. void LCD_inverse(unsigned char x, unsigned char y)
  194. {
  195.         unsigned char i;
  196.         unsigned char read_buffer[8];
  197.         LCD_read_8bytes(x, y, read_buffer);
  198.         LCD_char_pos(x, y);
  199.         for(i = 0; i < 8; i++) LCD_write_dat(~read_buffer[i]);
  200. }




  201. /*--------------------------------------------------------------*/
  202. //液晶字符下劃線區(qū)域(8*8字體)
  203. //x: 0 - 7        (行)
  204. //y: 0 -15        (列)
  205. //attr: =1, 添加下劃線
  206. //                =0, 刪除下劃線
  207. void LCD_underline(unsigned char x, unsigned char y, unsigned char attr)
  208. {
  209.         unsigned char i;
  210.         unsigned char read_buffer[8];

  211.         LCD_read_8bytes(x, y, read_buffer);
  212.         LCD_char_pos(x, y);
  213.         if(attr)        for(i = 0; i < 8; i++) LCD_write_dat(read_buffer[i] |  0x80);
  214.         else                for(i = 0; i < 8; i++) LCD_write_dat(read_buffer[i] & ~0x80);
  215. }


  216. /*--------------------------------------------------------------*/
  217. //液晶反色顯示
  218. void LCD_scr_inverse(void)
  219. {
  220.         unsigned char i, j;

  221.         for(j = 0; j < 8; j++)
  222.         {
  223.                 for(i = 0; i < 16; i++) LCD_inverse(j, i);
  224.         }
  225. }


  226. /*--------------------------------------------------------------*/
  227. //#if                Font_type                //(8*8字體)
  228. /*--------------------------------------------------------------*/
  229. //液晶字符反色輸出(8*8字體)
  230. //x: 0 - 7        (行)
  231. //y: 0 -15        (列)
  232. void LCD_inversec(unsigned char x, unsigned char y)
  233. {
  234.         LCD_inverse(x, y);
  235. }

  236. /*--------------------------------------------------------------*/
  237. //液晶字符加下劃線(8*8字體)
  238. //x: 0 - 7        (行)
  239. //y: 0 -15        (列)
  240. //attr: =1, 添加下劃線
  241. //                =0, 刪除下劃線
  242. void LCD_underlinec(unsigned char x, unsigned char y, unsigned char attr)
  243. {
  244.         LCD_underline(x, y, attr);
  245. }

  246. /*--------------------------------------------------------------*/
  247. //#else                                         //(8*16字體)
  248. /*--------------------------------------------------------------*/
  249. //液晶字符反色輸出(8*16字體)
  250. //x: 0 - 3        (行)
  251. //y: 0 -15        (列)
  252. void LCD_inverse16(unsigned char x, unsigned char y)
  253. {
  254.         x <<= 1;
  255.         LCD_inverse(x, y);
  256.         LCD_inverse(x+1, y);
  257. }

  258. /*--------------------------------------------------------------*/
  259. //液晶字符加下劃線(8*16字體)
  260. //x: 0 - 3        (行)
  261. //y: 0 -15        (列)
  262. //attr: =1, 添加下劃線
  263. //                =0, 刪除下劃線
  264. void LCD_underline16(unsigned char x, unsigned char y, unsigned char attr)
  265. {
  266.         x <<= 1;
  267.         LCD_underline(x + 1, y, attr);
  268. }
  269. //#endif


  270. /*--------------------------------------------------------------*/
  271. //液晶字符串反色輸出
  272. //x: 0 -7 (行)
  273. //y: 0 -15        (列)
  274. //num: num < 16 - y
  275. void LCD_inverses(unsigned char x, unsigned char y, unsigned char num)
  276. {
  277.         while(num--) LCD_inversec(x, y++);
  278. }


  279. /*--------------------------------------------------------------*/
  280. //液晶字符串加下劃線
  281. //x: 0 -7 (行)
  282. //y: 0 -15        (列)
  283. //num: num < 16 - y
  284. //attr: =1, 添加下劃線
  285. //                =0, 刪除下劃線
  286. void LCD_underlines(unsigned char x, unsigned char y, unsigned char num, unsigned char attr)
  287. {
  288.         while(num--) LCD_underlinec(x, y++, attr);
  289. }


  290. /*--------------------------------------------------------------*/
  291. //液晶漢字輸出(16*16字體)
  292. //取碼規(guī)則:        低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
  293. //x: 0 - 3        (行)
  294. //y: 0 - 7        (列)
  295. void LCD_printch(unsigned char x, unsigned char y, unsigned char code *h_dat)
  296. {
  297.         unsigned char i, j;

  298.         x <<= 1; y <<= 1;
  299.         for(j = 0; j < 2; j++)
  300.         {
  301.                 LCD_char_pos((x + j), y);
  302.                 for(i = 0; i < 16; i++) LCD_write_dat(h_dat[16 * j + i]);               
  303.         }
  304. }


  305. /*--------------------------------------------------------------*/
  306. //液晶漢字詞組輸出(16*16字體)
  307. //取碼規(guī)則:        低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
  308. //x: 0 - 3        (行)
  309. //y: 0 - 7        (列)
  310. //num: num < 8 - y
  311. //一次最多顯示八個漢字!
  312. void LCD_printsh(unsigned char x, unsigned char y, unsigned char code *h_dat, unsigned char num)
  313. {
  314.         unsigned char i;
  315.        
  316.         for(i = 0; i < num; i++) {LCD_printch(x, y++, h_dat); h_dat += 32;}
  317. }


  318. /*--------------------------------------------------------------*/
  319. //液晶漢字輸出(16*16字體)
  320. //查表顯示輸出
  321. //取碼規(guī)則:        低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
  322. //x: 0 - 3        (行)
  323. //y: 0 - 7        (列)
  324. void LCD_showch(unsigned char x, unsigned char y, unsigned char code *dat)
  325. {
  326.         unsigned char i;
  327.        
  328.         for(i = 0; i < GB_16_num; i++)
  329.         {
  330.                 if((GB_16[i].Index[0] == dat[0]) && (GB_16[i].Index[1] == dat[1])) break;
  331.         }
  332.         LCD_printch(x, y, GB_16[i].Msk);
  333. }


  334. /*--------------------------------------------------------------*/
  335. //液晶漢字詞組輸出(16*16字體)
  336. //查表顯示輸出
  337. //取碼規(guī)則:        低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
  338. //x: 0 - 3        (行)
  339. //y: 0 - 7        (列)
  340. //num: num < 8 - y
  341. void LCD_showsh(unsigned char x, unsigned char y, unsigned char code *dat)
  342. {
  343.         while(*dat) {LCD_showch(x, y++, dat); dat += 2;}        //一個漢字GB碼由2個字節(jié)組成
  344. }


  345. /*--------------------------------------------------------------*/
  346. //液晶漢字反色區(qū)域(16*16字體)
  347. //x: 0 - 3        (行)
  348. //y: 0 - 7        (列)
  349. void LCD_inversech(unsigned char x, unsigned char y)
  350. {
  351.         x <<= 1;
  352.         y <<= 1;
  353.         LCD_inverse(x, y);
  354.         LCD_inverse(x, y+1);
  355.         LCD_inverse(x+1, y);
  356.         LCD_inverse(x+1, y+1);
  357. }


  358. /*--------------------------------------------------------------*/
  359. //液晶漢字詞組反色區(qū)域(16*16字體)
  360. //x: 0 - 3 (行)
  361. //y: 0 - 8 (列)
  362. //num: num < 8 - y        漢字個數(shù)
  363. void LCD_inversesh(unsigned char x, unsigned char y, unsigned char num)
  364. {
  365.         while(num--) LCD_inversech(x, y++);
  366. }


  367. /*--------------------------------------------------------------*/
  368. //#if                Font_type                //(8*8字體)
  369. /*--------------------------------------------------------------*/
  370. //定位輸出數(shù)字
  371. //x: 0 - 7                (行)
  372. //y: 0 - 15/20        (列)
  373. //num: 0 - 65535        要顯示的數(shù)字
  374. //num_bit: 0 - 5        數(shù)字的位數(shù)
  375. //num_font:        =0,6*8        輸出字體
  376. //                        =1,8*8       
  377. /*void LCD_printn(unsigned char x, unsigned char y, unsigned int num, unsigned char num_bit, unsigned char num_font)
  378. {
  379.         char i;
  380.         unsigned char ii;
  381.         unsigned char dat[6];
  382.         for(i = 0; i < 6; i++) dat[i] = 0; i = 0;        //初始化數(shù)據(jù)
  383.         while(num / 10)                                                                //拆位
  384.         {
  385.                 dat[i] = num % 10;                                                //最低位
  386.                 num /= 10; i++;               
  387.         }
  388.         dat[i] = num;                                                                //最高位
  389.         ii = i;                                                                                //保存dat的位數(shù)
  390.         for(; i >= 0; i--)        dat[i] += 48;                        //轉(zhuǎn)化成ASCII
  391.         for(i = 0; i < num_bit; i++)
  392.         if(num_font)LCD_printc(x, y + i, ' ');                //清顯示區(qū)域
  393.         else                LCD_printcs(x, y + i, ' ');                //清顯示區(qū)域
  394.         for(i = ii; i >= 0; i--)
  395.         if(num_font)LCD_printc(x, y++, dat[i]);                //輸出數(shù)值
  396.         else                LCD_printcs(x, y++, dat[i]);        //輸出數(shù)值
  397. }
  398. /*--------------------------------------------------------------*/
  399. //#else                                         //(8*16字體)
  400. /*--------------------------------------------------------------*/
  401. //定位輸出數(shù)字
  402. //x: 0 - 3  (行)
  403. //y: 0 - 15 (列)
  404. //num: 0 - 65535        要顯示的數(shù)字
  405. //num_bit: 0 - 5        數(shù)字的位數(shù)
  406. void LCD_printn(unsigned char x, unsigned char y, unsigned int num, unsigned char num_bit)
  407. {
  408.         char i;
  409.         unsigned char ii;
  410.         unsigned char dat[6];
  411.         for(i = 0; i < 6; i++) dat[i] = 0; i = 0;        //初始化數(shù)據(jù)
  412.         while(num / 10)                                                                //拆位
  413.         {
  414.                 dat[i] = num % 10;                                                //最低位
  415.                 num /= 10; i++;               
  416.         }
  417.         dat[i] = num;                                                                //最高位
  418.         ii = i;                                                                                //保存dat的位數(shù)
  419.         for(; i >= 0; i--)        dat[i] += 48;                        //轉(zhuǎn)化成ASCII
  420.         for(i = 0; i < num_bit; i++)
  421.         LCD_printc(x, y + i, ' ');                                        //清顯示區(qū)域
  422.         for(i = ii; i >= 0; i--)
  423.         LCD_printc(x, y++, dat[i]);                                        //輸出數(shù)值
  424. }
  425. //#endif


  426. /*--------------------------------------------------------------*/
  427. //液晶定位寫入數(shù)據(jù)一個字節(jié)
  428. //液晶規(guī)劃:
  429. //x: 0 - 7        (頁)
  430. //y: 0 -127        (列)
  431. void LCD_write_dat_pos(unsigned char x, unsigned char y, unsigned char dat)
  432. {
  433.         LCD_byte_pos(x, y);
  434.         LCD_write_dat(dat);
  435. }


  436. /*--------------------------------------------------------------*/
  437. //液晶定位讀出數(shù)據(jù)一個字節(jié)
  438. //液晶規(guī)劃:
  439. //x: 0 - 7        (頁)
  440. //y: 0 -127        (列)
  441. unsigned char LCD_read_dat_pos(unsigned char x, unsigned char y)
  442. {
  443.         unsigned char read_dat;

  444.         LCD_byte_pos(x, y);
  445.         read_dat = LCD_read_dat();                //dummy讀
  446.         read_dat = LCD_read_dat();                //數(shù)據(jù)有效
  447.        
  448.         return (read_dat);       
  449. }


  450. /*--------------------------------------------------------------*/
  451. //顯示128X64圖片
  452. //取碼規(guī)則:        低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
  453. void LCD_picture(unsigned char code *img_dat)
  454. {
  455.         unsigned char i, j;

  456.         for(j = 0; j < 8; j++)
  457.         {       
  458.                 for(i = 0; i < 128; i++)
  459.                 {
  460.                         LCD_write_dat_pos(j, i, img_dat[j * 128 + i]);
  461.                 }
  462.         }
  463. }


  464. /*--------------------------------------------------------------*/
  465. //定位顯示指定大小圖片
  466. //取碼規(guī)則:        低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
  467. //pag:        0 - 7                        頁坐標(biāo)
  468. //col:  0 - 127                        列坐標(biāo)
  469. //x:        0 - (127-col)        圖片寬
  470. //y:        0 - (63-pag*8)        圖片高
  471. /*void LCD_pos_picture(unsigned char pag, unsigned char col, unsigned char x, unsigned char y, unsigned char code *img_dat)
  472. {
  473.         unsigned char i, j;

  474.         y = (y + 4) >> 3;                        //四舍五入
  475.         for(j = 0; j < y; j++)
  476.         {       
  477.                 for(i = 0; i < x; i++)
  478.                 {
  479.                         LCD_write_dat_pos(pag + j, col + i, img_dat[j * x + i]);
  480.                 }
  481.         }
  482. }


  483. /*--------------------------------------------------------------*/
  484. //畫點函數(shù)
  485. //x:        0 - 127                橫坐標(biāo)
  486. //y:        0 - 63                列坐標(biāo)       
  487. //attr:                =1,                畫點       
  488. //                        =0,                消點
  489. void LCD_pixel(unsigned char x, unsigned char y, unsigned char attr)
  490. {
  491.         unsigned char pixel_dat, temp_dat, yy;
  492.        
  493.         yy = y >> 3;                                                //劃分到頁
  494.         pixel_dat = LCD_read_dat_pos(yy, x);//讀出數(shù)據(jù)
  495.         temp_dat = 0x01 << (y & 0x07);                //頁中的點
  496.         if(attr) pixel_dat |= temp_dat;                //畫點
  497.         else         pixel_dat &= ~temp_dat;        //消點
  498.         LCD_write_dat_pos(yy, x, pixel_dat);//寫入組合數(shù)據(jù)
  499. }


  500. /*--------------------------------------------------------------*/
  501. //畫橫線
  502. //y:        0 - 63                列坐標(biāo)       
  503. //attr:                =1,                畫線
  504. //                        =0,                消線
  505. void LCD_line_h(unsigned char y, unsigned char attr)
  506. {
  507.         unsigned char i;

  508.         for(i = 0; i < 128; i++) LCD_pixel(i, y, attr);
  509. }


  510. /*--------------------------------------------------------------*/
  511. //畫豎線
  512. //x:        0 - 128                橫坐標(biāo)
  513. //attr:                =1,                畫線
  514. //                        =0,                消線
  515. void LCD_line_v(unsigned char x, unsigned char attr)
  516. {
  517.         unsigned char i;

  518.         for(i = 0; i < 64; i++) LCD_pixel(x, i, attr);
  519. }


  520. /*--------------------------------------------------------------*/
  521. //顯示直線
  522. //x:        0 - 127                橫坐標(biāo)
  523. //y:        0 - 63                縱坐標(biāo)
  524. //attr:                =1,                畫線
  525. //                        =0,                消線
  526. void LCD_line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char attr)
  527. {
  528.         char dx, dy;
  529.         char inc_x, inc_y;
  530.         int  xerr = 0, yerr = 0;                                //初始化變量
  531.         unsigned char i, ds;

  532.     dx = x2 - x1;                                                        //計算坐標(biāo)增量
  533.     dy = y2 - y1;

  534.         if(dx > 0) inc_x = 1;                                        //設(shè)置單步方向
  535.         else
  536.         {
  537.                 if(dx == 0) {inc_x = 0;                          } //垂直線
  538.                 else                {inc_x = -1; dx = -dx;}
  539.         }

  540.         if(dy > 0) inc_y = 1;                                        //設(shè)置單步方向
  541.         else
  542.     {
  543.                 if(dy == 0) {inc_y = 0;                          }        //水平線
  544.                 else                {inc_y = -1; dy = -dy;}
  545.         }

  546.         if(dx > dy) ds = dx;                                        //選取基本增量坐標(biāo)軸
  547.         else                ds = dy;

  548.         for(i = 0; i <= ds+1; i++)                                //畫線輸出
  549.         {
  550.                 LCD_pixel(x1, y1, attr);                        //畫點
  551.                 xerr += dx;
  552.                 yerr += dy;
  553.                 if(xerr > ds)
  554.                 {
  555.                         xerr -= ds;
  556.                         x1   += inc_x;
  557.                 }
  558.                 if(yerr > ds)
  559.                 {
  560.                         yerr -= ds;
  561.                         y1   += inc_y;
  562.                 }
  563.         }
  564. }


  565. /*--------------------------------------------------------------*/
  566. //顯示方形
  567. //x:        0 - 127                橫坐標(biāo)
  568. //y:        0 - 63                縱坐標(biāo)
  569. //attr:                =1,                畫方
  570. //                        =0,                刪方
  571. void LCD_rectangle(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char attr)
  572. {
  573.         LCD_line(x1, y1, x2, y1, attr);
  574.         LCD_line(x1, y1, x1, y2, attr);
  575.         LCD_line(x2, y1, x2, y2, attr);
  576.         LCD_line(x1, y2, x2, y2, attr);
  577. }


  578. /*--------------------------------------------------------------*/
  579. //顯示圓
  580. //x:        0 - 128                橫坐標(biāo)
  581. //y:        0 - 63                縱坐標(biāo)
  582. //r:        0 - 63                半徑
  583. //attr:                =1,                畫圓
  584. //                        =0,                刪圓
  585. /*void LCD_circle(unsigned char x, unsigned char y, unsigned char r, unsigned char attr)
  586. {
  587.         unsigned char dx, dy = r;

  588.         for(dx = 0; dx <= r; dx++)
  589.         {
  590.                 while((r * r + 1 - dx * dx) < (dy * dy)) dy--;
  591.                 LCD_pixel(x + dx, y - dy, attr);
  592.                 LCD_pixel(x - dx, y - dy, attr);
  593.                 LCD_pixel(x - dx, y + dy, attr);
  594.                 LCD_pixel(x + dx, y + dy, attr);

  595.                 LCD_pixel(x + dy, y - dx, attr);
  596.                 LCD_pixel(x - dy, y - dx, attr);
  597.                 LCD_pixel(x - dy, y + dx, attr);
  598.                 LCD_pixel(x + dy, y + dx, attr);
  599.         }
  600. }


  601. /*--------------------------------------------------------------*/
  602. //復(fù)位LCD128*64
  603. void LCD_reset_12864(void)
  604. {
  605.         LCD_clr_scr(ASCR);                        //清全屏
  606.         LCD_write_cmd(Display_Off);        //關(guān)閉顯示
  607.         LCD_write_cmd(X_Page_Addr);        //起始頁地址
  608.         LCD_write_cmd(Start_Line);        //起始行
  609.         LCD_write_cmd(Y_Col_Addr);        //起始列地址
  610.         LCD_write_cmd(Display_On);        //開啟顯示
  611. }


  612. /*--------------------------------------------------------------*/
  613. //初始化LCD128*64
  614. void LCD_init_12864(void)
  615. {
  616.         LCD_reset_hard                //硬件復(fù)位
  617.         LCD_reset_soft                //軟件復(fù)位
  618. }




復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:127016 發(fā)表于 2016-6-16 19:09 | 只看該作者
為什么使用 proteus 仿真LCD126864顯示亂碼? 附件帶有仿真圖

Proteus 代碼仿真 KS0108.rar

90.81 KB, 下載次數(shù): 15, 下載積分: 黑幣 -5

錯誤信息

回復(fù)

使用道具 舉報

板凳
ID:189454 發(fā)表于 2017-4-14 10:47 | 只看該作者
感謝樓主分享,下載試試看
回復(fù)

使用道具 舉報

地板
ID:191910 發(fā)表于 2017-6-22 13:19 | 只看該作者
不錯,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

5#
ID:365854 發(fā)表于 2018-7-5 20:25 | 只看該作者
先下載看看,謝謝。
回復(fù)

使用道具 舉報

6#
ID:372048 發(fā)表于 2019-1-7 17:23 | 只看該作者
先下載看看,謝謝。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美日韩国产综合 | 黄网站涩免费蜜桃网站 | 91av久久久 | 在线中文字幕av | 亚洲国产精品网站 | 欧美区日韩区 | 97视频人人澡人人爽 | 特级毛片www | 国产精品美女一区二区 | 免费一级欧美在线观看视频 | 毛片免费在线 | 精品美女| 欧美亚洲日本 | 亚洲精品99久久久久久 | 亚洲成人免费 | 久久久久久久国产 | 亚洲一区二区黄 | 一区二区免费看 | 小h片免费观看久久久久 | 欧美视频在线播放 | 欧美三级网站 | caoporon| 日韩亚洲视频 | 亚洲大片 | 国产一二三区精品视频 | 天天玩天天干天天操 | 国产精品久久久久久亚洲调教 | 91久操视频 | 欧美黑人国产人伦爽爽爽 | 久久精品一区二区视频 | 国产精品久久午夜夜伦鲁鲁 | 久久精品国产免费一区二区三区 | 欧美亚洲国产精品 | 国产精品日韩欧美一区二区三区 | 欧美成人精品一区二区男人看 | 一级片视频免费观看 | 国产在线视频一区二区董小宛性色 | 欧美精品二区 | аⅴ资源新版在线天堂 | 欧美v日韩v | 成人毛片在线观看 |