⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_drvrs.c

📁 Realtime clock DS12c887
💻 C
字号:
/* ================== LCD Drivers =============*/

// AUTHOR : R Raghunathan

/*======== Brief Description of program =======*/

/* Software drivers for 2L x 16C LCD module 
   with HD44780.

   Processor used is Silabs C8051F020 with a 2.0 MHz 
   crystal.  Each M/C cycle 0.5us 
      
   The LCD time delays are interrupt based from MAIN
   and after intialization, the Busy Bit is checked 
   before writing  */

/*==============Include Files =================*/

#include <reg52.h>
#include <stdio.h>
#include <string.h>


/*============== Bit Defines ==================*/

sbit LCD_RS   = P2^1;                            // Register Select
sbit LCD_RW   = P2^2;                            // Read write
sbit LCD_ENB  = P2^3;
sbit LCD_BUSY = P0^7;                            // LCD Data Port is P0;


/*=============================================*/

#define     LCD_PORT    P0                       // PO connected to LCD ( 8 bit mode )
sfr         P0MDOUT =   0xA4 ;

/*===============  Globals  ===================*/

unsigned char  string[32];

/*==========Function Prototypes ===============*/

extern void msDelay (int);
void chkBusy (void);
void wr_lcdReg (char);
void wr_lcdDat (char);
void init_lcd (void);
void display (char *);	

 /*============================================*/

 /*============================================*/

void init_lcd(void)								 // Init routine as per HD44780 data sheet
{
    msDelay(16);                                 // Wait more than 15ms
    wr_lcdReg(0x38);                             // Initialize for 8 bit , 2 line
    msDelay(5);                                  // Wait more than 4.1ms
    wr_lcdReg(0x38); 
    msDelay(1);                                  // Wait more than 0.1ms
    wr_lcdReg(0x38);    
    msDelay(1);                                  // Wait more than 0.1ms
    wr_lcdReg(0x0C);                             // Display On; Cursor Off; Blink off
    wr_lcdReg(0x01);                             // Clear the display
    msDelay(5);                                  // Wait more than 1.64ms
}

/*================================================*/

void wr_lcdReg(char command)					 // Write a command to the LCD.
{
    chkBusy();                                   // Is the LCD ready to take the command?
    LCD_RS = 0;                                  // Register Select Low for writing command
    LCD_RW = 0;                                  // R!W low for write
    LCD_PORT = command;                          // Command byte to register
    LCD_ENB = 1;
    LCD_ENB = 0;                                 // Pulse the enable bit high to write
}

/*=============================================*/

void wr_lcdDat(char ascii)						 // Write a character to the LCD.
{
    chkBusy();                                   // Is the LCD ready to take the word?
    LCD_RS = 1;                                  // Register Select High for writing data
    LCD_RW = 0;                                  // R!W low for write
    LCD_PORT = ascii;                            // Data byte to data port
    LCD_ENB = 1;
    LCD_ENB = 0;                                 // Pulse the enable bit high to write
}

/*==============================================*/

void chkBusy(void)
{
    P0 = 0xff ;                                  // Set port as input
	P0MDOUT  = 0x7F;                             // Switch P0.7 alone to Open Drain
	LCD_RS   = 0;
	LCD_RW   = 1;

	while (LCD_BUSY)
 	{
  	  LCD_ENB = 0;
	  LCD_ENB = 1;
    }
    P0MDOUT   = 0xFF;                            // Back to P0 as Push Pull
}


/*==============================================*/

void display (char *string)						 // Write the 2 line message to LCD
{
  int i;

  wr_lcdReg(0x01);                               // Clear the display
  msDelay(5);

  for (i=0; i<=strlen(string)-1; ++i)
   {
    if (i==16)
       wr_lcdReg(0xc0);
    if (i==32)
       wr_lcdReg(0x80);
    wr_lcdDat(string[i]);
   }
}

/*=============================================*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -