搜索
bottom↓
回复: 12

初学12864显示汉字和曲线,不知如何入手,求高手指点

[复制链接]

出0入0汤圆

发表于 2013-8-27 09:44:28 | 显示全部楼层 |阅读模式
初学12864显示汉字和曲线,不知如何入手,求高手指点,单片机是stm32f103ze,急急

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-8-27 13:57:53 | 显示全部楼层
  1. /*******************************************************************************
  2. * File Name          :
  3. * Author             :
  4. * Version            :
  5. * Date               :
  6. * Description        :
  7. ********************************************************************************
  8. *
  9. *
  10. *
  11. *
  12. *
  13. *
  14. *******************************************************************************/

  15. /* Includes ------------------------------------------------------------------*/
  16. #include "LCD.h"

  17. /* Private typedef -----------------------------------------------------------*/
  18. typedef void (*pFunctionr)(void);
  19. typedef uint8_t (*pFunctionw)(void);
  20. /* Private define ------------------------------------------------------------*/
  21. /* Private macro -------------------------------------------------------------*/
  22. #define SET_WR                                                         GPIO_SetBits(GPIOC,WR)
  23. #define RESET_WR                                                 GPIO_ResetBits(GPIOC,WR)

  24. #define SET_CE                                                         GPIO_SetBits(GPIOC,CE)
  25. #define RESET_CE                                                 GPIO_ResetBits(GPIOC,CE)

  26. #define SET_RD                                                         GPIO_SetBits(GPIOC,RD)
  27. #define RESET_RD                                                 GPIO_ResetBits(GPIOC,RD)

  28. #define SET_CD                                                         GPIO_SetBits(GPIOA,CD)
  29. #define RESET_CD                                                 GPIO_ResetBits(GPIOA,CD)

  30. #define SET_RST                                                 GPIO_SetBits(GPIOA,RST)
  31. #define RESET_RST                                                 GPIO_ResetBits(GPIOA,RST)

  32. #define SET_D0                                                         GPIO_SetBits(GPIOC,D0)
  33. #define RESET_D0                                                 GPIO_ResetBits(GPIOC,D0)

  34. #define SET_D1                                                         GPIO_SetBits(GPIOC,D1)
  35. #define RESET_D1                                                 GPIO_ResetBits(GPIOC,D1)

  36. #define SET_D2                                                         GPIO_SetBits(GPIOC,D2)
  37. #define RESET_D2                                                 GPIO_ResetBits(GPIOC,D2)

  38. #define SET_D3                                                         GPIO_SetBits(GPIOB,D3)
  39. #define RESET_D3                                                 GPIO_ResetBits(GPIOB,D3)

  40. #define SET_D4                                                         GPIO_SetBits(GPIOB,D4)
  41. #define RESET_D4                                                 GPIO_ResetBits(GPIOB,D4)

  42. #define SET_D5                                                         GPIO_SetBits(GPIOB,D5)
  43. #define RESET_D5                                                 GPIO_ResetBits(GPIOB,D5)

  44. #define SET_D6                                                         GPIO_SetBits(GPIOB,D6)
  45. #define RESET_D6                                                 GPIO_ResetBits(GPIOB,D6)

  46. #define SET_D7                                                         GPIO_SetBits(GPIOB,D7)
  47. #define RESET_D7                                                 GPIO_ResetBits(GPIOB,D7)


  48. #define VERTICAL_LENGTH                                         128
  49. #define VERTICAL_MODULE                                 16

  50. #define HORIZONTAL_LENGTH                                240
  51. #define HORIZONTAL_MODULE                                30

  52. #define TextDisRamSize                                        HORIZONTAL_MODULE * VERTICAL_MODULE
  53. #define GrapDisRamSize                                        HORIZONTAL_MODULE * VERTICAL_LENGTH
  54. #define TextRamOffset                                        0
  55. #define GrapRamOffset                                        HORIZONTAL_MODULE * VERTICAL_LENGTH


  56. #define __Cursor                                                        0x01
  57. #define __CGRAM                                                0x02
  58. #define __DisBuf                                                        0x04
  59. #define CMDSetAddrPointer                                        0x20

  60. #define CMDSetTextRamOffset                                0x40
  61. #define CMDSetTextRamProperty                                0X41
  62. #define CMDSetGrapRamOffset                                0x42
  63. #define CMDSetGrapRamProperty                                0X43

  64. #define __OR                                                        0x00
  65. #define __XOR                                                        0x01
  66. #define __AND                                                        0x03
  67. #define __Double                                                0x04
  68. #define CMDSynthetizeRamModel                                0x80

  69. #define __EnableCursorFlash                                        0x01
  70. #define __EnableCursor                                        0x02
  71. #define __EnableTextDisplay                                        0x04
  72. #define __EnableGrapDisplay                                        0x08

  73. #define CMDSetDisplayShape                                0x90

  74. #define __OneLine                                                0x00
  75. #define __TwoLine                                                0x01
  76. #define __ThreeLine                                                0x02
  77. #define __FourLine                                                0x03
  78. #define __Fiveine                                                0x04
  79. #define __SixLine                                                0x05
  80. #define __SevenLine                                                0x06
  81. #define __EightLine                                                0x07
  82. #define CMDSetCursorModel                                        0xA0


  83. #define __Write                                                        0x00
  84. #define __Read                                                        0x01
  85. #define __Esc                                                        0x02
  86. #define CMDSetAutoDataTrans                                0xB0

  87. #define __WritePlus                                                0x00
  88. #define __ReadPlus                                                0x01
  89. #define __WriteSubtract                                        0x02
  90. #define __ReadSubtract                                        0x03
  91. #define __WriteNoOffset                                        0x04
  92. #define __ ReadNoOffset                                        0x05
  93. #define CMDSetOneTimesDataTrans                        0xC0

  94. #define CMDReadOneByteDisRam                                0xE0
  95. #define CMDReadOneLineDisRam                                0xE8
  96. #define CMDBitWrite                                                0xF0

  97. #define OneByteTransRdy                                        0x03
  98. #define AutoWriteTransRdy                                        0x08
  99. #define AutoReadTransRdy                                        0x04
  100. /* Private variables ---------------------------------------------------------*/
  101. const uint8_t SetTextRamOffset[]                 = {TextRamOffset     % 256,TextRamOffset          >> 8,CMDSetTextRamOffset};
  102. const uint8_t SetTextRamProperty[]                 = {HORIZONTAL_MODULE % 256,HORIZONTAL_MODULE >> 8,CMDSetTextRamProperty};
  103. const uint8_t SetGrapRamOffset[]                 = {GrapRamOffset         % 256,GrapRamOffset     >> 8,CMDSetGrapRamOffset};
  104. const uint8_t SetGrapRamProperty[]                 = {HORIZONTAL_MODULE % 256,HORIZONTAL_MODULE >> 8,CMDSetGrapRamProperty};
  105. const uint8_t SetSynthetizeRamModel                 = CMDSynthetizeRamModel | __OR;
  106. const uint8_t SetDisplayShape                         = CMDSetDisplayShape         | //__EnableCursorFlash | __EnableCursor |
  107.                                                                                                                                   __EnableTextDisplay | __EnableGrapDisplay;

  108. const uint8_t SetCursorSetting                           = CMDSetCursorModel | __TwoLine;

  109. const uint8_t SetAutoTransRead                        = CMDSetAutoDataTrans | __Read;
  110. const uint8_t SetAutoTransWrite                        = CMDSetAutoDataTrans | __Write;
  111. const uint8_t SetAutoTransEsc                        = CMDSetAutoDataTrans | __Esc;

  112. uint8_t SetAddrPointer[]                                = {0X00,0X00,CMDSetAddrPointer | __DisBuf};
  113. uint8_t SetCursorPointer[]                                = {0X00,0X00,CMDSetAddrPointer | __Cursor};
  114. uint8_t SetOneTimesDataTrans[]                        = {0x00,CMDSetOneTimesDataTrans |__WritePlus};

  115. uint8_t TextDisBuf [HORIZONTAL_MODULE * VERTICAL_MODULE] = {0};
  116. uint8_t GrapDisBuf [HORIZONTAL_MODULE * VERTICAL_LENGTH] = {0};         //
  117. /* Private function prototypes -----------------------------------------------*/
  118. void SetD0(void)
  119. {GPIO_WriteBit(GPIOC,D0,Bit_SET);}

  120. void ResetD0(void)
  121. {GPIO_WriteBit(GPIOC,D0,Bit_RESET);}

  122. void SetD1(void)
  123. {GPIO_WriteBit(GPIOC,D1,Bit_SET);}

  124. void ResetD1(void)
  125. {GPIO_WriteBit(GPIOC,D1,Bit_RESET);}

  126. void SetD2(void)
  127. {GPIO_WriteBit(GPIOB,D2,Bit_SET);}

  128. void ResetD2(void)
  129. {GPIO_WriteBit(GPIOB,D2,Bit_RESET);}

  130. void SetD3(void)
  131. {GPIO_WriteBit(GPIOB,D3,Bit_SET);}

  132. void ResetD3(void)
  133. {GPIO_WriteBit(GPIOB,D3,Bit_RESET);}

  134. void SetD4(void)
  135. {GPIO_WriteBit(GPIOB,D4,Bit_SET);}

  136. void ResetD4(void)
  137. {GPIO_WriteBit(GPIOB,D4,Bit_RESET);}

  138. void SetD5(void)
  139. {GPIO_WriteBit(GPIOB,D5,Bit_SET);}

  140. void ResetD5(void)
  141. {GPIO_WriteBit(GPIOB,D5,Bit_RESET);}

  142. void SetD6(void)
  143. {GPIO_WriteBit(GPIOB,D6,Bit_SET);}

  144. void ResetD6(void)
  145. {GPIO_WriteBit(GPIOB,D6,Bit_RESET);}

  146. void SetD7(void)
  147. {GPIO_WriteBit(GPIOB,D7,Bit_SET);}

  148. void ResetD7(void)
  149. {GPIO_WriteBit(GPIOB,D7,Bit_RESET);}

  150. uint8_t ReadD0(void)          {return (GPIO_ReadInputDataBit(GPIOC,D0) << 0);}
  151. uint8_t ReadD1(void)        {return (GPIO_ReadInputDataBit(GPIOC,D1) << 1);}
  152. uint8_t ReadD2(void)        {return (GPIO_ReadInputDataBit(GPIOB,D2) << 2);}
  153. uint8_t ReadD3(void)        {return (GPIO_ReadInputDataBit(GPIOB,D3) << 3);}
  154. uint8_t ReadD4(void)        {return (GPIO_ReadInputDataBit(GPIOB,D4) << 4);}
  155. uint8_t ReadD5(void)        {return (GPIO_ReadInputDataBit(GPIOB,D5) << 5);}
  156. uint8_t ReadD6(void)        {return (GPIO_ReadInputDataBit(GPIOB,D6) << 6);}
  157. uint8_t ReadD7(void)        {return (GPIO_ReadInputDataBit(GPIOB,D7) << 7);}

  158. const pFunctionr wpl[8] = {ResetD0,ResetD1,ResetD2,ResetD3,ResetD4,ResetD5,ResetD6,ResetD7};
  159. const pFunctionr wph[8] = {SetD0,SetD1,SetD2,SetD3,SetD4,SetD5,SetD6,SetD7};
  160. pFunctionr                  wp[8]         = {ResetD0,ResetD1,ResetD2,ResetD3,ResetD4,ResetD5,ResetD6,ResetD7};
  161. const pFunctionw rp[8]  = {ReadD0,ReadD1,ReadD2,ReadD3,ReadD4,ReadD5,ReadD6,ReadD7};
  162. /* Private functions ---------------------------------------------------------*/
  163. uint8_t ReadDataBus(void)
  164. {
  165.         uint8_t data = 0;
  166.         uint8_t index = 0;
  167.         GPIO_InitTypeDef  GPIO_InitStructure;
  168.        
  169.         GPIO_InitStructure.GPIO_Pin = D0 | D1;
  170.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  171.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  172.         GPIO_Init(GPIOC,&GPIO_InitStructure);
  173.        
  174.         GPIO_InitStructure.GPIO_Pin = D2 | D3 | D4 | D5| D6 | D7;
  175.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  176.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  177.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  178.         for (index = 0; index < 8;index++)
  179.         {
  180.                 data |= rp[index]();
  181.         }
  182.         return data;
  183. }
  184. void WriteDataBus(uint8_t data)
  185. {
  186.         uint8_t index = 0;
  187.         GPIO_InitTypeDef  GPIO_InitStructure;
  188.        
  189.         GPIO_InitStructure.GPIO_Pin = D0 | D1;
  190.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  191.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  192.         GPIO_Init(GPIOC,&GPIO_InitStructure);
  193.        
  194.         GPIO_InitStructure.GPIO_Pin = D2 | D3 | D4 | D5| D6 | D7;
  195.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  196.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  197.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  198.         for(index = 0;index < 8;index++)
  199.         {
  200.                 wp[index] = (0x01 << index) & data ? wph[index] : wpl[index];
  201.         }
  202.         for(index = 0;index < 8;index++)
  203.         {
  204.                 wp[index]();
  205.         }
  206. }
  207. uint8_t GetStatusBit()
  208. {
  209.         uint8_t temp = 0;
  210.        
  211.         SET_CD;       
  212.         RESET_RD;
  213.         SET_WR;
  214.         RESET_CE;       
  215.         temp = ReadDataBus();
  216.         SET_CE;               
  217.         SET_CD;
  218.         SET_RD;
  219.         SET_WR;
  220.         return temp;
  221. }
  222. void WriteData(uint8_t data)
  223. {
  224.         while((GetStatusBit() & OneByteTransRdy) != OneByteTransRdy);
  225.         WriteDataBus(data);
  226.         RESET_CD;
  227.         SET_RD;
  228.         RESET_WR;
  229.         RESET_CE;       
  230.         RESET_CE;               
  231.         SET_CE;       
  232.         SET_CD;
  233.         SET_RD;
  234.         SET_WR;
  235.         while((GetStatusBit() & OneByteTransRdy) != OneByteTransRdy);
  236. }

  237. void WriteCMD(uint8_t data)
  238. {
  239.        
  240.         while((GetStatusBit() & OneByteTransRdy) != OneByteTransRdy);
  241.         WriteDataBus(data);       
  242.         SET_CD;       
  243.         SET_RD;
  244.         RESET_WR;       
  245.         RESET_CE;               
  246.         RESET_CE;       
  247.         SET_CE;       
  248.         SET_CD;
  249.         SET_RD;
  250.         SET_WR;
  251.         while((GetStatusBit() & OneByteTransRdy) != OneByteTransRdy);
  252. }
  253. void AutoReadData(uint8_t *p,uint16_t len)
  254. {
  255.         uint8_t temp = 0;
  256.         WriteCMD(SetAutoTransRead);
  257.         while(len-- != 0)
  258.         {
  259.                 while((GetStatusBit() & AutoReadTransRdy) != AutoReadTransRdy);
  260.                 RESET_CD;
  261.                 SET_WR;
  262.                 RESET_RD;               
  263.                 RESET_CE;
  264.                 temp = ReadDataBus();
  265.                 *p++ = temp;;
  266.                 SET_CE;       
  267.                 SET_CD;
  268.                 SET_RD;
  269.                 SET_WR;               
  270.         }
  271.         while((GetStatusBit() & AutoReadTransRdy) != AutoReadTransRdy);       
  272.         WriteCMD(SetAutoTransEsc);
  273. }
  274. void AutoWriteData(uint8_t *p,uint16_t len)
  275. {
  276.         WriteCMD(SetAutoTransWrite);
  277.         while(len-- != 0)
  278.         {
  279.                 while((GetStatusBit() & AutoWriteTransRdy) != AutoWriteTransRdy);       
  280.                 WriteDataBus(*p++);               
  281.                 RESET_CD;
  282.                 SET_RD;
  283.                 RESET_WR;
  284.                 RESET_CE;       
  285.                 RESET_CE;               
  286.                 SET_CE;       
  287.                 SET_CD;
  288.                 SET_RD;
  289.                 SET_WR;
  290.         }
  291.         while((GetStatusBit() & AutoWriteTransRdy) != AutoWriteTransRdy);
  292.         WriteCMD(SetAutoTransEsc);
  293. }
  294. void WriteOneByte(uint8_t data)
  295. {
  296.                
  297. }
  298. void LCDZeroInit(void)
  299. {
  300.         uint16_t index = 0;
  301.         /* clr text buffer */
  302.         SetAddrPointer[2] = CMDSetAddrPointer | __DisBuf;
  303.         SetAddrPointer[1] = TextRamOffset >> 8;
  304.         SetAddrPointer[0] = TextRamOffset % 256;
  305.         WriteData(SetAddrPointer[0]);
  306.         WriteData(SetAddrPointer[1]);
  307.         WriteCMD(SetAddrPointer[2]);       
  308.         for (index = 0;index < TextDisRamSize;index++)
  309.                 TextDisBuf[index] = 0x00;
  310.         AutoWriteData(TextDisBuf,TextDisRamSize);
  311.         #ifdef LCD_USER_DEBUG
  312.                 /* set text buffer */
  313.                 SetAddrPointer[2] = CMDSetAddrPointer | __DisBuf;
  314.                 SetAddrPointer[1] = TextRamOffset >> 8;
  315.                 SetAddrPointer[0] = TextRamOffset % 256;
  316.                 WriteData(SetAddrPointer[0]);
  317.                 WriteData(SetAddrPointer[1]);
  318.                 WriteCMD(SetAddrPointer[2]);       
  319.                 for (index = 0;index < TextDisRamSize;index++)
  320.                         TextDisBuf[index] = 0x01;
  321.                 AutoWriteData(TextDisBuf,TextDisRamSize);
  322.                 /* read text buffer */
  323.                 SetAddrPointer[2] = CMDSetAddrPointer | __DisBuf;
  324.                 SetAddrPointer[1] = TextRamOffset >> 8;
  325.                 SetAddrPointer[0] = TextRamOffset % 256;
  326.                 WriteData(SetAddrPointer[0]);
  327.                 WriteData(SetAddrPointer[1]);
  328.                 WriteCMD(SetAddrPointer[2]);
  329.                 for (index = 0;index < TextDisRamSize;index++)
  330.                         TextDisBuf[index] = 0x00;
  331.                 AutoReadData(TextDisBuf,TextDisRamSize);
  332.                 for (index = 0;index < TextDisRamSize;index++)
  333.                         if (TextDisBuf[index] != 0x01)
  334.                                 while(1);
  335.         #endif               
  336.         /* clr grap buffer */
  337.         SetAddrPointer[2] = CMDSetAddrPointer | __DisBuf;
  338.         SetAddrPointer[1] = GrapRamOffset >> 8;
  339.         SetAddrPointer[0] = GrapRamOffset % 256;
  340.         WriteData(SetAddrPointer[0]);
  341.         WriteData(SetAddrPointer[1]);
  342.         WriteCMD(SetAddrPointer[2]);       
  343.         for (index = 0;index < GrapDisRamSize;index++)
  344.                 GrapDisBuf[index] = 0x00;
  345.         AutoWriteData(GrapDisBuf,GrapDisRamSize);
  346.         #ifdef LCD_USER_DEBUG
  347.                 /* set grap buffer */       
  348.                 SetAddrPointer[2] = CMDSetAddrPointer | __DisBuf;
  349.                 SetAddrPointer[1] = GrapRamOffset >> 8;
  350.                 SetAddrPointer[0] = GrapRamOffset % 256;
  351.                 WriteData(SetAddrPointer[0]);
  352.                 WriteData(SetAddrPointer[1]);
  353.                 WriteCMD(SetAddrPointer[2]);       
  354.                 for (index = 0;index < GrapDisRamSize;index++)
  355.                         GrapDisBuf[index] = 0x81;
  356.                 AutoWriteData(GrapDisBuf,GrapDisRamSize);               
  357.                        
  358.                 SetAddrPointer[2] = CMDSetAddrPointer | __DisBuf;
  359.                 SetAddrPointer[1] = GrapRamOffset >> 8;
  360.                 SetAddrPointer[0] = GrapRamOffset % 256;
  361.                 WriteData(SetAddrPointer[0]);
  362.                 WriteData(SetAddrPointer[1]);
  363.                 WriteCMD(SetAddrPointer[2]);
  364.                 for (index = 0;index < GrapDisRamSize;index++)
  365.                         GrapDisBuf[index] = 0x00;               
  366.                 AutoReadData(GrapDisBuf,GrapDisRamSize);
  367.                 for (index = 0;index < GrapDisRamSize;index++)
  368.                         if (GrapDisBuf[index] != 0x81)
  369.                                 while(1);
  370.         #endif
  371. }
  372. void LCDInit(void)
  373. {
  374.         uint32_t index = 0;
  375.         for (index = 0;index < 500000;index++)
  376.                 RESET_RST;
  377.         for (index = 0;index < 500000;index++)
  378.                 SET_RST;
  379.         WriteData(SetTextRamOffset[0]);
  380.         WriteData(SetTextRamOffset[1]);
  381.         WriteCMD(SetTextRamOffset[2]);
  382.        
  383.         WriteData(SetTextRamProperty[0]);
  384.         WriteData(SetTextRamProperty[1]);
  385.         WriteCMD(SetTextRamProperty[2]);
  386.        
  387.         WriteData(SetGrapRamOffset[0]);
  388.         WriteData(SetGrapRamOffset[1]);
  389.         WriteCMD(SetGrapRamOffset[2]);

  390.         WriteData(SetGrapRamProperty[0]);
  391.         WriteData(SetGrapRamProperty[1]);
  392.         WriteCMD(SetGrapRamProperty[2]);
  393.        
  394.        
  395.         WriteCMD(SetSynthetizeRamModel);
  396.         WriteCMD(SetDisplayShape);       
  397.         WriteCMD(SetCursorSetting);
  398.        
  399. //         SetCursorPointer[2] = CMDSetAddrPointer | __Cursor;
  400. //         SetCursorPointer[1] = 0x00;//GrapRamOffset >> 8;
  401. //         SetCursorPointer[0] = 0x00;//GrapRamOffset % 256;
  402. //         WriteData(SetCursorPointer[0]);
  403. //         WriteData(SetCursorPointer[1]);
  404. //         WriteCMD(SetCursorPointer[2]);
  405.                
  406.         LCDZeroInit();
  407. }
  408. void ReadGrapRam(LCDData *data)
  409. {
  410.         uint8_t col_index = 0;
  411.         uint8_t row_index = 0;
  412.         uint16_t index    = 0;
  413.        
  414.         uint8_t src_bit = 0;
  415.         uint8_t src_byte = 0;
  416.        
  417.         uint8_t des_bit = 0;
  418.                  
  419.         for (row_index = 0;row_index < data->heigth;row_index++)       
  420.         {
  421.                 for (col_index = 0;col_index < data->width;col_index++)
  422.                 {
  423.                         index = (data->x_pixel + col_index) / 8 + (row_index + data->y_pixel) * HORIZONTAL_MODULE;
  424.                
  425.                         src_byte = *(GrapDisBuf + index );
  426.                        
  427.                         src_bit  = (src_byte & (0x80 >> ((data->x_pixel + col_index) % 8)))? 0x80 : 0x00;
  428.                        
  429.                         des_bit  = src_bit >> (col_index % 8);
  430.        
  431.                         *(data->data + (col_index + row_index * data->width) / 8) |= (uint8_t)des_bit;               
  432.                 }
  433.         }
  434. }
  435. void WriteGrapRam(LCDData *data)
  436. {
  437.         uint8_t col_index = 0;
  438.         uint8_t row_index = 0;
  439.         uint16_t index    = 0;
  440.        
  441.         uint8_t src_bit = 0;
  442.         uint8_t src_byte = 0;
  443.        
  444.         uint8_t des_bit = 0;

  445.         for (row_index = 0;row_index < data->heigth;row_index++)       
  446.         {
  447.                 for (col_index = 0;col_index < data->width;col_index++)
  448.                 {
  449.                         index = (data->x_pixel + col_index) / 8 + (row_index + data->y_pixel) * HORIZONTAL_MODULE;
  450.                
  451.                         src_byte = *(data->data + (col_index + row_index * data->width) / 8 );
  452.                         src_bit  = (src_byte & (0x80 >> ((col_index + row_index * data->width) % 8))) ? 0x80 : 0x00;
  453.                        
  454.                         des_bit  = src_bit >> (data->x_pixel + col_index) % 8;
  455.        
  456.                         GrapDisBuf[index] |= (uint8_t)des_bit;       
  457.                
  458.                 }
  459.         }
  460.        
  461. }
  462. void ClrGrapRam(LCDData *data)
  463. {
  464.         uint8_t col_index = 0;
  465.         uint8_t row_index = 0;
  466.         uint16_t index    = 0;
  467.         /* clr grap ram */
  468.         for (row_index = 0;row_index < data->heigth;row_index++)       
  469.         {
  470.                 index = (row_index + data->y_pixel) * HORIZONTAL_MODULE;
  471.                 GrapDisBuf[index + data->x_pixel / 8] &= (~(0xFF >> (data->x_pixel % 8)));
  472.                 GrapDisBuf[index + (data->x_pixel + data->width) / 8] &=  (0xFF >> (data->x_pixel + data->width) % 8);
  473.                 for (col_index = data->x_pixel / 8 + 1;col_index < (data->x_pixel + data->width) / 8;col_index++)
  474.                 {                                       
  475.                         GrapDisBuf[index + col_index] = 0;               
  476.                 }
  477.         }
  478. }

  479. void CopyClrGrapRam(LCDData *srcdata,LCDData* dstdata)
  480. {
  481.        
  482.        
  483. }
  484. void RefurbishLCD(LCDData *data)
  485. {
  486.         uint8_t index = 0;
  487.         uint8_t length = 0;
  488.         uint32_t ramoffset = 0;
  489.         uint32_t bufoffset = 0;

  490.         for (index = 0;index < data->heigth;index++)
  491.         {
  492.                 if ((data->x_pixel) % 8 == 0 && (data->width) % 8 == 0)
  493.                 {
  494.                         bufoffset = data->x_pixel / 8 + (data->y_pixel + index) * HORIZONTAL_MODULE;
  495.                         ramoffset = GrapRamOffset + bufoffset;
  496.                         length = data->width / 8;
  497.                         SetAddrPointer[2] = CMDSetAddrPointer | __DisBuf;
  498.                         SetAddrPointer[1] = ramoffset >> 8;
  499.                         SetAddrPointer[0] = ramoffset % 256;
  500.                         WriteData(SetAddrPointer[0]);
  501.                         WriteData(SetAddrPointer[1]);
  502.                         WriteCMD(SetAddrPointer[2]);       
  503.                         AutoWriteData(GrapDisBuf + bufoffset,length);

  504.                 }
  505.                 else
  506.                 {                       
  507.                         bufoffset = ((data->x_pixel - (data->x_pixel % 8)) / 8) + (data->y_pixel + index) * HORIZONTAL_MODULE;
  508.                         ramoffset = GrapRamOffset + bufoffset;
  509.                         length = ((data->x_pixel + data->width) - ((data->x_pixel + data->width) % 8) + 8) / 8 - (data->x_pixel - (data->x_pixel % 8)) / 8;
  510.                         SetAddrPointer[2] = CMDSetAddrPointer | __DisBuf;
  511.                         SetAddrPointer[1] = ramoffset >> 8;
  512.                         SetAddrPointer[0] = ramoffset % 256;
  513.                         WriteData(SetAddrPointer[0]);
  514.                         WriteData(SetAddrPointer[1]);
  515.                         WriteCMD(SetAddrPointer[2]);       
  516.                         AutoWriteData(GrapDisBuf + bufoffset,length);               
  517.                 }
  518.         }
  519. }
  520. #ifdef USER_DEBUG
  521. void CheckGrapRam(void)
  522. {
  523.         LCDData __data;
  524.         __data.x_pixel = 0;
  525.         __data.y_pixel        = 0;
  526.         __data.width   = 240;
  527.         __data.heigth  = 128;
  528.         RefurbishLCD(&__data);
  529. }
  530. #endif
复制代码

出0入0汤圆

发表于 2013-8-27 14:04:02 | 显示全部楼层
  1. typedef __packed struct LCDDataTag
  2. {
  3.         /* 页面关系 */
  4.         uint16_t net;
  5.         /* 数据区 */
  6.         uint8_t x_pixel;
  7.         uint8_t y_pixel;
  8.         uint8_t width;
  9.         uint8_t heigth;
  10.         uint8_t* data;
  11. }LCDData;
复制代码

出0入0汤圆

发表于 2013-8-27 14:04:41 | 显示全部楼层
这是240 128 的 凑合着看吧···

出0入0汤圆

 楼主| 发表于 2013-8-27 18:04:12 | 显示全部楼层
macaroni 发表于 2013-8-27 14:04
这是240 128 的 凑合着看吧···

谢谢,非常感谢

出0入0汤圆

发表于 2013-10-29 08:51:19 | 显示全部楼层
/********************************************************/
/********************************************************/
/****12864驱动程序头文件********************/
/********************************************************/
/********************************************************/
#ifndef __LCD_12864_H
#define __LCD_12864_H
/********************************************************/
/********************************************************/
#include "stm32f10x.h"
/********************************************************/
/********************************************************/
#define UP   1
#define DOWN 0
/********************************************************/
/********************************************************/
/*液晶数据端口定义  PD口*/
//#define LCD_DATA GPIOD
/********************************************************/
/********************************************************/
/*液晶端口定义*/
#define LCD_CS(a)        if (a) \
                                        GPIO_SetBits(GPIOB,GPIO_Pin_10);\
                                        else                \
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_10)

#define LCD_SID(a)        if (a)        \
                                        GPIO_SetBits(GPIOB,GPIO_Pin_11);\
                                        else                \
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_11)

#define LCD_SCLK(a)        if (a)        \
                                        GPIO_SetBits(GPIOB,GPIO_Pin_12);\
                                        else                \
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_12)

#define LCD_PSB(a)        if (a)        \
                                        GPIO_SetBits(GPIOB,GPIO_Pin_13);\
                                        else                \
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_13)

//#define LCD_RST(a)        if (a)        \
//                                        GPIO_SetBits(GPIOE,GPIO_Pin_11);\
//                                        else                \
//                                        GPIO_ResetBits(GPIOE,GPIO_Pin_11)



















/********************************************************/
/***12864驱动文件****************/
/********************************************************/
/********************************************************/
#include"lcd_12864.h"
#include "SYSTICK.h"

/********************************************************/
/********************************************************/
const unsigned char table1[]=" ADC值:";
const unsigned char table2[]="电压值:";
extern u16 adc,adc1;
u8 qian,bai,shi,ge;
u8 ADC_0,ADC_1,ADC_2,ADC_3,ADC_4;          
/********************************************************/
/********************************************************/
         /*LCD管脚配置*/
void LCD_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        /*开启GPIO的外设时钟*/
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);
        /*选择要用的GPIO引脚*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/********************************************************/
/********************************************************/
  /*以串行协议发送数据*/
void send_bit(u8 byte)
{
        u8 x;
        for(x=0;x<8;x++)
        {
                if((byte<<x)&0x80)
                {
                        LCD_SID(UP);
                }
                else
                {
                        LCD_SID(DOWN);
                }
                LCD_SCLK(DOWN);
                LCD_SCLK(UP);
        }
        delay_ms(5);
}
/********************************************************/
/********************************************************/
        /*写指令函数*/
void write_command(u8 command)
{
        LCD_CS(UP);
    send_bit(0xf8);
    send_bit((u32)command&0xf0);
        send_bit(((u32)command<<4)&0xf0);
    delay_ms(5);
        LCD_CS(DOWN);
}
/********************************************************/
/********************************************************/
  /*液晶写数据功能函数函数*/
void write_data(const u8 Data)
{
        LCD_CS(UP);
        send_bit(0xfa);
        send_bit((u32)Data&0xf0);
        send_bit(((u32)Data<<4)&0xf0);
        delay_ms(5);
        LCD_CS(DOWN);
}
/********************************************************/
/********************************************************/
  /* 显示字符串   */
void write_zi( u8 *S)
{
while(*S!='\0')
   {
   write_data(*S);
   S++;
   delay_ms(5);
   }
}
/********************************************************/
/********************************************************/
  /*在指定位置写入字符串*/
void write_character(u8 address,const u8 *p)
{
        write_command(address);
        delay_ms(5);
        while(*p!='\0')
        {
                write_data(*p);
                p++;
                delay_ms(5);
        }
}

/********************************************************/

void lcd_pos(u8 X,u8 Y)          //液晶地址设置
  {
        u8 pos;
        if(X==0)
        {X=0x80;}
        else if(X==1)
        {X=0x90;}
        else if(X==2)
        {X=0x88;}
        else if(X==3)
        {X=0x98;}
        pos=X+Y;
        write_command(pos);
  }
/********************************************************/
  /*LCD 初始化设定*/
void LCD_init(void)
{
        LCD_PSB(DOWN);
        write_command(0x30);  //设置8位数据接口模式,基本指令操作模式
        delay_ms(1);
        write_command(0x0c);  //开显示,关光标,反白关
        delay_ms(1);
        write_command(0x01);        //写入空格清屏
        delay_ms(1);
        write_command(0x06);  //游标及显示右移一位
        delay_ms(1);   
}

void display_adc(void)
{
   
   qian=adc/1000;
   bai=adc%1000/100;
   shi=adc%100/10;
   ge=adc%10;

   ADC_0=adc1/10000;
   ADC_1=adc1%10000/1000;
   ADC_2=adc1%1000/100;
   ADC_3=adc1%100/10;
   ADC_3=adc1%10;
   
   write_character(0x80,table1);
   delay_ms(10);

   lcd_pos(0,4);
   write_data(qian+0x30);
   write_data(bai+0x30);
   write_data(shi+0x30);
   write_data(ge+0x30);

   write_character(0x88,table2);
   delay_ms(10);

   lcd_pos(2,4);
   write_data(ADC_0+0x30);
   write_zi(".");
   write_data(ADC_1+0x30);
   write_data(ADC_2+0x30);
   write_data(ADC_3+0x30);
   write_data(ADC_4+0x30);
   
}

出0入0汤圆

发表于 2013-10-29 14:00:59 | 显示全部楼层
额,代码好长。。。

出0入0汤圆

发表于 2013-10-29 17:21:51 | 显示全部楼层
12864有好几种,有一种不带字库的默认就是画点的,如果要显示汉字要自己做字模
有一种带字库的默认是显示字,如果想要画点,需要该模式

出0入0汤圆

发表于 2014-5-7 15:11:18 | 显示全部楼层
本坛魏坤示波器,有详细的程序可供参考
建议你移植ZLGGUI

出0入85汤圆

发表于 2014-5-7 15:34:34 | 显示全部楼层
玩过点阵LED就知道汉字怎么显示了,至于曲线,可以用画点实现,也可以用画线实现

出130入20汤圆

发表于 2014-5-7 16:33:24 | 显示全部楼层
先驱动能显示一个点,再用画曲线的函数和字库来实现

出0入0汤圆

发表于 2014-5-15 14:48:21 | 显示全部楼层
qinshiysb 发表于 2013-10-29 08:51
/********************************************************/
/**************************************** ...

为什么用你的代码 液晶还是不显示  串行连接的

出0入0汤圆

发表于 2014-5-28 11:19:43 | 显示全部楼层
你的接线方式是什么?驱动程序是否正常。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 22:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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