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

📄 lcd.c

📁 Driver for HD44780 based 8x1 , 8x2, 16x1, 16x2, 20x4, 40x2 LCD Display Modules for Keil C Environmen
💻 C
字号:
#include <lcd.h>



// 4 bit mode 16x2 LCD

/*
void lcd_send(unsigned char action ,cmd)		// Sends a command or data to LCD
void lcd_clear(unsigned char state)			// Clear LCD Contents
void lcd_cursor( unsigned char state)
void lcd_displayinit(void)
void lcd_printf(unsigned char *dstring)				// Prints a string on LCD at current cursor position
void lcd_gotoxy(unsigned char cursor_position,linenumber)		// Moves the cursor to the specified position
void lcd_backlight ( unsigned char action ) ;	// turns backlight on / off 
*/



void lcd_send(unsigned char action ,cmd)		// Sends a command or data to LCD
{

	unsigned char delay;

	//sending msb

	nibble=cmd&0x0F0;							//	Mask the lower nibble to get higher nibble of command passed

	LCD_E=HIGH;									// Enable LCD
	LCD_RS=	action;									//	Sending Command so RS=0
	LCD_D7=D7;	LCD_D6=D6;					// Setting higher Nibble Data Bits
	LCD_D5=D5;	LCD_D4=D4;

	for(delay=0;delay<=50;delay++);		// Delay for LCD to accept data
											// Delay for LCD to accept data
	LCD_E=LOW;									//	Disable LCD
	LCD_D7=0;LCD_D6=0;LCD_D5=0;LCD_D4=0;// Reset Ouput Port Buffer


	nibble=cmd<<4;								//	Extract the lower nibble of command passed

	LCD_E=HIGH;									// Enable LCD
	LCD_D7=D7;	LCD_D6=D6;					// Setting higher Nibble Data Bits
	LCD_D5=D5;	LCD_D4=D4;

	for(delay=0;delay<=50;delay++);		// Delay for LCD to accept data
	LCD_E=LOW;									//	Disable LCD
	LCD_D7=0;LCD_D6=0;LCD_D5=0;LCD_D4=0;

}

void lcd_clear(unsigned char state)			// Clear LCD Contents
{

	unsigned int delay;			  				// start up delay

	switch(state){
				case ALL 	:	lcd_send(COMMAND ,0x01);				// FULL DISPLAY CLEAR
								break;										// Delay for LCD to accept data


				case LINE1	: 	lcd_gotoxy(1,LINE1);
								lcd_printf("                " );		// LINE 1 CLEAR
								break;

        		case LINE2	:	lcd_gotoxy(1,LINE2);
        						lcd_printf("                " );		// LINE 2 CLEAR
				}

	for(delay=0;delay<=1300;delay++);

}


//----------------TO MAKE CURSOR ON AND OFF on LCD SCREEN---------------
// ARGUMENTS  ARE 		ON 		= 	FOR CURSOR ON
//                		OFF	 	= 	FOR CURSOR OFF
//
//--------------------------------------------------------------------

void lcd_cursor( unsigned char state)
{

	switch(state){
					case OFF :	lcd_send(COMMAND ,0x0C); 	//  CURSOR OFF
									break;
					case ON	 :	lcd_send(COMMAND ,0x0E); 	//  CURSOR ON
				}
}

//----------------LCD DISPLAY INITLIZATION -----------------------------

void lcd_displayinit(void)
{
	unsigned char i,j;
	unsigned int delay;

	for(delay=0;delay<=3000;delay++);			  				// start up delay

	for(j=0;j<=3;j++){
		lcd_send(COMMAND ,0x03);
		for(delay=0;delay<=1500;delay++);
    }

	lcd_send(COMMAND ,0x02); 		     						//;return to Home pos.
    for(delay=0;delay<=1500;delay++);

	for(j=0;j<=3;j++){ 											// 4 bit mode 5x7 char 16 X 2  line
		lcd_send(COMMAND ,0x28);
		for(delay=0;delay<=1500;delay++);
    }
	lcd_send(COMMAND ,0x0c);									//  display on ,cursor off
	for(delay=0;delay<=1500;delay++);

    lcd_send(COMMAND ,0x06);   									// entry mode set
    for(delay=0;delay<=1500;delay++);

    lcd_send(COMMAND ,0x80);   									// set ddram adress
	for(delay=0;delay<=1500;delay++);

	lcd_send(COMMAND ,0x01);   									// clear display
    for(delay=0;delay<=1500;delay++);

	lcd_send(COMMAND ,0x40);				// store custom charecter

	for(i=0;i<8;i++) lcd_send(DATA,custom_char_map_1[i]);       // Send 1st Custom Charecter
	for(i=0;i<8;i++) lcd_send(DATA,custom_char_map_2[i]); // Send 2nd Custom Charecter
	for(i=0;i<8;i++) lcd_send(DATA,custom_char_map_3[i]); // Send 3rd Custom Charecter
	for(i=0;i<8;i++) lcd_send(DATA,custom_char_map_4[i]); // Send 4th Custom Charecter
	for(i=0;i<8;i++) lcd_send(DATA,custom_char_map_5[i]); // Send 5th Custom Charecter
	for(i=0;i<8;i++) lcd_send(DATA,custom_char_map_6[i]); // Send 6th Custom Charecter
	for(i=0;i<8;i++) lcd_send(DATA,custom_char_map_7[i]); // Send 7th Custom Charecter
}

void lcd_printf(unsigned char *dstring)				// Prints a string on LCD at current cursor position
{
	unsigned char	digit_cnt=0;

	while(dstring[digit_cnt]!='\0')
		lcd_send( DATA ,dstring[digit_cnt++]);
}

void lcd_gotoxy(unsigned char cursor_position,linenumber)		// Moves the cursor to the specified position
{
	if (LCDTYPE==16*2) {
		cursor_position=cursor_position+127+(64 * (linenumber-1));	// Calculate the value to be passed to LCD unit
	}
	if (LCDTYPE==20*4) {
		cursor_position=display_address[linenumber-1];	// Calculate the value to be passed to LCD unit
	}
	lcd_send(COMMAND ,cursor_position);											// Send the value to LCD
}

void lcd_print_num(unsigned long number)				// Prints a string on LCD at current cursor position
{
	unsigned char joker;
	bit zerovalid=0;

	if (number > 99999) {
		joker=number/100000;					//Extracting 100000th Decimal
		lcd_send( DATA ,joker+48);		
		number = number - ( joker * 100000) ;
		zerovalid=1;
	} 
	if (number > 9999) {
		joker=number/10000;					//Extracting 10000th Decimal
		lcd_send( DATA ,joker+48);		
		number = number - ( joker * 10000) ;
		zerovalid=1;
	} 
	if (number > 999) {
		joker=number/1000;					//Extracting 1000th Decimal
		lcd_send( DATA ,joker+48);		
		number = number - ( joker * 1000) ;
		zerovalid=1;
	} else { if (zerovalid==1) lcd_send(DATA,48); else lcd_send( DATA ,32); }
	if (number > 99) {
		joker=number/100;					//Extracting 100th Decimal
		lcd_send( DATA ,joker+48);		
		number = number - ( joker * 100) ;
		zerovalid=1;
	} else { if (zerovalid==1) lcd_send(DATA,48); else lcd_send( DATA ,32); }

	if (number >9 ) {
		joker=(number%100)/10;
		lcd_send( DATA ,joker+48);		//Extracting 10th Decimal
		zerovalid=1;
	} else { if (zerovalid==1) lcd_send(DATA,48); else lcd_send( DATA ,32); }

	joker=(number%10);
	lcd_send( DATA ,joker+48);		//Extracting Units Decimal
}


	void lcd_backlight ( unsigned char action ) 
		{
			switch(action) {
				case ON	:	// Back Light to be turned ON
								lcd_backlight_count=0xFFFF;	// Reset backlight turn off timer
								BACKLIGHT=ON;		// Back light ON
								break;	
				case OFF	:	// Back Light to be turned ON
								BACKLIGHT=OFF;		// Back light OFF
								break;	
			}
		}

⌨️ 快捷键说明

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