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

串口编程

开发平台:

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 "lcd2.h"
  16. /* Definitions for the LCD interface */
  17. #define PORT_D_CONFIG 0x00
  18. #define LCD_SEL 3 /* Port A bit 3 ( Enables LCD ) */
  19. #define LCD_WR  2 /* Port A bit 2 ( Logic 0 = Write ) */
  20. #define LCD_RS  1 /* Port A bit 1 ( Register select ) */
  21. #define LCD_DATA PORTD     /* The port the lcd data bus is connected to */
  22. #define LCD_CONTROL PORTD  /* The port the lcd control bus is connected to */
  23. #define BUSY_BIT 7
  24. #define BUSY_MASK 0x80
  25. #define LCD_DATA_4 4   /* LCD BIT 0 */
  26. #define LCD_DATA_5 5   /* LCD BIT 1 */
  27. #define LCD_DATA_6 6   /* LCD BIT 2 */
  28. #define LCD_DATA_7 7   /* LCD BIT 3 */
  29. #define LCD_LINE_LEN 16
  30. /************************************************************/
  31. /* LCD Commands ( Refer to LCD Data Sheet )                 */
  32. /* Standard command should work with most common devices    */
  33. /************************************************************/
  34. #define clear_lcd         0x01 /* Clear Display                       */
  35. #define return_home       0x02 /* Cursor to Home position             */
  36. #define entry_mode        0x06 /* Normal entry mode                   */
  37. #define entry_mode_shift  0x07 /* - with shift                        */
  38. #define system_set_8_bit  0x38
  39. /* 8 bit data mode 2 line ( 5x7 font ) */
  40. #define system_set_4_bit  0x28
  41. /* 4 bit data mode 2 line ( 5x7 font ) */
  42. #define display_on        0x0c /* Switch ON Display                   */
  43. #define display_off       0x08 /* Cursor plus blink                   */
  44. #define set_dd_line1      0x80 /* Line 1 position 1                   */
  45. #define set_dd_line2      0xC0 /* Line 2 position 1                   */
  46. #define set_dd_ram        0x80 /* Line 1 position 1                   */
  47. #define write_data        0x00 /* With rs = 1                         */
  48. #define cursor_on         0x0E /* Switch Cursor ON                    */
  49. #define cursor_off        0x0C /* Switch Cursor OFF                   */
  50. char Modeflags, line;
  51. /***********************************/
  52. /* Setup the lcd device            */
  53. /***********************************/
  54. void LCDSetup(void)
  55. {
  56.  /* Reset the LCD */
  57.    ModeFlags = 0;           /* Default to Function Mode */
  58.    Write_8_Bit( system_set_4_bit ); /* This sequence resets the LCD */
  59.    delay_ms(5);
  60.    Write_8_Bit( system_set_4_bit );
  61.    Delay();
  62.    Write_8_Bit( system_set_4_bit );
  63.    Delay();
  64.    LcdWrite( system_set_4_bit );
  65.    LcdWrite( display_on );
  66.    LcdWrite( clear_lcd );
  67.    LcdWrite( entry_mode );
  68.    LcdWrite( set_dd_ram );
  69.    ModeFlags = 1; /* Data Mode */
  70. }
  71. /***********************************/
  72. /* Put LCD in Function Mode        */
  73. /***********************************/
  74. void FunctionMode(void)
  75. {
  76.    BIT_CLEAR( ModeFlags, 0 ); /* Save Mode */
  77.    BIT_CLEAR( LCD_CONTROL, LCD_RS );
  78. }
  79. /***********************************/
  80. /* Put LCD in Data Mode            */
  81. /***********************************/
  82. void DataMode(void)
  83. {
  84.    BIT_SET( ModeFlags, 0 ); /* Save Mode */
  85.    BIT_SET( LCD_CONTROL, LCD_RS );
  86. }
  87. /***********************************/
  88. /* Write a single byte to the LCD  */
  89. /* 8 Bit Mode                      */
  90. /***********************************/
  91. void Write_8_Bit( char dh )
  92. {
  93.    BIT_CLEAR( dh, LCD_WR );      /* Write mode    */
  94.    BIT_CLEAR( dh, LCD_RS );      /* Function mode */
  95.    BIT_CLEAR( dh, LCD_SEL);
  96.    //LCD_CONTROL = 0;
  97.    BIT_CLEAR( dh, LCD_SEL );     /* de-select LCD */
  98.    delay_ms(1);
  99.    LCD_DATA = dh;                          /* Setup data    */
  100.    #asm
  101.    nop
  102.    nop
  103.    nop
  104.    nop
  105.    nop
  106.    nop
  107.    nop
  108.    nop
  109.    nop
  110.    nop
  111.    nop
  112.    nop
  113.    #endasm
  114.    BIT_SET( LCD_CONTROL, LCD_SEL );        /* Select LCD    */
  115.    Delay();
  116.    BIT_CLEAR( LCD_CONTROL, LCD_SEL );     /* de-select LCD */
  117.    Delay();
  118. }
  119. /***********************************/
  120. /* Write a single byte to the LCD  */
  121. /* 4 Bit Mode                      */
  122. /***********************************/
  123. void LcdWrite(char dl )
  124. {
  125. char e;
  126.    e = dl;                           /* Save lower 4 bits */
  127. /*********************************** Output Upper 8 bits ******************************/
  128.    BIT_CLEAR( dl, LCD_WR );            /* Write mode */
  129.    if ( ( ModeFlags & 0x01 ) == 0 )
  130.       BIT_CLEAR( dl, LCD_RS );         /* Function mode */
  131.    else
  132.       BIT_SET( dl, LCD_RS );           /* Data mode */
  133.    BIT_CLEAR( dl, LCD_SEL);
  134.    LCD_DATA = dl;                           /* Setup data    */
  135.    Delay();
  136.    BIT_SET( LCD_CONTROL, LCD_SEL);         /* Select LCD    */
  137.    Delay();
  138.    BIT_CLEAR( LCD_CONTROL, LCD_SEL );      /* de-select LCD */
  139.    dl = e;                                  /* Restore lower 4 bits */
  140.    dl <<= 4;
  141. /*********************************** Output Lower 8 bits ******************************/
  142.    BIT_CLEAR( dl, LCD_WR );       /* Write mode    */
  143.    if ( ( ModeFlags & 0x01 ) == 0 )
  144.       BIT_CLEAR( dl, LCD_RS );    /* Function mode */
  145.    else
  146.       BIT_SET( dl, LCD_RS );      /* Data mode */
  147.    BIT_CLEAR( dl, LCD_SEL);
  148.    LCD_DATA = dl;                           /* Setup data    */
  149.    #asm
  150.       nop
  151.       nop
  152.       nop
  153.       nop
  154.       nop
  155.       nop
  156.       nop
  157.       nop
  158.       nop
  159.       nop
  160.       nop
  161.       nop
  162.       nop
  163.       nop
  164.       nop
  165.    #endasm
  166.    BIT_SET( LCD_CONTROL, LCD_SEL);         /* Select LCD    */
  167.    Delay();
  168.    BIT_CLEAR( LCD_CONTROL, LCD_SEL );      /* de-select LCD */
  169.    Delay();
  170. }
  171. /***********************************/
  172. /* LCD timing delay                */
  173. /* Adjust for your LCD Display     */
  174. /***********************************/
  175. void Delay(void)
  176. {
  177.    delay_ms(2);
  178. }
  179. /***********************************/
  180. /* Clear LCD Screen                */
  181. /***********************************/
  182. void Clear(void)
  183. {
  184.    FunctionMode();
  185.    LcdWrite(clear_lcd);
  186.    DataMode();
  187. }
  188. /***********************************/
  189. /* Set the cursor position         */
  190. /***********************************/
  191. void SetPos(char Pos)
  192. {
  193.    FunctionMode();
  194.    LcdWrite( Pos );
  195.    DataMode();
  196. }
  197. /***********************************/
  198. /* Set Position to line 1          */
  199. /***********************************/
  200. void Line1(void)
  201. {
  202.    line = 1;
  203.    FunctionMode();
  204.    LcdWrite( set_dd_line1 );
  205.    DataMode();
  206. }
  207. /***********************************/
  208. /* Set Position to line 2          */
  209. /***********************************/
  210. void Line2(void)
  211. {
  212.    line = 2;
  213.    FunctionMode();
  214.    LcdWrite( set_dd_line2 );
  215.    DataMode();
  216. }
  217. /*******************************************/
  218. /* Clear Line 1                            */
  219. /*******************************************/
  220. void ClearLine1(void)
  221. {
  222. char c;
  223.    Line1();
  224.    for( c = 0; c < LCD_LINE_LEN; c++ )
  225.       {
  226.           LcdWrite(' ');
  227.       }
  228.    Line1();
  229. }
  230. /*******************************************/
  231. /* Clear Line 2                            */
  232. /*******************************************/
  233. void ClearLine2(void)
  234. {
  235. char c;
  236.   Line2();
  237.   for( c = 0; c < 16; c++ )
  238.      {
  239.          LcdWrite(' ');
  240.      }
  241.   Line2();
  242. }
  243. /*******************************************/
  244. /* Write a const string to the LCD         */
  245. /*******************************************/
  246. void WriteString( char *lcdptr )
  247. {
  248. char c;
  249.   c = 0;
  250.                 // Check for end of string
  251.     while( lcdptr[c] !=  0 )
  252.          {
  253.             // Don't display CR's
  254.             if ( lcdptr[c] == 13 )  break;
  255.             LcdWrite( lcdptr[c++] );// Display on LCD
  256.          }
  257. }