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

📄 lcd.c

📁 基于三星S6B0741芯片的LCD
💻 C
字号:

#include <util/delay.h>
#include <avr/pgmspace.h>
#include "lcd.h"

#include "font6x8.h"
#include "font8x16.h"
#include "my_type.h"





/****************************************
 * output a byte to lcd
 ***************************************/ 
void send_byte (u8 temp)
{
	u8 i;
	
	for (i=0;i<8;i++)
	{
		CLR_CLK();
		
		if (temp & 0x80) SET_DATA();
		else 			  CLR_DATA();									
		temp <<= 1;
		
		SET_CLK();
	}
}
/****************************************
	send one command to lcd
*****************************************/
void lcd_send_command (u8 command)
{
	CLR_CS();
	CLR_RS();
	send_byte (command);
	SET_CS();
}

/****************************************
	send one data to lcd
*****************************************/
void lcd_send_data (u8 data)
{
	CLR_CS();
	SET_RS();
	send_byte (data);
	SET_CS();
}
/****************************************
 *  set page value
 *
 *
 *
 *	page : 0 ~ 16 ( now this lcd only have 12 page)
 **************************************/
void lcd_set_page (u8 page)
{
	lcd_send_command (0xb0 | page);

}

/****************************************
 *	set column value
 *
 *
 *
 *   column : 0 ~ 0x7f( total 128  column)
 **************************************/
void lcd_set_column (u8 column)
{
	lcd_send_command (0x10 | (column>>4));
	lcd_send_command (0x0f & column);
}

void lcd_init (void)
{
    LCD_IO_INIT();
	CLR_RST();
	_delay_ms (5);
	SET_RST();

	lcd_send_command (0x48);		//set display duty
	lcd_send_command (0x60);
	
	lcd_send_command (0xa1);		//set ADC
	
	lcd_send_command (0xc8);		//set SHL
	
	lcd_send_command (0x44);		//set COM0
	lcd_send_command (0x10);
	
	lcd_send_command (0x40);		//set start line 
	lcd_send_command (0x00);
	
	lcd_send_command (0xab);		//start oscillator
	
	lcd_send_command (0x66);		//DC-DC boost 5 times
	
	lcd_send_command (0x27);		//set regulator resistor
	
	lcd_send_command (0x81);		//set EV
	lcd_send_command (0x20);	
	lcd_send_command (0x54);		//set LCD bias resistor
	
	lcd_send_command (0x94);		//set  FRC PWM
	/**********************************************/
	lcd_send_command (0x88);		//set white gray
	lcd_send_command (0x00);
	
	lcd_send_command (0x89);	lcd_send_command (0x00);
	
	lcd_send_command (0x8a);		//set light gray
	lcd_send_command (0x09);
	
	lcd_send_command (0x8b);
	lcd_send_command (0x00);
	
	lcd_send_command (0x8C);		//set dark gray
	lcd_send_command (0x99);
	
	lcd_send_command (0x8d);
	lcd_send_command (0x00);
	
	lcd_send_command (0x8e);   		//set black gray
	lcd_send_command (0x99);
	
	lcd_send_command (0x8f);
	lcd_send_command (0x09);
	/**********************************************/
	lcd_send_command (0x2c);		//power control, open VC
	_delay_ms (2);
	lcd_send_command (0x2e);		//open VR
	_delay_ms (2);
	lcd_send_command (0x2f);		//open VF
	_delay_ms (2);
	lcd_send_command (0xaf);		//display ON
	_delay_ms (2);
	
	lcd_clr_all();
}




void lcd_set_xy (u8 page,u8 column)
{

	lcd_set_page(page);
	lcd_set_column(column);
}


void lcd_put_char (u8 asc)
{
	u8 i;
    u8 buf[6];
	asc -= 0x20;
	
	memcpy_P (buf,font6x8[asc],6);
	
	for (i=0;i<6;i++)
	{
		lcd_send_data (buf[i]);
		lcd_send_data (buf[i]);
	}
}

/******************************************************************************
 * Function:        void lcd_put_str (u8 page,u8 column,u8 *str)
 *
 * PreCondition:    None
 *
 * Input:           u8 page: page number
 *					u8 column: column number
 *					u8 *str: string point
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        This routine put 6*8 dot character on lcd.
 *
 * Note:            None.
 *****************************************************************************/
void lcd_put_str (u8 page,u8 column,u8 *str)
{
	lcd_set_xy(page,column);
	while ( * str )
	{	
		lcd_put_char (* str++);
	}
}

/***************************************************

****************************************************/
u8 page_temp;
u8 column_temp;
void lcd_put_big_char (u8 asc)
{
	u8 i;
    u8 buf[16];
	asc -= 0x20;
	
	memcpy_P (buf,font8x16[asc],16);
	
	for (i=0;i<8;i++)
	{
		lcd_send_data (buf[i]);
		lcd_send_data (buf[i]);
	}
	lcd_set_page (page_temp + 1);
	lcd_set_column (column_temp);
	for (i=8;i<16;i++)
	{
		lcd_send_data (buf[i]);
		lcd_send_data (buf[i]);
	}	
	lcd_set_page (page_temp);
	column_temp += 8;
}
/******************************************************************************
 * Function:        void lcd_put_big_str (u8 page,u8 column,u8 *str)
 *
 * PreCondition:    None
 *
 * Input:           u8 page: page number
 *					u8 column: column number
 *					u8 *str: string point
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        This routine put 16*8 dot character on lcd.
 *
 * Note:            It use the follow page.
 *****************************************************************************/
void lcd_put_big_str (u8 page,u8 column,u8 *str)
{
	lcd_set_xy(page,column);
	page_temp = page;
	column_temp = column;
	while ( * str )
	{	
		lcd_put_big_char (* str++);
	}
}


/*************************************
 * clear one page( 8 row).
 ************************************/

void lcd_clr_page(u8 page)
{
	u8 i = 0;
	lcd_set_page(page);
	
	/* 
	 * write 0 to this page
	 * write 256 times.( 128 dot/row, two data/dot)
	 *
	 */
	while (-- i)
		lcd_send_data(0);
	lcd_send_data(0);
}
/************************************
 * clear all screen.
 ***********************************/
void lcd_clr_all(void)
{
	u8 i;
	for (i=0;i<12;i++)
		lcd_clr_page(i);

}

/********************************************************************
	below's fuction is for test.
********************************************************************/

void font_test (void)
{

	lcd_put_str (0,0,"how are you ?");

	lcd_put_str (3,0,"how are you ?");
	
	lcd_put_big_str (7,0,"how are you ?");

	lcd_put_big_str (10,0,"how are you ?");
}




void gray_test (void)
{
	u8 i,j,k,l,m = 0xff,n = 0xff;
/*	
	lcd_send_command (0x10);
	lcd_send_command (0x00);

	lcd_set_column (0);
	for (k=0;k<6;k++)
	{
		
		//lcd_send_command (0xb6 + k);
		lcd_set_page (k);
		for (j=0;j<2;j++)
		{
			m = ~m;
			for (i=0;i<2;i++)
			{
				n = ~n;
				for (l=0;l<32;l++)
				{
					lcd_send_data (m);
					lcd_send_data (n);
				}
			
			}
		}
	}

*/
	for ( j=0;j<3;j++)
	{
		lcd_set_page(4*j);
		lcd_set_column(0);
		for (i= 0;i<=128;i++)
		{
			lcd_send_data (0xff);
			lcd_send_data (0xff);
		}
		
		lcd_set_page(4*j + 1);
		lcd_set_column(0);
		for (i= 0;i<=128;i++)
		{
			lcd_send_data (0xff);
			lcd_send_data (0);
		}
		
		lcd_set_page(4*j + 2);
		lcd_set_column(0);
		for (i= 0;i<=128;i++)
		{
			lcd_send_data (0);
			lcd_send_data (0xff);
		}
		
		lcd_set_page(4*j + 3);
		lcd_set_column(0);
		for (i= 0;i<=128;i++)
		{
			lcd_send_data (0);
			lcd_send_data (0);
		}
	}
/*		

	lcd_set_page(2);
	lcd_set_column(0);
	for (i= 0;i<255;i++)
		lcd_send_data (0xff);
lcd_send_data (0);	
	lcd_set_page(3);
	lcd_set_column(0);
	for (i= 0;i<255;i++)
		lcd_send_data (0);
lcd_send_data (0);
	lcd_set_page(4);
	lcd_set_column(0);
	for (i= 0;i<255;i++)
		lcd_send_data (0xff);		
lcd_send_data (0);		
	lcd_set_page(5 );
	lcd_set_column(0);
	for (i= 0;i<255;i++)
lcd_send_data (0);		lcd_send_data (0);		

*/


}

 

⌨️ 快捷键说明

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