找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6330|回复: 5
打印 上一主题 下一主题
收起左侧

LCD12864单片机程序 画线,画点,字母,汉字等 含有基本驱动和基本绘图函数

[复制链接]
跳转到指定楼层
楼主
ID:112317 发表于 2016-4-6 18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式





所有源码下载: My_LCDdriver.rar (111.33 KB, 下载次数: 168)

//LCD驱动程序,包含8*8字符,8*16字符,8*8数字,16*16汉字
//画方框(也可用于画直线),8*8反色,16*16反色,128*64图片显示
//下面给出外部接口及程序接口


主要程序如下:
  1. /*--------------------------------------------------------------*/
  2. //读出指令(状态)
  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. //读出数据
  16. //先只须空读一次, 以后接着就无须空读
  17. //空读之后读出的数据都是有效的!!!
  18. unsigned char LCD_read_dat(void)
  19. {
  20.         unsigned char read_dat;

  21.         Data_IO = 0xff;                //输入
  22.         RS = 1;                                //数据
  23.         RW = 1;                                //读出
  24.         E  = 1;                                //高电平读出
  25.         read_dat = Data_IO;        //数据       
  26.         E  = 0;       

  27.         return (read_dat);
  28. }


  29. /*--------------------------------------------------------------*/
  30. //检查忙标志位
  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. //写入数据
  51. void LCD_write_dat(unsigned char dat)
  52. {
  53.         LCD_check_busy();
  54.         RS = 1;                        //数据
  55.         RW = 0;                        //写入

  56.         Data_IO = dat;        //数据
  57.         E  = 1;
  58.         E  = 0;                        //下降沿写入
  59. }


  60. /*--------------------------------------------------------------*/
  61. //液晶字节定位(8*1)
  62. //液晶规划:
  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. //液晶规划:
  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数据
  111. //液晶规划:
  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;                                        //最左边和最右边各空一字节
  169.         //LCD_write_dat_pos(x, y, 0x00);        //前面补一个空字节
  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. //液晶字符反色区域(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. //液晶字符下划线区域(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. //取码规则:        低位在前, 列行扫描, 阴码(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. //取码规则:        低位在前, 列行扫描, 阴码(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. //取码规则:        低位在前, 列行扫描, 阴码(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. //取码规则:        低位在前, 列行扫描, 阴码(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个字节组成
  344. }


  345. /*--------------------------------------------------------------*/
  346. //液晶汉字反色区域(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. //液晶汉字词组反色区域(16*16字体)
  360. //x: 0 - 3 (行)
  361. //y: 0 - 8 (列)
  362. //num: num < 8 - y        汉字个数
  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. //定位输出数字
  371. //x: 0 - 7                (行)
  372. //y: 0 - 15/20        (列)
  373. //num: 0 - 65535        要显示的数字
  374. //num_bit: 0 - 5        数字的位数
  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;        //初始化数据
  383.         while(num / 10)                                                                //拆位
  384.         {
  385.                 dat[i] = num % 10;                                                //最低位
  386.                 num /= 10; i++;               
  387.         }
  388.         dat[i] = num;                                                                //最高位
  389.         ii = i;                                                                                //保存dat的位数
  390.         for(; i >= 0; i--)        dat[i] += 48;                        //转化成ASCII
  391.         for(i = 0; i < num_bit; i++)
  392.         if(num_font)LCD_printc(x, y + i, ' ');                //清显示区域
  393.         else                LCD_printcs(x, y + i, ' ');                //清显示区域
  394.         for(i = ii; i >= 0; i--)
  395.         if(num_font)LCD_printc(x, y++, dat[i]);                //输出数值
  396.         else                LCD_printcs(x, y++, dat[i]);        //输出数值
  397. }
  398. /*--------------------------------------------------------------*/
  399. //#else                                         //(8*16字体)
  400. /*--------------------------------------------------------------*/
  401. //定位输出数字
  402. //x: 0 - 3  (行)
  403. //y: 0 - 15 (列)
  404. //num: 0 - 65535        要显示的数字
  405. //num_bit: 0 - 5        数字的位数
  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;        //初始化数据
  412.         while(num / 10)                                                                //拆位
  413.         {
  414.                 dat[i] = num % 10;                                                //最低位
  415.                 num /= 10; i++;               
  416.         }
  417.         dat[i] = num;                                                                //最高位
  418.         ii = i;                                                                                //保存dat的位数
  419.         for(; i >= 0; i--)        dat[i] += 48;                        //转化成ASCII
  420.         for(i = 0; i < num_bit; i++)
  421.         LCD_printc(x, y + i, ' ');                                        //清显示区域
  422.         for(i = ii; i >= 0; i--)
  423.         LCD_printc(x, y++, dat[i]);                                        //输出数值
  424. }
  425. //#endif


  426. /*--------------------------------------------------------------*/
  427. //液晶定位写入数据一个字节
  428. //液晶规划:
  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. //液晶定位读出数据一个字节
  438. //液晶规划:
  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();                //数据有效
  447.        
  448.         return (read_dat);       
  449. }


  450. /*--------------------------------------------------------------*/
  451. //显示128X64图片
  452. //取码规则:        低位在前, 列行扫描, 阴码(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. //取码规则:        低位在前, 列行扫描, 阴码(1-亮, 0-灭)
  467. //pag:        0 - 7                        页坐标
  468. //col:  0 - 127                        列坐标
  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. //画点函数
  485. //x:        0 - 127                横坐标
  486. //y:        0 - 63                列坐标       
  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);//读出数据
  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);//写入组合数据
  499. }


  500. /*--------------------------------------------------------------*/
  501. //画横线
  502. //y:        0 - 63                列坐标       
  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                横坐标
  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                横坐标
  523. //y:        0 - 63                纵坐标
  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;                                                        //计算坐标增量
  533.     dy = y2 - y1;

  534.         if(dx > 0) inc_x = 1;                                        //设置单步方向
  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;                                        //设置单步方向
  541.         else
  542.     {
  543.                 if(dy == 0) {inc_y = 0;                          }        //水平线
  544.                 else                {inc_y = -1; dy = -dy;}
  545.         }

  546.         if(dx > dy) ds = dx;                                        //选取基本增量坐标轴
  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                横坐标
  568. //y:        0 - 63                纵坐标
  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                横坐标
  581. //y:        0 - 63                纵坐标
  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. //复位LCD128*64
  603. void LCD_reset_12864(void)
  604. {
  605.         LCD_clr_scr(ASCR);                        //清全屏
  606.         LCD_write_cmd(Display_Off);        //关闭显示
  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                //硬件复位
  617.         LCD_reset_soft                //软件复位
  618. }




复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:127016 发表于 2016-6-16 19:09 | 只看该作者
为什么使用 proteus 仿真LCD126864显示乱码? 附件带有仿真图

Proteus 代码仿真 KS0108.rar

90.81 KB, 下载次数: 15, 下载积分: 黑币 -5

错误信息

回复

使用道具 举报

板凳
ID:189454 发表于 2017-4-14 10:47 | 只看该作者
感谢楼主分享,下载试试看
回复

使用道具 举报

地板
ID:191910 发表于 2017-6-22 13:19 | 只看该作者
不错,学习学习
回复

使用道具 举报

5#
ID:365854 发表于 2018-7-5 20:25 | 只看该作者
先下载看看,谢谢。
回复

使用道具 举报

6#
ID:372048 发表于 2019-1-7 17:23 | 只看该作者
先下载看看,谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表