分享DS19264液晶使用stm32的IO模拟时序通讯程序

2019-12-10 18:12发布

  1. /*
  2.   @: KS0108,DS19264-5,19264 power-3.3V
  3.   @:2015/10/17 21:04
  4.   @:STM32F103RBT6 8位并口 IO->19264
  5. */

  6. //-----------------头文件------------------------------------
  7. #include "bsp.h"
  8. #include "hzlib.h"

  9. #include "zimo.h"
  10. #include "stm32f10x.h"
  11. #include "ds19264-5.h"

  12. //-------------------------------------------------并口定义---------------------------------------------
  13. #define Data_IO_IN      {GPIOC->CRL |= 0xFFFFFFFF; GPIOC->CRL &= 0x44444444;}          //方向设置为输入
  14. #define Data_IO_OUT     {GPIOC->CRL &= 0x00000000; GPIOC->CRL |= 0x33333333;}          //方向设置为输出   
  15. #define Data_I()            GPIOC->IDR &= 0x00FF                         //数据输入
  16. #define Data_O(x)             {GPIOC->BSRR = 0x00FF0000; GPIOC->BSRR = x;}     //数据输出
  17. //----------------------------------------------STM32F103  新定义---------------------------------------
  18. #define RS_H    IO_SET(LCD_RS)
  19. #define RS_L    IO_RESET(LCD_RS)
  20.                
  21. #define RW_H    IO_SET(LCD_RW)
  22. #define RW_L    IO_RESET(LCD_RW)
  23.                
  24. #define E_H     IO_SET(LCD_E)
  25. #define E_L     IO_RESET(LCD_E)
  26.                
  27. #define CS1_H   IO_SET(LCD_CS1)
  28. #define CS1_L   IO_RESET(LCD_CS1)
  29.                
  30. #define CS2_H   IO_SET(LCD_CS2)
  31. #define CS2_L   IO_RESET(LCD_CS2)

  32. #define CS3_H   IO_SET(LCD_CS3)
  33. #define CS3_L   IO_RESET(LCD_CS3)
  34.                
  35. #define RST_H   IO_SET(LCD_RST)
  36. #define RST_L   IO_RESET(LCD_RST)

  37. #define RST(x)      x?RST_H:RST_L// 复位信号,低电平有效;
  38. #define EN(x)       x?E_H:E_L   //使能信号
  39. #define RS(x)       x?RS_H:RS_L   //数据,指令选择信号,低电平选择指令,高电平选择数据;
  40. #define CS1(x)      x?CS1_H:CS1_L   //左片选信号;
  41. #define CS2(x)      x?CS2_H:CS2_L   //中片选信号;
  42. #define CS3(x)      x?CS3_H:CS3_L   //右片选信号;
  43. #define RW(x)       x?RW_H:RW_L   //读写信号,高电平为读,低电平为写;

  44. #define Dir_IN      0x00
  45. #define Dir_OUT     0x01

  46. #define LCM_CMD                0x00
  47. #define LCM_DAT                0x01

  48. #define RW_READ     0x01
  49. #define RW_WRITE    0x00


  50. //屏幕选择
  51. #define LCD_sel_left        {CS3_H;CS2_H;CS1_L;}                        //左屏
  52. #define LCD_sel_middle  {CS1_H;CS2_L;CS3_H;}            //中屏
  53. #define LCD_sel_right        {CS2_H;CS1_H;CS3_L;}                        //右屏



  54. u8 Col,Page;
  55. //------------------------------------液晶延时函数---------------------------------------------
  56. void delay_us(u8 cd)
  57. {
  58.     u16 ma;
  59.     for(;cd>0;cd--)
  60.         for(ma=0;ma<50;ma++);//old,ma=50
  61. }
  62. void delay_ms(unsigned int cd)
  63. {
  64.     u16 ma;
  65.     for(;cd>0;cd--)
  66.         for(ma=0;ma<1000;ma++);
  67. }
  68. //液晶读写数据方向控制
  69. //低电平输出,高电平读入
  70. void OCM_DIR_InOut(u8 x)
  71. {
  72.     if(x==Dir_IN)
  73.     {
  74.         //IN
  75.         Data_IO_IN;
  76.     }
  77.     else
  78.     {
  79.         //OUT
  80.         Data_IO_OUT;
  81.     }
  82. }
  83. //IO输出数据
  84. void OCM_Data_Out(u8 dat)
  85. {
  86.     Data_O(dat);        //指令
  87. }
  88. //IO读数据
  89. u8 OCM_Data_In(void)
  90. {
  91.     u8 dat = Data_I();
  92.     return dat;        //指令
  93. }
  94. //=============================================================================
  95. void LCD_reset_hard(void)       
  96. {
  97.     RST_L;
  98.     delay_ms(1);
  99.     RST_H;
  100. }                        //硬件复位
  101. /*--------------------------------------------------------------*/
  102. //读出指令(状态)
  103. unsigned char LCD_read_cmd(void)
  104. {
  105.     unsigned char read_cmd;
  106.     Data_IO_OUT;
  107.     Data_O(0xff);                //输入
  108.     RS_L;                                //指令
  109.     RW_H;                                //读出
  110.     E_H;                                //高电平读出
  111.     Data_IO_IN;
  112.     delay_us(10);//old=20
  113.     read_cmd = Data_I();        //指令
  114.     E_L;

  115.     return (read_cmd);
  116. }


  117. /*--------------------------------------------------------------*/
  118. //读出数据
  119. //先只须空读一次, 以后接着就无须空读
  120. //空读之后读出的数据都是有效的!!!
  121. unsigned char LCD_read_dat(void)
  122. {
  123.     unsigned char read_dat;
  124.     Data_IO_OUT;
  125.     Data_O(0xff);                //输入
  126.     RS_H;                                //数据
  127.     RW_H;                                //读出
  128.     E_H;                                //高电平读出
  129.     Data_IO_IN;
  130.     delay_us(10);//old=20
  131.     read_dat = Data_I();        //数据       
  132.     E_L;       

  133.     return (read_dat);
  134. }


  135. /*--------------------------------------------------------------*/
  136. //检查忙标志位
  137. void LCD_check_busy(void)
  138. {
  139.     unsigned char lcd_status;

  140.     do
  141.     {
  142.         lcd_status = LCD_read_cmd();
  143.     }
  144.     while(lcd_status & 0x80);

  145.     //delay_us(20);
  146. }


  147. /*--------------------------------------------------------------*/
  148. //写入指令
  149. void LCD_write_cmd(unsigned char cmd)
  150. {
  151.     //LCD_check_busy();
  152.     delay_us(3);//old=15
  153.     RS_L;                        //指令
  154.     RW_L;                        //写入
  155.     Data_IO_OUT;
  156.     Data_O(cmd);        //指令       
  157.     E_H;
  158.     delay_us(3);//old=20
  159.     E_L;                        //下降沿写入
  160. }


  161. /*--------------------------------------------------------------*/
  162. //写入数据
  163. void LCD_write_dat(unsigned char dat)
  164. {
  165.     //LCD_check_busy();
  166.     delay_us(3);//old=15
  167.     RS_H;                        //数据
  168.     RW_L;                        //写入
  169.     Data_IO_OUT;
  170.     Data_O(dat);        //数据
  171.     E_H;
  172.     delay_us(3);//old=20
  173.     E_L;                        //下降沿写入
  174. }


  175. /*--------------------------------------------------------------*/
  176. //液晶字节定位(8*1)
  177. //液晶规划:
  178. //x: 0 - 7        (行)
  179. //y: 0 -127        (列)
  180. void LCD_byte_pos(unsigned char x, unsigned char y)
  181. {
  182.         if(y < 64)
  183.     {
  184.         LCD_sel_left                //左半屏
  185.     }
  186.     else if(y>=64 && y<128)
  187.     {
  188.         y -= 64;
  189.         LCD_sel_middle
  190.     }
  191.         else
  192.     {
  193.         y -= 128;
  194.         LCD_sel_right
  195.     }        //右半屏
  196. //        LCD_write_cmd(Start_Line);                //起始行地址
  197.         LCD_write_cmd(X_Page_Addr + x);        //页地址0-7
  198.         LCD_write_cmd(Y_Col_Addr + y);        //列地址0-63
  199. }


  200. /*--------------------------------------------------------------*/
  201. //液晶字符定位(8*8)
  202. //液晶规划:
  203. //x: 0 - 7        (行)
  204. //y: 0 -15        (列)
  205. void LCD_char_pos(unsigned char x, unsigned char y)
  206. {
  207.         y <<= 3;
  208.         LCD_byte_pos(x, y);
  209. }


  210. /*--------------------------------------------------------------*/
  211. //显示清屏
  212. void LCD_clr_scr(unsigned char sel_dat)
  213. {
  214.         unsigned char i, j;
  215.        
  216.         if(sel_dat == 0)
  217.         {  
  218.             LCD_sel_left
  219.             for(j = 0; j < 8; j++)
  220.             {
  221.                     LCD_write_cmd(X_Page_Addr + j);
  222.                     LCD_write_cmd(Y_Col_Addr);
  223.                     for(i = 0; i < 64; i++) LCD_write_dat(0x00);
  224.             }
  225.         }
  226.     else if(sel_dat == 1)
  227.         {  
  228.             LCD_sel_middle
  229.             for(j = 0; j < 8; j++)
  230.             {
  231.                     LCD_write_cmd(X_Page_Addr + j);
  232.                     LCD_write_cmd(Y_Col_Addr);
  233.                     for(i = 0; i < 64; i++) LCD_write_dat(0x00);
  234.             }
  235.         }
  236.         else if(sel_dat == 2)
  237.         {
  238.             LCD_sel_right
  239.             for(j = 0; j < 8; j++)
  240.             {
  241.                     LCD_write_cmd(X_Page_Addr + j);
  242.                     LCD_write_cmd(Y_Col_Addr);
  243.                     for(i = 0; i < 64; i++) LCD_write_dat(0x00);
  244.             }
  245.         }
  246.         //else if(sel_dat == 2)        LCD_sel_all
  247.      else  if(sel_dat == 3)
  248.         {
  249.             LCD_sel_left
  250.             for(j = 0; j < 8; j++)
  251.             {
  252.                     LCD_write_cmd(X_Page_Addr + j);
  253.                     LCD_write_cmd(Y_Col_Addr);
  254.                     for(i = 0; i < 64; i++) LCD_write_dat(0x00);
  255.             }
  256.             LCD_sel_middle
  257.             for(j = 0; j < 8; j++)
  258.             {
  259.                     LCD_write_cmd(X_Page_Addr + j);
  260.                     LCD_write_cmd(Y_Col_Addr);
  261.                     for(i = 0; i < 64; i++) LCD_write_dat(0x00);
  262.             }
  263.             LCD_sel_right
  264.             for(j = 0; j < 8; j++)
  265.             {
  266.                     LCD_write_cmd(X_Page_Addr + j);
  267.                     LCD_write_cmd(Y_Col_Addr);
  268.                     for(i = 0; i < 64; i++) LCD_write_dat(0x00);
  269.             }
  270.         }
  271. }


  272. /*--------------------------------------------------------------*/
  273. //读出8bytes数据
  274. //液晶规划:
  275. //x: 0 - 7        (行)
  276. //y: 0 -15        (列)
  277. void LCD_read_8bytes(unsigned char x, unsigned char y, unsigned char *read_dat)
  278. {
  279.         unsigned char i;

  280.         LCD_char_pos(x, y); LCD_read_dat();        //空读一次!!!
  281.         for(i = 0; i < 8; i++)
  282.         {
  283.                 *read_dat = LCD_read_dat();
  284.                 read_dat++;       
  285.         }
  286. }


  287. /*--------------------------------------------------------------*/
  288. #if Font_type        //(8*16字体)
  289. /*--------------------------------------------------------------*/
  290. //液晶字符输出(8*16字体)
  291. //x: 0 -3   (行)
  292. //y: 0 -15        (列)
  293. void LCD_printc(unsigned char x, unsigned char y, unsigned char c_dat,unsigned char flag)
  294. {
  295.         unsigned char i, j;

  296.         for(j = 0; j < 2; j++)
  297.         {
  298.                 LCD_char_pos((x * 2 + j), y);
  299.                 for(i = 0; i < 8; i++)
  300.         {        
  301.             if(flag == ZHENGXIAN)
  302.                 LCD_write_dat( Font_code[c_dat - 32][8 * j + i]);
  303.             else
  304.                 LCD_write_dat(~Font_code[c_dat - 32][8 * j + i]);
  305.         }
  306.         }
  307. }
  308. /*--------------------------------------------------------------*/
  309. #else                         //(8*8字体)
  310. /*--------------------------------------------------------------*/
  311. //液晶字符输出(8*8字体)
  312. //x: 0 - 7        (行)
  313. //y: 0 -15        (列)
  314. //flag:高四位为0,正显,不为零,反显
  315. void LCD_printc(unsigned char x, unsigned char y, unsigned char c_dat,unsigned char flag)
  316. {
  317.         unsigned char i;
  318.     //me,判断坐标范围,old y>15
  319.     if(x>7 )    x=0;
  320.     if(y>23)    y=0;
  321.     //定位显示位置
  322.         LCD_char_pos(x, y);
  323.         for(i = 0; i < 6; i++)
  324.         {               
  325.                         if(flag == ZHENGXIAN)
  326.                                 LCD_write_dat( Font_code[c_dat - 32][i]);
  327.                         else
  328.                                 LCD_write_dat(~Font_code[c_dat - 32][i]);
  329.         }
  330. }

  331. //显示ASC码
  332. void LCD_printcu8(unsigned char x, unsigned char y, u8 c_dat,u8 flag)
  333. {
  334.         unsigned char i;
  335.         if(x>7 || y>15)//me,判断坐标范围
  336.           return;
  337.         LCD_char_pos(x, y);
  338.         for(i = 0; i < 6; i++)
  339.         if(flag == ZHENGXIAN)
  340.             LCD_write_dat(Font_code[c_dat - 32][i]);
  341.         else
  342.             LCD_write_dat(~Font_code[c_dat - 32][i]);
  343. }


  344. #endif


  345. /*--------------------------------------------------------------*/
  346. //液晶字符串输出
  347. //x: 0 - 3        (行)
  348. //y: 0 -15        (列)
  349. //flag:高四位为0正显,不为零反显
  350. void LCD_prints(unsigned char x, unsigned char y, unsigned char *s_dat,unsigned char flag)
  351. {
  352.         while(*s_dat)
  353.     {
  354.         LCD_printc(x, y++, *s_dat++,flag);
  355.     }
  356. }


  357. /*--------------------------------------------------------------*/
  358. //液晶字符反 {MOD}区域(8*8字体)
  359. //x: 0 - 7        (行)
  360. //y: 0 -15        (列)
  361. void LCD_inverse(unsigned char x, unsigned char y)
  362. {
  363.         unsigned char i;
  364.         unsigned char read_buffer[8];

  365.         LCD_read_8bytes(x, y, read_buffer);
  366.         LCD_char_pos(x, y);
  367.         for(i = 0; i < 8; i++) LCD_write_dat(~read_buffer[i]);
  368. }

  369. void LCD_inverse1(unsigned char x, unsigned char y)
  370. {
  371.         unsigned char i;
  372.         unsigned char read_buffer[6];

  373.         LCD_read_8bytes(x, y, read_buffer);
  374.         LCD_char_pos(x, y);
  375.         for(i = 0; i < 6; i++) LCD_write_dat(~read_buffer[i]);
  376. }


  377. /*--------------------------------------------------------------*/
  378. //液晶反 {MOD}显示
  379. void LCD_scr_inverse(void)
  380. {
  381.         unsigned char i, j;

  382.         for(j = 0; j < 8; j++)
  383.         {
  384.                 for(i = 0; i < 16; i++) LCD_inverse(j, i);
  385.         }
  386. }


  387. /*--------------------------------------------------------------*/
  388. #if Font_type        //(8*16字体)
  389. /*--------------------------------------------------------------*/
  390. //液晶字符反 {MOD}输出(8*16字体)
  391. //x: 0 - 3        (行)
  392. //y: 0 -15        (列)
  393. void LCD_inversec(unsigned char x, unsigned char y)
  394. {
  395.         x <<= 1;
  396.         LCD_inverse(x, y);
  397.         LCD_inverse(x+1, y);
  398. }

  399. /*--------------------------------------------------------------*/
  400. #else                         //(8*8字体)
  401. /*--------------------------------------------------------------*/
  402. //液晶字符反 {MOD}输出(8*8字体)
  403. //x: 0 - 7        (行)
  404. //y: 0 -15        (列)
  405. void LCD_inversec(unsigned char x, unsigned char y)
  406. {
  407.         LCD_inverse(x, y);
  408. }
  409. #endif


  410. /*--------------------------------------------------------------*/
  411. //液晶字符串反 {MOD}输出
  412. //x: 0 -3/7 (行)
  413. //y: 0 -15        (列)
  414. //num: num < 16 - y
  415. void LCD_inverses(unsigned char x, unsigned char y, unsigned char num)
  416. {
  417.         while(num--) LCD_inversec(x, y++);
  418. }

  419. /*--------------------------------------------------------------*/
  420. //液晶汉字输出(16*16字体)
  421. //取码规则:        低位在前, 列行扫描, 阴码(1-亮, 0-灭)
  422. //x: 0 - 3        (行)
  423. //y: 0 - 7        (列)
  424. //flag:0-显示;1-反显
  425. //len:待显示汉字的长度
  426. void LCD_PrintHZ16(unsigned char x, unsigned char y, unsigned char index,unsigned char flag)
  427. {
  428.     unsigned char i, j;
  429.     //unsigned char hh = sizeof(hz_gs)/32;
  430.     unsigned char wz = index ;
  431.         
  432.     //if((len==0) || (len>9))        return;//长度不对,可进一步判断,几个汉字,从第几列开始//
  433.     y <<= 1;//汉字
  434.         
  435.     for(j = 0; j < 2; j++)
  436.     {
  437.         LCD_char_pos(x+j, y);
  438.         
  439.         if(flag & FANXIAN)
  440.             for(i = 0; i < 16; i++)
  441.             {
  442.                 //tt=LCD_read_dat();
  443.                 LCD_write_dat(~zimo[wz][i+j*16]);//(hh-0x10)*94+ll-1=字模位置,hh and ll=qu qweima,quweima=neima-0xA0A0
  444.             }
  445.         else if(flag & ZHENGXIAN)
  446.             for(i = 0; i < 16; i++)
  447.             {
  448.                 //tt=LCD_read_dat();
  449.                 LCD_write_dat( zimo[wz][i+j*16]);
  450.             }
  451.         
  452.     }
  453. }
  454. /*--------------------------------------------------------------*/
  455. //液晶单个汉字输出(16*16字体)
  456. //取码规则:        低位在前, 列行扫描, 阴码(1-亮, 0-灭)
  457. //x: 0 - 3        (行)
  458. //y: 0 - 7        (列)
  459. //h_dat:汉字数组的指针
  460. //flag:0,正常显示,1,反显
  461. void LCD_printHZ(unsigned char x, unsigned char y, const unsigned char  *hzsy,unsigned char len,unsigned char flag)
  462. {
  463.         unsigned char i;

  464.     for(i=0;i<len;i++)
  465.     {
  466.         LCD_PrintHZ16(x, y+i, hzsy[i],flag);
  467.     }
  468. }
  469. /*--------------------------------------------------------------*/
  470. //液晶汉字输出(16*16字体)
  471. //取码规则:        低位在前, 列行扫描, 阴码(1-亮, 0-灭)
  472. //x: 0 - 3        (行)
  473. //y: 0 - 7        (列)
  474. //flag:0-显示;1-反显
  475. //len:待显示汉字的长度
  476. void LCD_printhz(unsigned char x, unsigned char y, unsigned char *neima,unsigned char flag,unsigned char len)
  477. {
  478.     unsigned char i, j, k;
  479.     unsigned short qweima,*qw;
  480.     unsigned char hh,ll;


  481.     if((len==0) || (len>8))        return;//长度不对,可进一步判断,几个汉字,从第几列开始//

  482.     x <<= 1;y <<= 1;
  483.     for(k=0;k<len;k++)
  484.     {
  485.         //位码转换
  486.         qweima=*((unsigned short *)(neima+k*2));
  487.         hh=qweima&0xFF;//变换字节
  488.         ll=(qweima >>8) & 0xFF;
  489.         qweima =hh<<8 | ll;
  490.         //----------------
  491.         qweima=qweima-41120;//B0A1-A0A0=1001  ->啊,1
  492.         qw=&qweima;
  493.         hh=*((unsigned char *)qw+1);
  494.         ll=*(unsigned char *)qw;
  495.         //----------------
  496.         for(j = 0; j < 2; j++)
  497.         {
  498.             LCD_char_pos((x + j), y+k*2);
  499.             
  500.             if(flag & 0xF0)
  501.                 for(i = 0; i < 16; i++) LCD_write_dat(~zimo[(hh-0x10)*94+ll-1][i+j*16]);//(hh-0x10)*94+ll-1=字模位置,hh and ll=qu qweima,quweima=neima-0xA0A0
  502.                 //for(i = 0; i < 16; i++) LCD_write_dat(        ~ *(zimo+(hh-0x10)*94+ll-1+i+j*16));
  503.             else
  504.                 for(i = 0; i < 16; i++) LCD_write_dat( zimo[(hh-0x10)*94+ll-1][i+j*16]);
  505.                 //for(i = 0; i < 16; i++) LCD_write_dat(                *(zimo+(hh-0x10)*94+ll-1+i+j*16));
  506.             
  507.         }
  508.         //y <<= 1;
  509.     }
  510. }

  511. /*--------------------------------------------------------------*/
  512. //液晶汉字反 {MOD}输出(16*16字体)
  513. //x: 0 - 3        (行)
  514. //y: 0 - 7        (列)
  515. void LCD_inversech(unsigned char x, unsigned char y)
  516. {
  517.         x <<= 1;        y <<= 1;
  518.         LCD_inverse(x, y);
  519.         LCD_inverse(x, y+1);
  520.         LCD_inverse(x+1, y);
  521.         LCD_inverse(x+1, y+1);
  522. }


  523. /*--------------------------------------------------------------*/
  524. //液晶汉字词组反 {MOD}输出
  525. //x: 0 - 3 (行)
  526. //y: 0 - 8 (列)
  527. //num: num < 8 - y        汉字个数
  528. void LCD_inversesh(unsigned char x, unsigned char y, unsigned char num)
  529. {
  530.         while(num--) {LCD_inversech(x, y); y++;}
  531. }


  532. /*--------------------------------------------------------------*/
  533. //液晶定位写入数据一个字节
  534. //液晶规划:
  535. //x: 0 - 7        (页)
  536. //y: 0 -127        (列)
  537. void LCD_write_dat_pos(unsigned char x, unsigned char y, unsigned char dat)
  538. {
  539.         LCD_byte_pos(x, y);
  540.         LCD_write_dat(dat);
  541. }


  542. /*--------------------------------------------------------------*/
  543. //液晶定位读出数据一个字节
  544. //液晶规划:
  545. //x: 0 - 7        (页)
  546. //y: 0 -127        (列)
  547. unsigned char LCD_read_dat_pos(unsigned char x, unsigned char y)
  548. {
  549.         unsigned char read_dat;

  550.         LCD_byte_pos(x, y);
  551.         read_dat = LCD_read_dat();                //dummy读
  552.         read_dat = LCD_read_dat();                //数据有效
  553.        
  554.         return (read_dat);       
  555. }


  556. /*--------------------------------------------------------------*/
  557. //显示128X64图片
  558. //取码规则:        低位在前, 列行扫描, 阴码(1-亮, 0-灭)
  559. void LCD_picture(unsigned char  *img_dat)
  560. {
  561.         unsigned char i, j;

  562.         for(j = 0; j < 8; j++)
  563.         {       
  564.                 for(i = 0; i < 128; i++)
  565.                 {
  566.                         LCD_write_dat_pos(j, i, img_dat[j * 128 + i]);
  567.                 }
  568.         }
  569. }


  570. /*--------------------------------------------------------------*/
  571. //定位显示指定大小图片
  572. //取码规则:        低位在前, 列行扫描, 阴码(1-亮, 0-灭)
  573. //pag:        0 - 7                        页坐标
  574. //col:  0 - 127                        列坐标
  575. //x:        0 - (127-col)        图片宽
  576. //y:        0 - (63-pag*8)        图片高
  577. void LCD_pos_picture(unsigned char pag, unsigned char col, unsigned char x, unsigned char y, unsigned char  *img_dat)
  578. {
  579.         unsigned char i, j;

  580.         y = (y + 4) >> 3;                        //四舍五入
  581.         for(j = 0; j < y; j++)
  582.         {       
  583.                 for(i = 0; i < x; i++)
  584.                 {
  585.                         LCD_write_dat_pos(pag + j, col + i, img_dat[j * x + i]);
  586.                 }
  587.         }
  588. }


  589. /*--------------------------------------------------------------*/
  590. //画点函数
  591. //x:        0 - 127                横坐标
  592. //y:        0 - 63                列坐标       
  593. //attr:                =1,                画点       
  594. //                        =0,                消点
  595. void LCD_pixel(unsigned char x, unsigned char y, unsigned char attr)
  596. {
  597.         unsigned char pixel_dat, temp_dat, yy;
  598.        
  599.         yy = y >> 3;                                                //划分到页
  600.         pixel_dat = LCD_read_dat_pos(yy, x);//读出数据
  601.         temp_dat = 0x01 << (y & 0x07);                //页中的点
  602.         if(attr) pixel_dat |= temp_dat;                //画点
  603.         else         pixel_dat &= ~temp_dat;        //消点
  604.         LCD_write_dat_pos(yy, x, pixel_dat);//写入组合数据
  605. }


  606. /*--------------------------------------------------------------*/
  607. //画横线
  608. //y:        0 - 63                列坐标       
  609. //attr:                =1,                画线
  610. //                        =0,                消线
  611. void LCD_line_h(unsigned char x,unsigned char ex,unsigned char y, unsigned char attr)
  612. {
  613.         unsigned char i;

  614.         for(i = x; i < ex; i++) LCD_pixel(i, y, attr);
  615. }


  616. /*--------------------------------------------------------------*/
  617. //画竖线
  618. //x:        0 - 128                横坐标
  619. //attr:                =1,                画线
  620. //                        =0,                消线
  621. void LCD_line_v(unsigned char x, unsigned char attr)
  622. {
  623.         unsigned char i;

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


  626. /*--------------------------------------------------------------*/
  627. //显示直线
  628. //x:        0 - 128                横坐标
  629. //y:        0 - 63                纵坐标
  630. //attr:                =1,                画线
  631. //                        =0,                消线
  632. void LCD_line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char attr)
  633. {
  634.     char dx, dy;
  635.     int inc_x, inc_y;
  636.     int  xerr = 0, yerr = 0;                                //初始化变量
  637.     unsigned char i, ds;

  638.     dx = x2 - x1;                                                        //计算坐标增量
  639.     dy = y2 - y1;

  640.     if(dx > 0)
  641.         inc_x = 1;                                        //设置单步方向
  642.     else
  643.     {
  644.         if(dx == 0)        
  645.         {
  646.             inc_x = 0;
  647.         } //垂直线
  648.         else                                       
  649.         {
  650.             inc_x = -1;
  651.             dx =(char)( (-1)*dx);
  652.         }
  653.     }

  654.     if(dy > 0)
  655.         inc_y = 1;                                        //设置单步方向
  656.     else
  657.     {
  658.         if(dy == 0)
  659.         {
  660.             inc_y = 0;
  661.         }        //水平线
  662.         else                                       
  663.         {
  664.             inc_y = -1;
  665.             dy = (char)((-1)*dy);
  666.         }
  667.     }

  668.     if(dx > dy)
  669.         ds = dx;                                        //选取基本增量坐标轴
  670.     else               
  671.         ds = dy;

  672.     for(i = 0; i <= ds+1; i++)                                //画线输出
  673.     {
  674.         LCD_pixel(x1, y1, attr);                        //画点
  675.         xerr += dx;
  676.         yerr += dy;
  677.         if(xerr > ds)
  678.         {
  679.             xerr -= ds;
  680.             x1   += inc_x;
  681.         }
  682.         if(yerr > ds)
  683.         {
  684.             yerr -= ds;
  685.             y1   += inc_y;
  686.         }
  687.     }
  688. }

  689. /*--------------------------------------------------------------*/
  690. //画矩形
  691. //x1:        0 - 128                起点更坐标
  692. //y1:        0 - 63                起点纵坐标
  693. //x2: 0 - 128                长度
  694. //y2: 0 - 63    高度
  695. //attr:                =1,                画线
  696. //                        =0,                消线
  697. void LCD_rectangle(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char attr)
  698. {
  699.     LCD_line(x1, y1, x1+x2, y1,attr);//-
  700.     LCD_line(x1, y1, x1, y1+y2,attr);//|
  701.     LCD_line(x1, y1+y2, x1+x2, y1+y2, attr);//_
  702.     LCD_line(x1+x2,y1, x1+x2, y1+y2, attr);// |
  703. }



  704. /*--------------------------------------------------------------*/
  705. //复位LCD128*64
  706. void LCD_reset_12864(void)
  707. {
  708.     LCD_sel_left;
  709.     LCD_write_cmd(Display_Off);        //关闭显示
  710.     LCD_sel_middle;
  711.     LCD_write_cmd(Display_Off);        //关闭显示
  712.     LCD_sel_right;
  713.     LCD_write_cmd(Display_Off);        //关闭显示
  714.    
  715.     CS1_L;CS2_L;CS3_L;
  716.     LCD_write_cmd(X_Page_Addr);        //起始页地址
  717.     LCD_write_cmd(Start_Line);        //起始行
  718.     LCD_write_cmd(Y_Col_Addr);        //起始列地址
  719.     CS1_H;CS2_H;CS3_H;

  720.     LCD_sel_middle;
  721.     LCD_write_cmd(Display_On);        //开启显示
  722.     LCD_sel_left;
  723.     LCD_write_cmd(Display_On);        //开启显示
  724.     LCD_sel_right;
  725.     LCD_write_cmd(Display_On);        //开启显示
  726.     //LCD_clr_scr(RSCR);                //清左屏
  727.     //LCD_clr_scr(LSCR);                //清左屏
  728.     LCD_clr_scr(3);
  729. }

  730. //清除某个矩形
  731. void LCD_clr_position(u8 startx,u8 starty,u8 endx,u8 endy)
  732. {
  733.         unsigned char j = endx -startx + 1;
  734.     u16 i = endy - starty;
  735.         //清屏
  736.     for(;j>0;j--)
  737.     {
  738.         i = endy - starty;
  739.         while(i--)
  740.         {
  741.             LCD_printc(startx,endy-i, 32,ZHENGXIAN);
  742.         }
  743.     }
  744. }
  745. /*--------------------------------------------------------------*/
  746. //液晶字符输出(8*16字体)
  747. //x: 0 -3   (行)
  748. //y: 0 -15        (列)
  749. //flag=0,正常显示,否则反显
  750. void LCD_Printsz(unsigned char x, unsigned char y, unsigned char sz,unsigned char flag)
  751. {
  752.         unsigned char i, j;
  753.         unsigned char tt=sz;

  754.     for(j = 0; j < 2; j++)
  755.     {
  756.         LCD_char_pos(x + j,y);      
  757.         if(flag==ZHENGXIAN)
  758.             for(i = 0; i < 8; i++)
  759.                 LCD_write_dat(shuzi[tt][8 * j + i]);//9.6temp
  760.         else
  761.             for(i = 0; i < 8; i++)
  762.                 LCD_write_dat(~shuzi[tt][8 * j + i]);//9.6temp
  763.     }
  764. }
  765. /*--------------------------------------------------------------*/
  766. //液晶字符输出(8*16字体)
  767. //x: 0 -3   (行)
  768. //y: 0 -15        (列)
  769. //flag=0,正常显示,否则反显
  770. void LCD_PrintUINT(unsigned char x, unsigned char y, unsigned int sz,unsigned char len,unsigned char flag)
  771. {
  772.         unsigned char i, j,k;
  773.         unsigned char dd[3];
  774.    
  775.     if(sz>999) return;
  776.    
  777.     dd[0]=sz%10;
  778.     dd[1]=sz%100/10;
  779.     dd[2]=sz%1000/100;

  780.     for(k=0;k<len;k++)
  781.     {
  782.         for(j = 0; j < 2; j++)
  783.         {
  784.             LCD_char_pos(x + j,y);      
  785.             if(flag==ZHENGXIAN)
  786.                 for(i = 0; i < 8; i++)
  787.                     LCD_write_dat(shuzi[dd[len-k-1]][8 * j + i]);//9.6temp
  788.             else
  789.                 for(i = 0; i < 8; i++)
  790.                     LCD_write_dat(~shuzi[dd[len-k-1]][8 * j + i]);//9.6temp
  791.         }
  792.         y++;
  793.     }
  794. }
  795. /*--------------------------------------------------------------*/
  796. //初始化LCD128*64
  797. void LCD_init_19264(void)
  798. {
  799.     LCD_reset_hard();                //硬件复位
  800.     LCD_reset_12864();      //软件复位
  801. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。