lcd873b.c
上传用户:sanfwan_06
上传日期:2007-12-18
资源大小:190k
文件大小:6k
源码类别:

串口编程

开发平台:

C/C++

  1. /***************************************************************************/
  2. /*  Lcd.c       LCD interface routines                                     */
  3. /*  Version :   2.1. for PIC16F87x                                         */
  4. /*                                                                         */
  5. /*  J. Winpenny  1/8/2000                                                  */
  6. /*                                                                         */
  7. /*                                                                         */
  8. /*  Mode : HD44780 type LCD displays                                       */
  9. /*                                                                         */
  10. /*                                                                         */
  11. /* Notes : Updated version                                                 */
  12. /*         to allow greater adaptability to different displays             */
  13. /*                                                                         */
  14. /***************************************************************************/
  15. #include "lcd873b.h"
  16. /* Definitions for the LCD interface */
  17. #define LCD_SEL 3 /* Port A bit 3 ( Enables LCD ) */
  18. #define LCD_WR  2 /* Port A bit 2 ( Logic 0 = Write ) */
  19. #define LCD_RS  0 /* Port A bit 1 ( Register select ) */
  20. #define LCD_DATA PORTB
  21. #define LCD_CONTROL PORTA
  22. #define BUSY_BIT 7
  23. #define BUSY_MASK 0x80
  24. #define LCD_DATA_4 4   /* LCD BIT 0 */
  25. #define LCD_DATA_5 5   /* LCD BIT 1 */
  26. #define LCD_DATA_6 6   /* LCD BIT 2 */
  27. #define LCD_DATA_7 7   /* LCD BIT 3 */
  28. char ModeFlags;
  29. char LCD_gp;
  30. /***********************************/
  31. /* Setup the lcd device            */
  32. /***********************************/
  33. void LCDSetup(void)
  34. {
  35.  /* Reset the LCD */
  36.    ModeFlags = 0;           /* Default to Function Mode */
  37.    Write_8_Bit( system_set_4_bit ); /* This sequence resets the LCD */
  38.    delay_ms(5);
  39.    Write_8_Bit( system_set_4_bit );
  40.    delay_ms(1);
  41.    Write_8_Bit( system_set_4_bit );
  42.    delay_ms(1);
  43.    LcdWrite( system_set_4_bit );
  44.    LcdWrite( display_on );
  45.    LcdWrite( clear_lcd );
  46.    LcdWrite( entry_mode );
  47.    LcdWrite( set_dd_ram );
  48.    ModeFlags = 1; /* Data Mode */
  49. }
  50. /***********************************/
  51. /* Put LCD in Function Mode        */
  52. /***********************************/
  53. void FunctionMode(void)
  54. {
  55.    BIT_CLEAR( ModeFlags, 0 ); /* Save Mode */
  56.    #asm BCF LCD_CONTROL, LCD_RS #endasm
  57.    Delaylcd();
  58. }
  59. /***********************************/
  60. /* Put LCD in Data Mode            */
  61. /***********************************/
  62. void DataMode(void)
  63. {
  64.    BIT_SET( ModeFlags, 0 ); /* Save Mode */
  65.    #asm BSF LCD_CONTROL, LCD_RS #endasm
  66.    Delaylcd();
  67. }
  68. /***********************************/
  69. /* Write a single byte to the LCD  */
  70. /* 8 Bit Mode                      */
  71. /***********************************/
  72. void Write_8_Bit( char dh )
  73. {
  74.    #asm BCF LCD_CONTROL, LCD_WR #endasm
  75.    #asm BCF LCD_CONTROL, LCD_RS #endasm
  76.    #asm BCF LCD_CONTROL, LCD_SEL #endasm
  77.    //LCD_CONTROL = 0;
  78.    delay_ms(1);
  79.    LCD_DATA = dh;                          /* Setup data    */
  80.    BIT_SET( LCD_CONTROL, LCD_SEL );        /* Select LCD    */
  81.    Delaylcd();
  82.    BIT_CLEAR( LCD_CONTROL, LCD_SEL );     /* de-select LCD */
  83.    Delaylcd();
  84.    
  85. }
  86. /***********************************/
  87. /* Write a single byte to the LCD  */
  88. /* 4 Bit Mode                      */
  89. /***********************************/
  90. void LcdWrite(char dl )
  91. {
  92. char e;
  93.    e = dl;                           /* Save lower 4 bits */
  94. /*********************************** Output Upper 8 bits ******************************/
  95.    BIT_CLEAR( LCD_CONTROL, LCD_WR );       /* Write mode */
  96.    if ( ( ModeFlags & 0x01 ) == 0 )
  97.       BIT_CLEAR( LCD_CONTROL, LCD_RS );    /* Function mode */
  98.    else
  99.       BIT_SET( LCD_CONTROL, LCD_RS );      /* Data mode */
  100.    BIT_CLEAR( LCD_CONTROL, LCD_SEL);
  101.    LCD_DATA = dl;                           /* Setup data    */
  102.    BIT_SET( LCD_CONTROL, LCD_SEL);         /* Select LCD    */
  103.    Delaylcd();
  104.    BIT_CLEAR( LCD_CONTROL, LCD_SEL );      /* de-select LCD */
  105.    dl = e;                                  /* Restore lower 4 bits */
  106.    dl <<= 4;
  107. /*********************************** Output Lower 8 bits ******************************/
  108.    BIT_CLEAR( LCD_CONTROL, LCD_WR );       /* Write mode    */
  109.    if ( ( ModeFlags & 0x01 ) == 0 )
  110.       BIT_CLEAR( LCD_CONTROL, LCD_RS );    /* Function mode */
  111.    else
  112.       BIT_SET( LCD_CONTROL, LCD_RS );      /* Data mode */
  113.    BIT_CLEAR( LCD_CONTROL, LCD_SEL);
  114.    LCD_DATA = dl;                           /* Setup data    */
  115.    BIT_SET( LCD_CONTROL, LCD_SEL);         /* Select LCD    */
  116.    Delaylcd();
  117.    BIT_CLEAR( LCD_CONTROL, LCD_SEL );      /* de-select LCD */
  118.    Delaylcd();
  119. }
  120. /***********************************/
  121. /* LCD timing delay                */
  122. /* Adjust for your LCD Display     */
  123. /***********************************/
  124. void Delaylcd(void)
  125. {
  126.    delay_ms(2);
  127. }
  128. /***********************************/
  129. /* Clear LCD Screen                */
  130. /***********************************/
  131. void Clear(void)
  132. {
  133.    FunctionMode();
  134.    LcdWrite(clear_lcd);
  135.    DataMode();
  136. }
  137. /***********************************/
  138. /* Set the cursor position         */
  139. /***********************************/
  140. void SetPos(char Pos)
  141. {
  142.    FunctionMode();
  143.    LcdWrite( Pos );
  144.    DataMode();
  145. }
  146. /***********************************/
  147. /* Set Position to line 1          */
  148. /***********************************/
  149. void Line1(void)
  150. {
  151.    FunctionMode();
  152.    LcdWrite( set_dd_line1 );
  153.    DataMode();
  154. }
  155. /***********************************/
  156. /* Set Position to line 2          */
  157. /***********************************/
  158. void Line2(void)
  159. {
  160.    FunctionMode();
  161.    LcdWrite( set_dd_line2 );
  162.    DataMode();
  163. }
  164. /*******************************************/
  165. /* Clear Line 1                            */
  166. /*******************************************/
  167. void ClearLine1(void)
  168. {
  169.    Line1();
  170.    for( LCD_gp = 0; LCD_gp < 16; LCD_gp++ )
  171.       {
  172.           LcdWrite(' ');
  173.       }
  174.    Line1();
  175. }
  176. /*******************************************/
  177. /* Clear Line 2                            */
  178. /*******************************************/
  179. void ClearLine2(void)
  180. {
  181.   Line2();
  182.   for( LCD_gp = 0; LCD_gp < 16; LCD_gp++ )
  183.      {
  184.          LcdWrite(' ');
  185.      }
  186.   Line2();
  187. }