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

📄 lcd1621.c

📁 这个是一款LCD驱动芯片的源程序
💻 C
字号:
//----------------LCD_HT1621------------------//
//-----------------no RD pin------------------//
#include	"lcd1621.h"
#include	"tda7313.h"
#include	"si4700.h"
#include	"sys_timer.h"

//--------------------------------------------//
uchar	lcd1621Ram[9];
uchar	lcd1621_redraw_count;

void	lcd1621_ini(void);
void	lcd1621_cfg(void);
void	lcd1621_sleep(void);
void	lcd1621_tx_cmd(uchar command);
void	lcd1621_tx_ram(uchar ramadd, uchar length);
void 	lcd1621_redraw(void);
void 	lcd1621_freq2bcd(void);
void	lcd1621_tx_bit(uchar bit);

//--------------------------------------------//
const	uchar	BCDS_TAB[] PROGMEM =
{
0xBE,//0
0x06,//1
0xDA,//2
0x5E,//3
0x66,//4
0x7C,//5
0xFC,//6
0x16,//7
0xFE,//8
0x7E,//9
0xF6,//A
0xEC,//B
0xB8,//C
0xCE,//D
0xF8,//E
0xF0,//F
0x40 //-
};

const	uchar	BCD_TAB[] PROGMEM =
{
 0xD7,//0
 0x06,//1
 0xE3,//2
 0xA7,//3
 0x36,//4
 0xB5,//5
 0xF5,//6
 0x07,//7
 0xF7,//8
 0xB7,//9
 0x77,//A
 0xF4,//B
 0xD1,//C
 0xE6,//D
 0xF1,//E
 0x71,//F
 0x20 //-
};

//--------------------------------------------//
void lcd1621_ini(void)
{
	ddrCS	|= (1<<bitCS);
	ddrWR	|= (1<<bitWR);
	ddrDATA	|= (1<<bitDATA);
	ddrBL	|= (1<<bitBL);

	portCS	|= (1<<bitCS);			//CS=1 ; WR=x ; DATA=x
	portBL	|= (1<<bitBL);			//for sch v7.2
//	portBL	&=~(1<<bitBL);

}

//--------------------------------------------//
void lcd1621_cfg(void)
{
	//sys_en
	lcd1621_tx_cmd(0x01);//0b00000001
	//lcd_on
	lcd1621_tx_cmd(0x03);//0b00000011
	//rc256
	lcd1621_tx_cmd(0x18);//0b00011000
	//bias1/3;com4
	lcd1621_tx_cmd(0x29);//0b00101001

	portBL &=~(1<<bitBL);	//for sch v7.2
//	portBL |= (1<<bitBL);
}

//--------------------------------------------//
void lcd1621_sleep(void)
{
	uchar	i;						//清ram,避免开机先显示off
	for(i=0; i<9; i++)
	{
		lcd1621Ram[i]=0;
	}
	lcd1621_tx_ram(0,9);

	//lcd off
	lcd1621_tx_cmd(0b00000010);
	//sys_dis
	lcd1621_tx_cmd(0b00000000);
	portBL |= (1<<bitBL);		//for sch v7.2
//	portBL &=~(1<<bitBL);
}

//--------------------------------------------//
void lcd1621_tx_cmd(uchar command)
{
	clrCS;

		lcd1621_tx_bit(1);
		lcd1621_tx_bit(0);
		lcd1621_tx_bit(0);

		uchar	i;	
		for(i=0; i<8; i++)
		{
			lcd1621_tx_bit(command & (0x80>> i) );
		}

		lcd1621_tx_bit(0);

	setCS;
}

//--------------------------------------------//
void lcd1621_tx_ram(uchar ramadd, uchar length)
{
	clrCS;
//ID 101
		lcd1621_tx_bit(1);
		lcd1621_tx_bit(0);
		lcd1621_tx_bit(1);
	
//ram address
		uchar	i,j,k;
		for(i=0; i<6; i++)
		{
			lcd1621_tx_bit(ramadd & (0x20>> i) );
		}

//ram data
		for(j=ramadd; j<(ramadd+length); j++)
		{
			for(k=0; k<8; k++)
			{
				lcd1621_tx_bit(lcd1621Ram[j] & (0x80>> k) );
			}
		}
	setCS;
}

//--------------------------------------------//
void lcd1621_tx_bit(uchar bit)
{
	clrWR;
	if(bit== 0)	clrDATA;
	else		setDATA;
	_delay_us(7);

	setWR;
	_delay_us(8);
}

//--------------------------------------------//
void	lcd1621_logoset(uchar logo)
{
lcd1621Ram[logo >> 4] |= 1<<(logo & 0b00001111);
}

//--------------------------------------------//
void lcd1621Ram34Swap(uchar bcd)
{
lcd1621Ram[3] = bcd>>4;
lcd1621Ram[4] = bcd<<4;
}

//--------------------------------------------//
//根据function, 设定显示内容
void lcd1621_redraw(void)
{
	lcd1621_redraw_count++;
//清ram
	uchar	i;
	for(i=0; i<9; i++)
	{
		lcd1621Ram[i]=0;
	}
	
//------------------
	switch(function)
	{
		case 0:
			if(vol/10 !=0)		lcd1621Ram34Swap(pgm_read_byte(BCD_TAB+(vol/10)));
			lcd1621Ram[5] = pgm_read_byte(BCD_TAB+(vol%10));			
			lcd1621_logoset(LCD_VOL);
			break;

		case 1:
			if(bass> 7)
			{
				lcd1621Ram[5]= pgm_read_byte(BCD_TAB+(bass-7));
				lcd1621_logoset(LCD_POS1);
				lcd1621_logoset(LCD_POS2);
				lcd1621_logoset(LCD_NEG);
			}
				else if(bass< 7)
				{
					lcd1621Ram[5]= pgm_read_byte(BCD_TAB+(7-bass));
					lcd1621_logoset(LCD_NEG);
				}
					else
					{
						lcd1621Ram[5]=  pgm_read_byte(BCD_TAB);
					}

			lcd1621_logoset(LCD_BASS);
			break;

		case 2:
			if(treble> 7)
			{
				lcd1621Ram[5]= pgm_read_byte(BCD_TAB+(treble-7));
				lcd1621_logoset(LCD_POS1);
				lcd1621_logoset(LCD_POS2);
				lcd1621_logoset(LCD_NEG);
			}
				else if(treble< 7)
				{
					lcd1621Ram[5]= pgm_read_byte(BCD_TAB+(7-treble));
					lcd1621_logoset(LCD_NEG);
				}
					else
					{
						lcd1621Ram[5]=  pgm_read_byte(BCD_TAB);
					}

			lcd1621_logoset(LCD_TREB);
			break;
	}

//---------------
	switch(input)
	{
		case	FMIN:
			lcd1621Ram[0] = pgm_read_byte(BCDS_TAB+(1 + channel/6));
			if(seekState== 0)
			{
				lcd1621_logoset(LCD_BAR);
				lcd1621Ram[1] = pgm_read_byte(BCDS_TAB+(1+channel%6));
			}

			if(timer4s == 0)
			{
				lcd1621_freq2bcd();									//[103.9]
				lcd1621_logoset(LCD_MHZ);							//[MHz]
			}

			if(mute==0 || (lcd1621_redraw_count&(1<<1))!=0)		//mute flash
				{			lcd1621_logoset(LCD_FM);}			//[FM]
							lcd1621_logoset(LCD_T5);			//[Y||||]
			if(rssi > 10) 	lcd1621_logoset(LCD_T1);
			if(rssi > 20) 	lcd1621_logoset(LCD_T2);
			if(rssi > 30) 	lcd1621_logoset(LCD_T3);
			if(rssi > 40) 	lcd1621_logoset(LCD_T4);
			break;

		case	IPODIN:
			if(mute==0 || (lcd1621_redraw_count&(1<<1))!=0)		//mute flash
			lcd1621_logoset(LCD_IPOD);
			break;

		case	AUXIN:
			if(mute==0 || (lcd1621_redraw_count&(1<<1))!=0)		//mute flash
			lcd1621_logoset(LCD_AUX);
			break;
	}

//batter logo 
	if(volatge > VOLATGE_DC) 			lcd1621_logoset(LCD_PLUG);
		else
		{
			lcd1621_logoset(LCD_B1);
			lcd1621_logoset(LCD_B5);
			if(volatge > VOLATGE_LOW)		lcd1621_logoset(LCD_B4);
			if(volatge > VOLATGE_NORMAL)	lcd1621_logoset(LCD_B3);
			if(volatge > VOLATGE_FULL)		lcd1621_logoset(LCD_B2);
		}

//if(afcrlState==1)	lcd1621_logoset(LCD_SLP);	//指示无效电台
//------------------
lcd1621_tx_ram(0,9);
}

//--------------------------------------------//
//关机界面
void lcd1621_disp_off(void)
{
//清ram
	uchar	i;
	for(i=0; i<9; i++)
	{
		lcd1621Ram[i]=0;
	}

//	lcd1621Ram[2]=0xe4;								//o
	lcd1621Ram34Swap(0xe4);							//0
	lcd1621Ram[5]=pgm_read_byte(BCD_TAB+15);		//f
	lcd1621Ram[6]=pgm_read_byte(BCD_TAB+15);		//f
//	lcd1621_logoset(LCD_DOT);						//.

	lcd1621_tx_ram(0,9);
}


//--------------------------------------------//
void lcd1621_freq2bcd(void)
{
uint	freq_float;
uchar	freq_1000, freq_0100, freq_0010, freq_0001;

	switch(country)
	{
		case	COUNTRY_USA:
		freq_float=0x036b+ (frequency<<1);
		break;
		
		case	COUNTRY_JAP:
		freq_float=0x02f8+ frequency;
		break;

		default:
		freq_float=0x036b+ frequency;
		break;
		}

	freq_1000=freq_float/1000;
	freq_0100=(freq_float%1000)/100;
	freq_0010=(freq_float%100)/10;
	freq_0001=freq_float%10;

	if(freq_1000!= 0) 	lcd1621Ram[2]=pgm_read_byte(BCD_TAB+freq_1000);
	lcd1621Ram34Swap(pgm_read_byte(BCD_TAB+freq_0100));
	lcd1621Ram[5]=pgm_read_byte(BCD_TAB+freq_0010);
	lcd1621Ram[6]=pgm_read_byte(BCD_TAB+freq_0001);
	lcd1621_logoset(LCD_DOT);
}

⌨️ 快捷键说明

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