M128128.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:13k
源码类别:

uCOS

开发平台:

C/C++

  1. /****************************************************************************************
  2. * 文件名:LCDDRIVE.C
  3. * 功能:图形液晶240*128驱动(型号为SMG240128A)。32K显示存,0000H-7FFFH地址。显示是横向字节,高位
  4. *      在前。
  5. * 说明:图形液晶采用T6963C为LCD控制芯片,内带负压产生器,单5伏供电,并行接口(使用LPC2210驱动)。
  6. * 硬件连接: D0--D7 <===>  D0--D7
  7. *           /WR     <===>  nWE
  8. *           /RD     <===>  nOE
  9. *           /CE     <===>  nCS3_1
  10. *           C/D     <===>  A1
  11. *
  12. *           /RST    <===>  VCC
  13. ****************************************************************************************/
  14. /*********************************************************************
  15.  * INCLUDES
  16.  */
  17. #include "includes.h"
  18. /*********************************************************************
  19.  * CONSTANTS
  20.  */
  21. #define  LOW 0
  22. #define  HIGH 1
  23. //#define  ESC_KEY 0x1b
  24. #define  LCD_DISP_ON 0x3f // Controls the display onor off. Internal status and 
  25. #define  LCD_DISP_OFF 0x3e // display RAM data is not affected.L:OFF, H:ON
  26. #define  LCD_SET_X( X ) ( 0x40 + X )
  27. #define  LCD_SET_Y( Y ) ( 0xb8 + Y )
  28. #define  LCD_DISP_START_L( L ) ( 0xc0 + L )
  29. #define  LCD_STATUS_BUSY 0x80
  30. #define  LCD_STATUS_READ() ( 0x80 & LCD_DATA_BUS )
  31. /*********************************************************************
  32.  * MACROS
  33.  */
  34. #define  LCD_DATA_BUS 0
  35. #define  LCD_CONTROL_BUS 0
  36. #define  LCD_DATA_BUS_CON 0
  37. #define  LCD_CONTROL_BUS_CON 0
  38. #define  PAGE_ALL_S ( ( LCD_CONTROL_BUS & 0xff ) | 0x0f )
  39. #define  PAGE_ALL_DS (   LCD_CONTROL_BUS & 0xf0          )
  40. #define  PAGE_1 ( ( LCD_CONTROL_BUS & 0xf0 ) | 0x01 )
  41. #define  PAGE_2 ( ( LCD_CONTROL_BUS & 0xf0 ) | 0x02 )
  42. #define  PAGE_3 ( ( LCD_CONTROL_BUS & 0xf0 ) | 0x04 )
  43. #define  PAGE_4 ( ( LCD_CONTROL_BUS & 0xf0 ) | 0x08 )
  44. #define  LCD_DATA_BUS_INIT()    ( LCD_DATA_BUS_CON = ( ( LCD_DATA_BUS_CON & 0xffff0000 ) | 0x5555 ) )
  45. #define  LCD_CONTROL_BUS_INIT() ( LCD_CONTROL_BUS_CON = 0x5555 )
  46. #define  CMD ( LCD_CONTROL_BUS & ~0x10 )
  47. #define  DAT ( LCD_CONTROL_BUS |  0x10 )
  48. #define  WRITE ( LCD_CONTROL_BUS & ~0x20 )
  49. #define  READ ( LCD_CONTROL_BUS |  0x20 )
  50. #define  ENABLE     ( LCD_CONTROL_BUS & ~0x40 )
  51. #define  DISNABLE ( LCD_CONTROL_BUS |  0x40 )
  52. #define  RESET ( LCD_CONTROL_BUS & ~0x80 )
  53. #define  WORK ( LCD_CONTROL_BUS |  0x80 )
  54. #define  LCD_PAGE_CS( PAGE_x ) ( LCD_CONTROL_BUS = PAGE_x )//( LCD_CONTROL_BUS & 0xf0 ) | ( 0x01 << PAGE_x ) )
  55. #define  RS( x ) ( LCD_CONTROL_BUS = x )
  56. #define  RW( x ) ( LCD_CONTROL_BUS = x )
  57. #define  CE( x ) ( LCD_CONTROL_BUS = x )
  58. #define  LCD_RESET( rst )  ( LCD_CONTROL_BUS = rst ) 
  59. /*********************************************************************
  60.  * TYPEDEFS
  61.  */
  62. #define WRITE_IN_BUFFER 1
  63. /*********************************************************************
  64.  * GLOBAL VARIABLES
  65.  */
  66. /*********************************************************************
  67.  * LOCAL VARIABLES
  68.  */
  69. /*********************************************************************
  70.  * GLOBAL FUNCTIONS
  71.  */
  72.  
  73. /*********************************************************************
  74.  * LOCAL FUNCTIONS
  75.  */
  76. INT8U   lcdWriteData( INT8U page, INT8U dat);
  77. void  LCD_WriteCommand(unsigned char page,unsigned char command);
  78. void  LCD_WriteData(unsigned char mode,unsigned char page,unsigned char data_in);
  79. void  set128128Addr(unsigned char mode,unsigned char x,unsigned char y);
  80. void  writeLcd128128Data(unsigned char mode,unsigned char x,unsigned char y,unsigned char data_in);
  81. void   LCD_Init(void);
  82. /*********************************************************************
  83.  *********************************************************************/
  84. /***********************************************************************
  85.  * 名称:LCD_Init()
  86.  * 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
  87.  * 入口参数:无
  88.  * 出口参数:无
  89.  * 说明:函数会设置LCM数据总线为输出方式
  90.  ***********************************************************************/
  91. LcdDispArea_s DispArea;
  92. LcdDispCursor_s  LcdCursor;
  93. void  LCD_Init(void)
  94. {  
  95. }
  96. /***********************************************************************
  97.  * 名称:LCD_WriteData()
  98.  * 功能:写1字节数据子程序。会先判断状态字。
  99.  * 入口参数:dat   要写入LCM的数据
  100.  * 出口参数:操作出错返回0,否则返回1
  101.  ***********************************************************************/
  102. INT8U  lcdWriteData( INT8U page, INT8U dat)
  103.     return(1);
  104. }
  105. /***********************************************************************
  106.  * 原型:void wr_12864_data(unsigned char mode,unsigned char i,unsigned char data_in)
  107.  * 功能:给12864写一个数据
  108.  * 入口参数:mode:写入方式:1直接写入,0取反后写入
  109.  *           i:选择:1左半屏,2右半屏
  110.  *          data_in:要写入的数据
  111.  * 出口参数:无
  112.  ***********************************************************************/
  113. void LCD_WriteData(unsigned char mode,unsigned char page,unsigned char data_in)
  114. {
  115. if(mode)
  116. lcdWriteData( page, data_in );
  117. else
  118. lcdWriteData( page, ~data_in);
  119. }
  120. /***********************************************************************
  121.  * 原型:void wr_12864_order(unsigned char i,unsigned char order)
  122.  * 功能:给12864写一个指令
  123.  * 入口参数:i:选择 1左半屏,2右半屏,3同时左右屏
  124.  *           order:指令
  125.  * 出口参数:无
  126.  ***********************************************************************/
  127. void LCD_WriteCommand(unsigned char page,unsigned char command)
  128. {
  129. }
  130. /***********************************************************************
  131.  * 原型:void set_12864_addr(unsigned char mode,unsigned char x,unsigned char y)
  132.  * 功能:设置lcd12864显示座标
  133.  * 入口参数:mode:地址写入方式:1只设置x地址,2只设置y地址,3同时设置x和y地址
  134.  *           x:液晶x轴座标(0到127)
  135.  *           y:液晶y轴座标(0到15)
  136.  * 出口参数:无
  137.  ***********************************************************************/
  138. void set128128Addr(unsigned char addr_mode,unsigned char x,unsigned char y)
  139. {
  140. INT8U page;
  141.     switch(addr_mode)
  142. {
  143.     case SET_X: // 只写X坐标
  144. if ( x > 63 )
  145. {
  146. if( y > 7 )
  147. page = PAGE_4;
  148. else
  149. page = PAGE_2;
  150. LCD_WriteCommand( page, LCD_SET_X( x-64 ) );
  151. break;
  152. }
  153. else
  154. {
  155. if( y > 7 )
  156. page = PAGE_3;
  157. else
  158. page = PAGE_1;
  159. LCD_WriteCommand( page, LCD_SET_X( x ) );
  160. }
  161. break;
  162. case SET_Y: // 只写Y坐标
  163. if( y > 7 )
  164. {
  165. LCD_WriteCommand( PAGE_3, LCD_SET_Y( y-8 ) );
  166. LCD_WriteCommand( PAGE_4, LCD_SET_Y( y-8 ) );
  167. break;
  168. }
  169. else
  170. {
  171. LCD_WriteCommand( PAGE_1, LCD_SET_Y( y ) );
  172. LCD_WriteCommand( PAGE_2, LCD_SET_Y( y ) );
  173. }
  174. break;
  175. case SET_X_Y: // 同时写X和Y坐标
  176. if( y > 7 )
  177. {
  178. LCD_WriteCommand( PAGE_3, LCD_SET_Y( y-8 ) );
  179. LCD_WriteCommand( PAGE_4, LCD_SET_Y( y-8 ) );
  180. }
  181. else
  182. {
  183. LCD_WriteCommand( PAGE_1, LCD_SET_Y( y ) );
  184. LCD_WriteCommand( PAGE_2, LCD_SET_Y( y ) );
  185. }
  186. if ( x > 63 )
  187. {
  188. if( y > 7 )
  189. page = PAGE_4;
  190. else
  191. page = PAGE_2;
  192. LCD_WriteCommand( page, LCD_SET_X( x-64 ) );
  193. break;
  194. }
  195. else
  196. {
  197. if( y > 7 )
  198. page = PAGE_3;
  199. else
  200. page = PAGE_1;
  201. LCD_WriteCommand( page, LCD_SET_X( x ) );
  202. }
  203. break;
  204. default: break;
  205. }
  206. }
  207. /***********************************************************************
  208.  * 原型:void open_12864(unsigned char mode)
  209.  * 功能:12864开显示
  210.  * 入口参数:page:选择:1左半屏,2右半屏,3左右屏
  211.  * 出口参数:无
  212.  ***********************************************************************/
  213. void LCD_On  (void) { LCD_WriteCommand( PAGE_ALL_S,LCD_DISP_ON); }
  214. /***********************************************************************
  215.  * 原型:void shut_12864(unsigned char mode)
  216.  * 功能:12864关显示
  217.  * 入口参数:page:选择:1左半屏,2右半屏,3左右屏
  218.  * 出口参数:无
  219.  ***********************************************************************/
  220. void LCD_Off (void) { LCD_WriteCommand(PAGE_ALL_S,LCD_DISP_OFF); }
  221. /***********************************************************************
  222.  * 原型:void write_lcd12864_data( unsigned char mode,unsigned char x,
  223.  *    unsigned char y,unsigned char data_in)
  224.  * 功能:给12864指定座标写数据
  225.  * 入口参数:mode 写入方式:1直接写入,0取反后写入
  226.  *           x    屏幕x轴座标(0到127)
  227.  *           y    屏幕y轴座标(0到7)
  228.  *           data_in 要写入的数据
  229.  * 出口参数:无
  230.  ***********************************************************************/
  231. void writeLcd128128Data(unsigned char mode,unsigned char x,unsigned char y,unsigned char data_in)
  232. {
  233. INT8U page;
  234.     if( y > 7 )
  235.     {
  236.      if( x > 63 )
  237.      {
  238.      page = PAGE_4;
  239.      x -= 64;
  240.      }
  241.      else 
  242.      {
  243.      page = PAGE_3;
  244.      }
  245.      y -= 8;
  246.     }
  247. else
  248. {
  249. if( x > 63 )
  250. {
  251. page = PAGE_2;
  252. x -= 64;
  253. }
  254. else
  255. {
  256. page = PAGE_1;
  257. }
  258. }
  259. LCD_WriteCommand( page, LCD_SET_Y( y ) );
  260. LCD_WriteCommand( page, LCD_SET_X( x ) );
  261. LCD_WriteData( mode, page, data_in );
  262. }
  263. /*------------------ esay GUI ---------------------*/
  264. INT8U lcd_buffer[ 16 ][ 128 ];
  265. INT8U Xy_Map=0;
  266. /******************************************************************************************************************
  267. * 函数名称:LCM12864_ReadByte()
  268. * 功    能:从显示缓冲区读取指定点上的数据。
  269. * 入口参数:x  x坐标值(0-127)
  270. *           y       y坐标值(0-63)
  271. * 出口参数:返回该点上的字节数据。
  272. *******************************************************************************************************************/
  273. INT8U  LCM128128_ReadByte(INT32U x, INT32U y)//修改:把INT8U改成int
  274.   /* 参数过滤 */ //修改:去掉参数过滤
  275.   //x = x&0x7f;                      
  276.   //y = y&0x3f;
  277.   y = y>>3;
  278.   return (lcd_buffer[y][x]);                   // 返回显示缓冲区指定点上的数据
  279. }
  280. /***********************************************************************
  281.  * 函数名称:GUI_FillSCR()
  282.  * 功    能:全屏填充。填充显示缓冲区及LCM12864。
  283.  * 入口参数:data      填充的数据
  284.  * 出口参数:无
  285.  ***********************************************************************/
  286. void  GUI_FillSCR(INT8U data)
  287. {
  288.    INT32U x;
  289.    INT32U y;
  290.    
  291.    /* 填充显示缓冲区 */
  292.    for( y = 0; y<(GUI_LCM_YMAX>>2); y++)
  293.     {  
  294.        for(x=0; x<GUI_LCM_XMAX; x++)
  295.           gui_disp_buf[y][x] = data;
  296.     }
  297. }
  298. INT8U const DEC_HEX_TAB[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  299. /***********************************************************************
  300.  * 函数名称:GUI_Point()
  301.  * 功    能:在指定位置上画点。
  302.  * 入口参数:x        指定点所在列的位置
  303.  *           y        指定点所在行的位置 
  304.  *           color    对于黑白色或蓝白色LCM12864,为0时灭,为1时显示
  305.  * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
  306.  ***********************************************************************/
  307. INT8U  GUI_Point( INT32U x, INT32U y, INT16U color )
  308. {
  309.   INT32U   bak; 
  310.   /* 参数过滤 */
  311.   if( x >= GUI_LCM_XMAX )  return(0);
  312.   if( y >= GUI_LCM_YMAX )  return(0);
  313.   switch( Xy_Map )
  314.   {
  315.       //case 0:break;
  316.       case 1:
  317.       bak=x;
  318.       x=y;
  319.       y=GUI_LCM_XMAX-bak-1;      
  320.       break;
  321.       case 2:
  322.       x=GUI_LCM_XMAX-x-1;
  323.       y=GUI_LCM_YMAX-y-1;
  324.       break;
  325.       case 3:break;
  326.   }
  327.   /* 设置相应的点为1或0 */
  328.    bak = LCM128128_ReadByte( x, y ); 
  329.   if( 0 == color )
  330.    {  
  331.      bak &= (~DEC_HEX_TAB[y&0x07]);
  332.    }
  333.   else
  334.    {  
  335.      bak |= DEC_HEX_TAB[y&0x07];
  336.    }
  337.   y=y>>3;   
  338.                                     
  339.   lcd_buffer[y][x] = bak;
  340.   
  341.   return (1);
  342. }
  343. /***********************************************************************
  344.  * 函数名称:GUI_ReadPoint()
  345.  * 功    能:读取指定点的颜色。
  346.  * 入口参数:x        指定点所在列的位置
  347.  *           y        指定点所在行的位置
  348.  *           ret      保存颜色值的指针
  349.  * 出口参数:返回0表示指定地址超出缓冲区范围。
  350.  * 说    明:对于单色,设置ret的d0位为1或0
  351.  ***********************************************************************/
  352. INT8U GUI_ReadPoint( int x, int y, int *ret )
  353. {
  354.   INT32U  bak;
  355.   /* 参数过滤 */
  356.   if( x >= GUI_LCM_XMAX ) return(0);
  357.   if( y >= GUI_LCM_YMAX ) return(0);
  358.   switch(Xy_Map)
  359.   {
  360.       case 0:break;
  361.       case 1:
  362.       bak=x;
  363.       x=y;
  364.       y=GUI_LCM_XMAX-bak-1;      
  365.       break;
  366.       case 2:
  367.       x=GUI_LCM_XMAX-x-1;
  368.       y=GUI_LCM_YMAX-y-1;
  369.       break;
  370.       case 3:break;
  371.   } 
  372.   bak = LCM128128_ReadByte(x,y);
  373.   if( (bak & ( DEC_HEX_TAB[ y & 0x07 ] ) ) == 0 )
  374.      *ret = 0x00;
  375.   else  
  376.      *ret = 0x01;
  377.    
  378.   return(1);
  379. }
  380. /***********************************************************************
  381.  * 函数名称:Refresh_FrameBuffer()
  382.  * 功    能:刷新屏幕。
  383.  * 入口参数:无
  384.  * 出口参数:无
  385.  ***********************************************************************/
  386. INT8U RefreshFrameBuffer(INT8U disp_mode )
  387. {
  388.     INT8U x = 0;
  389.     INT8U y = 0;
  390.     INT8U page;
  391.     for( y = 0; y <= 15; y++ )
  392. {
  393.         set128128Addr( SET_X_Y, 0, y );
  394.         for( x = 0; x <= 127; x++ )
  395. {
  396.     if( x == 0 )
  397.             set128128Addr( SET_X_Y, 0, y );
  398.     if(x<64)
  399.     {
  400.      if( y > 7 )
  401.      page = PAGE_3;
  402.      else 
  403.      page = PAGE_1;
  404. LCD_WriteData( disp_mode, page, lcd_buffer[y][x] );
  405. }
  406. if(x==64)
  407.             set128128Addr(SET_X_Y,x,y);
  408. if(x>63)
  409. {
  410. if( y > 7 )
  411.      page = PAGE_4;
  412.      else 
  413.      page = PAGE_2;
  414.      LCD_WriteData( disp_mode, page, lcd_buffer[y][x] );
  415.     } 
  416. }
  417. }      
  418. }