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

📄 driver.c

📁 用avr mega128读取spi串行字库
💻 C
📖 第 1 页 / 共 5 页
字号:
//有按键释放检查的键盘扫描函数
//******************************************************************
unsigned char KEY_PAD(void)
{
	unsigned char temp1,temp2;
	temp1=SCAN_KEY();
	if(temp1==0x7f)
	{
		return 0x7f;
	}
	else
	{
		do
		{
			temp2=SCAN_KEY();
		}
		while(temp1==temp2);
		return temp1;
	}
}

//******************************************************液晶显示驱动***************************************************************//

//**********************************
//SG19264A-2(驱动器ds_s6b0108、ds_s6b0107)显示驱动程序
//液晶模块初始化、写RAM、写入汉字
//**********************************

//********************************************************
//字符在flash中存储地址计算:
//字符表中的地址=[(区码-0xa1)*0x5e+(位码-0xa1)]*0x20+0x1000;
//在flash中的地址=字符表中的地址/0x100;  除数为页数,(余数*0x10)为字符的页内首地址。
//取出字模存入CHAR_Mode[32]中。
//ASCII在flash中存储地址计算:
//在flash中的地址=ASCII码/0x10;    除数为页数,(余数*0x10)为页内首地址。
//取出字模存入ASCII_Mode[16]中。
//显示顺序:2-3-1-4
//                    2 *  1
//                ****************
//                    3 *  4
//*******************************************************
//**************************************************************
//液晶模块片选
//**************************************************************
void LCD_CS(unsigned char cs)
{
 	if(cs==1)
 	{
 		PORTA&=~CS1_LCD;
 		PORTA|=CS2_LCD;
 		PORTA|=CS3_LCD;
 	}
 	else if(cs==2) 
 	{
 		PORTA&=~CS2_LCD;
 		PORTA|=CS1_LCD;
 		PORTA|=CS3_LCD;
 	} 		
 	else if(cs==3)
 	{
 		PORTA&=~CS3_LCD;
 		PORTA|=CS1_LCD;
 		PORTA|=CS2_LCD;
 	}
}

//**************************************************************
//写数据子程序cs为片选cs1,cs2,cs3
//**************************************************************
void WRITE_DATA(unsigned char data,unsigned char cs)          
 { 
  	LCD_CS(cs);
//  	DELAY_TIME(1);
	PORTA&=~RW_LCD;     //控制读写选择
	PORTA|=DI_LCD;        //控制数据或指令数据
//	DELAY_TIME(1);
	PORTA|=E_LCD;         //下降延锁存数据
	PORTF=data;   
//	DELAY_TIME(1);        
	PORTA&=~E_LCD;
//	DELAY_TIME(1); 
	//PORTA|=E_LCD;
 }
//*************************************************************
//写指令代码子程序cs为片选cs1,cs2,cs3
//*************************************************************
void WRITE_COMMAND(unsigned char command,unsigned char cs)    
{ 
	LCD_CS(cs);
//	DELAY_TIME(1);
	PORTA&=~RW_LCD;     //控制读写选择
	PORTA&=~DI_LCD;        //控制数据或指令数据
//	DELAY_TIME(1);
	PORTA|=E_LCD;         //下降延锁存数据
	PORTF=command; 
//	DELAY_TIME(1);          
	PORTA&=~E_LCD;
	//PORTA|=E_LCD;
//	DELAY_TIME(1); 
}
//******************************************************************
//显示屏初始化
//******************************************************************
void LCD_INITIALIZE(void)
{
	PORTA|=RST_LCD;
	WRITE_COMMAND(0x3e,1);
	WRITE_COMMAND(0x3e,2);
	WRITE_COMMAND(0x3e,3);
	WRITE_COMMAND(0x3f,1);
	WRITE_COMMAND(0x3f,2);
	WRITE_COMMAND(0x3f,3);
	WRITE_COMMAND(0xc0,1);
	WRITE_COMMAND(0xc0,2);
	WRITE_COMMAND(0xc0,3);
	CLEAR_LCD_ALL();
	lcd_lamp_time=0;         //背光灯亮的时间计时
	lcd_lamp_count_flag=1;    //开始计时
	PORTA&=~LAMP_LCD;
	SEND_COM1_AT((const unsigned char *)LCD_INITIALIZE_STRING,sizeof(LCD_INITIALIZE_STRING) );

}
//*************************************************************
//指定写数据的起始地址子程序
//page_address from 0 to 7 ,column_address from 0 to 63,cs - chip select
//*************************************************************
 void WRITE_DATA_ADDRESS(unsigned char page_address,unsigned char column_address,unsigned char cs)    
 {
 	WRITE_COMMAND((0xb8|page_address),cs);    //config x address
 	WRITE_COMMAND((0x40|column_address),cs);    //config y address
 }
 
//***********************************************************
//显示一个byte
//***********************************************************
void DISP_ONE_BYTE(unsigned char page_address,unsigned char column_address,unsigned char cs,unsigned char data)
{
	WRITE_DATA_ADDRESS(page_address,column_address,cs);
	WRITE_DATA(data,cs);	
}
 
//**********************************************************************
//显示一个8*8的图标,点阵数据放在single8[8]中,注:可全屏显示
//**********************************************************************
void DISP_8X8_PICTURE(unsigned char page_address,unsigned char column_address,unsigned char cs)   
{       

	unsigned char i=0;
	if((column_address>56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address,column_address,cs);
		for(i=0;i<(64-column_address);i++)
		{
			WRITE_DATA(single8[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address,0,cs+1);
		for(;i<8;i++)
		{
			WRITE_DATA(single8[i],cs+1);
		}
	}
	else
	{
		WRITE_DATA_ADDRESS(page_address,column_address,cs);
		for(i=0;i<8;i++)
		{
			WRITE_DATA(single8[i],cs);
	        	//delay(100);
		}
	}
}
//**********************************************************************
//反显示一个8*8的图标,点阵数据放在single8[8]中,注:可全屏显示
//**********************************************************************
void DISP_8X8_PICTURE_REVERSE(unsigned char page_address,unsigned char column_address,unsigned char cs)   
{       

	unsigned char i=0;
	if((column_address>56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address,column_address,cs);
		for(i=0;i<(64-column_address);i++)
		{
			WRITE_DATA(~single8[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address,0,cs+1);
		for(;i<8;i++)
		{
			WRITE_DATA(~single8[i],cs+1);
		}
	}
	else
	{
		WRITE_DATA_ADDRESS(page_address,column_address,cs);
		for(i=0;i<8;i++)
		{
			WRITE_DATA(~single8[i],cs);
	        	//delay(100);
		}
	}
}

//************************************************************************
//显示一个汉字    注:可全屏显示
//************************************************************************
void DISP_CHARACTER(unsigned char page_address,unsigned char column_address,unsigned long int qu_code,unsigned long int wei_code,unsigned char cs)              
 {      
 	unsigned int i=0;
 	unsigned char j;
 	j=cs+1;
	GET_CHAR_MODE(qu_code,wei_code);
	if((column_address>56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address,column_address,cs);
		for(i=0;i<(64-column_address);i++)
		{
			WRITE_DATA(char_mode[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address,0,j);
		for(;i<8;i++)
		{
			WRITE_DATA(char_mode[i],j);
		}
	}
	else
	{
	 	WRITE_DATA_ADDRESS(page_address,column_address,cs);
	 	//jdelay(100);
	 	for(i=0;i<8;i++)
	 	{
	 		WRITE_DATA(char_mode[i],cs);
	 		//delay(100);
	 	}
	}
	if((column_address>56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address+1,column_address,cs);
		for(i=8;i<(72-column_address);i++)
		{
			WRITE_DATA(char_mode[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address+1,0,j);
		for(;i<16;i++)
		{
			WRITE_DATA(char_mode[i],j);
		}
	}	
	else
	{
	 	WRITE_DATA_ADDRESS(page_address+1,column_address,cs);
	 	//jdelay(100);
	 	for(i=8;i<16;i++)
	 	{
	 		WRITE_DATA(char_mode[i],cs);
	 		//delay(100);
	 	}
	}
	if((column_address>48)&&(column_address<56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address,column_address+8,cs);
		for(i=16;i<(80-column_address);i++)
		{
			WRITE_DATA(char_mode[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address,0,j);
		for(;i<24;i++)
		{
			WRITE_DATA(char_mode[i],j);
		}
	}
	else if((column_address>=56)&&(cs!=3))
	{
	 	WRITE_DATA_ADDRESS(page_address,column_address-56,j);
	 	//jdelay(100);
	 	for(i=16;i<24;i++)
	 	{
	 		WRITE_DATA(char_mode[i],j);
	 		//delay(100);
	 	}		
	}
	else
	{
	 	WRITE_DATA_ADDRESS(page_address,column_address+8,cs);
	 	//jdelay(100);
	 	for(i=16;i<24;i++)
	 	{
	 		WRITE_DATA(char_mode[i],cs);
	 		//delay(100);
	 	}
	}
	if((column_address>48)&&(column_address<56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address+1,column_address+8,cs);
		for(i=24;i<(88-column_address);i++)
		{
			WRITE_DATA(char_mode[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address+1,0,j);
		for(;i<32;i++)
		{
			WRITE_DATA(char_mode[i],j);
		}
	}
	else if((column_address>=56)&&(cs!=3))
	{
	 	WRITE_DATA_ADDRESS(page_address+1,column_address-56,j);
	 	//jdelay(100);
	 	for(i=24;i<32;i++)
	 	{
	 		WRITE_DATA(char_mode[i],j);
	 		//delay(100);
	 	}		
	}
	else
	{
	 	WRITE_DATA_ADDRESS(page_address+1,column_address+8,cs);
	 	//jdelay(100);
	 	for(i=24;i<32;i++)
	 	{
	 		WRITE_DATA(char_mode[i],cs);
	 		//delay(100);
	 	}
	 }
}
//************************************************************************
//反显示一个汉字    注:可全屏显示
//************************************************************************
void DISP_CHARACTER_REVERSE(unsigned char page_address,unsigned char column_address,unsigned long int qu_code,unsigned long int wei_code,unsigned char cs)              
 {      
 	unsigned int i=0;
 	unsigned char j=0;
 	j=cs+1;
	GET_CHAR_MODE(qu_code,wei_code);
	if((column_address>56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address,column_address,cs);
		for(i=0;i<(64-column_address);i++)
		{
			WRITE_DATA(~char_mode[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address,0,j);
		for(;i<8;i++)
		{
			WRITE_DATA(~char_mode[i],j);
		}
	}
	else
	{
	 	WRITE_DATA_ADDRESS(page_address,column_address,cs);
	 	//jdelay(100);
	 	for(i=0;i<8;i++)
	 	{
	 		WRITE_DATA(~char_mode[i],cs);
	 		//delay(100);
	 	}
	}
	if((column_address>56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address+1,column_address,cs);
		for(i=8;i<(72-column_address);i++)
		{
			WRITE_DATA(~char_mode[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address+1,0,j);
		for(;i<16;i++)
		{
			WRITE_DATA(~char_mode[i],j);
		}
	}	
	else
	{
	 	WRITE_DATA_ADDRESS(page_address+1,column_address,cs);
	 	//jdelay(100);
	 	for(i=8;i<16;i++)
	 	{
	 		WRITE_DATA(~char_mode[i],cs);
	 		//delay(100);
	 	}
	}
	if((column_address>48)&&(column_address<56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address,column_address+8,cs);
		for(i=16;i<(80-column_address);i++)
		{
			WRITE_DATA(~char_mode[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address,0,j);
		for(;i<24;i++)
		{
			WRITE_DATA(~char_mode[i],j);
		}
	}
	else if((column_address>=56)&&(cs!=3))
	{
	 	WRITE_DATA_ADDRESS(page_address,column_address-56,j);
	 	//jdelay(100);
	 	for(i=16;i<24;i++)
	 	{
	 		WRITE_DATA(~char_mode[i],j);
	 		//delay(100);
	 	}		
	}
	else
	{
	 	WRITE_DATA_ADDRESS(page_address,column_address+8,cs);
	 	//jdelay(100);
	 	for(i=16;i<24;i++)
	 	{
	 		WRITE_DATA(~char_mode[i],cs);
	 		//delay(100);
	 	}
	}
	if((column_address>48)&&(column_address<56)&&(cs!=3))
	{
		WRITE_DATA_ADDRESS(page_address+1,column_address+8,cs);
		for(i=24;i<(88-column_address);i++)
		{
			WRITE_DATA(~char_mode[i],cs);
		}
		WRITE_DATA_ADDRESS(page_address+1,0,j);
		for(;i<32;i++)
		{
			WRITE_DATA(~char_mode[i],j);
		}
	}
	else if((column_address>=56)&&(cs!=3))
	{
	 	WRITE_DATA_ADDRESS(page_address+1,column_address-56,j);
	 	//jdelay(100);
	 	for(i=24;i<32;i++)
	 	{
	 		WRITE_DATA(~char_mode[i],j);
	 		//delay(100);
	 	}		
	}
	else
	{
	 	WRITE_DATA_ADDRESS(page_address+1,column_address+8,cs);
	 	//jdelay(100);
	 	for(i=24;i<32;i++)
	 	{
	 		WRITE_DATA(~char_mode[i],cs);
	 		//delay(100);
	 	}
	 }
}
//*****************************************************
//取字符的字模(32BYTES)16*16
//*****************************************************
void GET_CHAR_MODE(unsigned long int qu_code,unsigned long int wei_code)
{
	unsigned char i=0;
	unsigned int j=0;
	READ_ONE_PAGE_TO_BUFFER1(CALCULATE_PAGE_ADDRESS(qu_code,wei_code));
	j=CALCULATE_BUFFER_ADDRESS(qu_code,wei_code);	
	char_mode[0]=READ_BYTE_FROM_BUFFER1(j);
	j++;	
	for(i=1;i<32;i++)
	{
		char_mode[i]=READ_BYTE_FROM_BUFFER1(j);
		j++;
	}
}
//*******************************************************
//计算字符的页地址   iccavr编译器计算数据类型不匹配
//*******************************************************
unsigned int CALCULATE_PAGE_ADDRESS(unsigned  long int qu_code,unsigned long int wei_code)
{
	unsigned long int table_address;
	unsigned int char_page_address;
	unsigned long int i,j,k,l,w;
	i=0xa1;
	j=0x5e;
	k=0xa1;
	l=0x20;
	w=0x1000;
	table_address=((qu_code-i)*j+(wei_code-k))*l+w;
	char_page_address=table_address/0x100;
	return(char_page_address);	
}
//******************************************************
//计算字符的页内地址   iccavr编译器计算数据类型不匹配
//******************************************************
unsigned int CALCULATE_BUFFER_ADDRESS(unsigned long int qu_code,unsigned long int wei_code)
{

⌨️ 快捷键说明

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