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

📄 lcd.c

📁 51单片机驱动320*234彩显的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
{
	line(257,207,280,196,BLACK);
	line(257,207,280,219,BLACK);
	line(268,207,280,196,BLACK);
	line(268,207,280,219,BLACK);
	return;
}

void arrow7(void)
{
	line(257,196,280,207,BLACK);
	line(257,196,268,219,BLACK);
	line(268,207,280,207,BLACK);
	line(268,207,268,219,BLACK);
	return;
}

void disp_state_column(void)
{
	disp_bmp(10,10,24,24,gps_state_dot);
	disp_bmp(252,10,24,24,shipping_dot);
	disp_bmp(286,10,24,24,head_dot);
	return;
}

void disp_time(void)
{	
	get_hzdot(0xa3,timecb.hour/10+0xb0,125,16);
	get_hzdot(0xa3,timecb.hour%10+0xb0,135,16);
	get_hzdot(0xa1,0xc3,145,16);
	get_hzdot(0xa3,timecb.minute/10+0xb0,155,16);
	get_hzdot(0xa3,timecb.minute%10+0xb0,165,16);
	get_hzdot(0xa1,0xc3,175,16);
	get_hzdot(0xa3,timecb.second/10+0xb0,185,16);
	get_hzdot(0xa3,timecb.second%10+0xb0,195,16);	
	return;
}

void disp_init_window(void)
{
	watchdog_reset();
	clear(WHITE);
	disp_state_column();
	disp_main_menu();
	gps_disc();
	return;
}

void clear(unsigned char colorb)
{                                                                                
	unsigned char i,j,c;
	c=(colorb<<4)|colorb;
	wr_cmd=0;       //"写低8位地址
	wr_dat=0x00;
	wr_cmd=1;     //"写高8位地址
	wr_dat=0x00;
	wr_cmd=2;     //"显示数据读写通道  
	for(i=0;i<40;i++)
	{
		for(j=0;j<234;j++)
		{
			wr_dat=c;wr_dat=c;wr_dat=c;wr_dat=c;
			wr_dat=c;wr_dat=c;wr_dat=c;wr_dat=c;
		}
	}
	wr_cmd=3;     //"关数据读写通道
	return;
}

void disp_bmp(unsigned int x,unsigned int y,unsigned int row_num,unsigned int col_num,unsigned char *charp)
{                                                                                
	unsigned int addr;
	unsigned int i,j;
	unsigned char *p;
	//command=wr1_disp1_cmd;
	p=charp;
	for(i=y;i<(y+col_num);i++)
	{
		addr=i*320+x;
		if((i>204)||((i==204)&&(x>255)))
		{
			wr_cmd=0x04;
			wr_dat=addr%256;
			wr_cmd=0x05;
			wr_dat=addr/256;
			wr_cmd=0x06;
		}
		else 
		{
			wr_cmd=0x00;
			wr_dat=addr%256;
			wr_cmd=0x01;
			wr_dat=addr/256;
			wr_cmd=0x02;
		}
		for(j=0;j<row_num;j++) 
			wr_dat=(*(p++)); 
	}
	return;
}

void wr_chinese(unsigned int x,unsigned char y,unsigned char type)
{
	union
	{
		unsigned long alldata;
	       unsigned char clondata[4];
	}aa;

	unsigned int addr;
   	unsigned char i,j,l,pot;

	l=2;
	for(i=0;i<16;i++)
	{
		addr=(y+i)*320+x;
		if(((y+i)>204)||(((y+i)==204)&&(x>255)))
		{
			wr_cmd=0x04;
			wr_dat=addr%256;
			wr_cmd=0x05;
			wr_dat=addr/256;
			wr_cmd=0x06;
		}
		else 
		{
			wr_cmd=0x00;
			wr_dat=addr%256;
			wr_cmd=0x01;
			wr_dat=addr/256;
			wr_cmd=0x02;
		}
		for(j=0;j<l;j++) 
		{     
			for(pot=0;pot<8;pot++)
			{ 
				aa.alldata=aa.alldata<<4;
				if(type==0)
				{
					if(((*(hanzi_dot+i*l+j))&(0x80>>pot))>0)
					{
						aa.alldata=aa.alldata|(unsigned long)BLACK;
					else 
						aa.alldata=aa.alldata|(unsigned long)WHITE;
					}
				}

				else if(type==1)
				{
					if(((*(hanzi_dot+i*l+j))&(0x80>>pot))>0)
					{
						aa.alldata=aa.alldata|(unsigned long)WHITE;
					else 
						aa.alldata=aa.alldata|(unsigned long)BLACK;
					}
				}
			}        
			wr_dat=aa.clondata[0];
			wr_dat=aa.clondata[1];
			wr_dat=aa.clondata[2];
			wr_dat=aa.clondata[3];
		}
		wr_cmd=0x03;
	}
	return;
}

void get_hzdot(unsigned char hh,unsigned char ll,unsigned int x,unsigned char y,unsigned char type)
{
	unsigned char rdchar;
	unsigned char i;
	unsigned char page;
	unsigned char xdata * idata offset_inpage;
	
	WDKEY=0x55;
	
	if(((hh>=0xa1)&&(hh<=0xaa))||((hh==0xab)&&(ll<=0xf4)))
	{
		page=0;
		offset_inpage=0x8000+(94*(hh-0xa1)+(ll-0xa1))*32;
		goto GET;
	}

	if(((hh==0xab)&&(ll>=0xf5))||((hh>=0xac)&&(hh<=0xb5))||((hh==0xb6)&&(ll<=0xea)))
	{
		page=1;
		if((hh==0xab)&&(ll>=0xf5))
			offset_inpage=0x8000+(94*(hh-0xab)+(ll-0xf5))*32;
		else 
			offset_inpage=0x8000+(94*(hh-0xac)+(ll-0xa1)+10)*32;
		goto GET;
	}

	if(((hh==0xb6)&&(ll>=0xeb))||((hh>=0xb7)&&(hh<=0xc0))||((hh==0xc1)&&(ll<=0xe0)))
	{
		page=2;
		if((hh==0xb6)&&(ll>=0xeb))
			offset_inpage=0x8000+(94*(hh-0xb6)+(ll-0xeb))*32;
		else 
			offset_inpage=0x8000+(94*(hh-0xb7)+(ll-0xa1)+20)*32;
		goto GET;
	}

	if(((hh==0xc1)&&(ll>=0xe1))||((hh>=0xc2)&&(hh<=0xcb))||((hh==0xcc)&&(ll<=0xd6)))
	{
		page=3;
		if((hh==0xc1)&&(ll>=0xe1))
			offset_inpage=0x8000+(94*(hh-0xc1)+(ll-0xe1))*32;
		else 
			offset_inpage=0x8000+(94*(hh-0xc2)+(ll-0xa1)+30)*32;
		goto GET;
	}

	if(((hh==0xcc)&&(ll>=0xd7))||((hh>=0xcd)&&(hh<=0xd6))||((hh==0xd7)&&(ll<=0xcc)))
	{
		page=4;
		if((hh==0xcc)&&(ll>=0xd7))
			offset_inpage=0x8000+(94*(hh-0xcc)+(ll-0xd7))*32;
		else 
			offset_inpage=0x8000+(94*(hh-0xcd)+(ll-0xa1)+40)*32;
		goto GET;
	}

	if(((hh==0xd7)&&(ll>=0xcd))||((hh>=0xd8)&&(hh<=0xe1))||((hh==0xe2)&&(ll<=0xc2)))
	{
		page=5;
		if((hh==0xd7)&&(ll>=0xcd))
			offset_inpage=0x8000+(94*(hh-0xd7)+(ll-0xcd))*32;
		else 
			offset_inpage=0x8000+(94*(hh-0xd8)+(ll-0xa1)+50)*32;
		goto GET;
	}

	if(((hh==0xe2)&&(ll>=0xc3))||((hh>=0xe3)&&(hh<=0xec))||((hh==0xed)&&(ll<=0xb8)))
	{
		page=6;
		if((hh==0xe2)&&(ll>=0xc3))
			offset_inpage=0x8000+(94*(hh-0xe2)+(ll-0xc3))*32;
		else 
			offset_inpage=0x8000+(94*(hh-0xe3)+(ll-0xa1)+60)*32;
		goto GET;
	}

	if(((hh==0xed)&&(ll>=0xb9))||((hh>=0xee)&&(hh<=0xf7)))
	{
		page=7;
		if((hh==0xed)&&(ll>=0xb9))
			offset_inpage=0x8000+(94*(hh-0xed)+(ll-0xb9))*32;
		else 
			offset_inpage=0x8000+(94*(hh-0xee)+(ll-0xa1)+70)*32;
		goto GET;
	}
//    Because of the restriction of the processor,use the following method(consume too many timer cycles) can not get the HZdot!
//    offset_inpage=0x8000+((94*(hh-0xa1)+(ll-0xa1))*32)%(32*1024);
//	 page=((94*(hh-0xa1)+(ll-0xa1))*32)/(32*1024);
	
	GET:
	for(i=0;i<32;i++)
	{
		PSD8xx_reg.PAGE=page|0x80;
		rdchar=*(offset_inpage++);
		PSD8xx_reg.PAGE=0x00;
		hanzi_dot[i]=rdchar;
	}
	//type=0,正常显示;type=1,反显
	wr_chinese(x,y,type);
	
	return;
}

//对称法画圆的8个镜像点
void plot_circle_points(unsigned int x,unsigned int y,unsigned int xx,unsigned int yy,unsigned char c)    
{                                //对称法画圆的8个镜像点
   	set_pixel((x+yy),(y+xx),c);        //第 1 个 8 分圆
    	set_pixel((x+xx),(y+yy),c);        //第 2 个 8 分圆
    	set_pixel((x-xx),(y+yy),c);        //第 3 个 8 分圆
    	set_pixel((x-yy),(y+xx),c);        //第 4 个 8 分圆
    	set_pixel((x-yy),(y-xx),c);        //第 5 个 8 分圆
    	set_pixel((x-xx),(y-yy),c);        //第 6 个 8 分圆
    	set_pixel((x+xx),(y-yy),c);        //第 7 个 8 分圆
    	set_pixel((x+yy),(y-xx),c);        //第 8 个 8 分圆	 
    	return;
}


void circle (int xc,int yc,int radius,int c)
{
	int x, y, p;
	x=0;
	y=radius;
	p=3-2*radius;

	while (x<y)
	{
	        plot_circle_points(xc, yc, x, y, c);
	        if (p<0) 
			p=p+4*x+6;
	        else
		{
	       	p=p+4*(x-y)+10;
	              y-=1;
	       }
	       x+=1;
	}
	if (x==y)
		plot_circle_points(xc, yc, x, y, c);
	
	return;
}

void set_pixel(unsigned int x,unsigned char y,unsigned char colorb)
{
	unsigned int addr;
	unsigned char c,j;
	
	addr=y*320+x;
	
	if((y>204)||((y==204)&&(x>255)))
	{
		wr_cmd=0x04;
		wr_dat=addr%256;
		wr_cmd=0x05;
		wr_dat=addr/256;
		wr_cmd=0x06;
	}
	else 
	{
		wr_cmd=0x00;
		wr_dat=addr%256;
		wr_cmd=0x01;
		wr_dat=addr/256;
		wr_cmd=0x02;
	}	

	c=rd_dat;
	j=((unsigned char)x)&0x01;
	if(j==0x00)        //even pot
	{c=(c&0x0f)|(colorb<<4);}
	else if(j==0x01)   //odd  pot
	{c=(c&0xf0)|colorb;}
	else c=(RED<<4)|RED;

	wr_dat=c;
	wr_cmd=0x03;
	
	return;
}

 int abs (int val)
 {
 	if(val>=0)
		return val;
	return(-val);
 }

void line(unsigned int x0,unsigned int y0,unsigned int x1,unsigned int y1,unsigned char colorb)
{
	float l;
	unsigned int i;
	
	l=abs(x1-x0)>abs(y1-y0)?abs(x1-x0):abs(y1-y0);
	
	if(x1>=x0&&y1>=y0)
	{
		for(i=0;i<l;i++)
			set_pixel(x0+(x1-x0)/l*i,y0+(y1-y0)/l*i,colorb);
	}
	else if(x1<x0&&y1>=y0)
	{
		for(i=0;i<l;i++) 
			set_pixel(x0-(x0-x1)/l*i,y0+(y1-y0)/l*i,colorb);
	}
	else if(x1>=x0&&y1<y0)
	{
		for(i=0;i<l;i++) 
			set_pixel(x0+(x1-x0)/l*i,y0-(y0-y1)/l*i,colorb);
	}
	else
	{
		for(i=0;i<l;i++) 
			set_pixel(x0-(x0-x1)/l*i,y0-(y0-y1)/l*i,colorb);  
	}

	return;
}

//poll the lcd event
void lcd_poll(void)
{
	watchdog_reset();

	if(lcdcb.delay_disp_on==1)
	{
		if(check_timer(lcdcb.delay_disp_timerh)==0)
		{
			lcdcb.delay_disp_on=0;
			//clear state msg
			if(keycb.exit_curr_level==1)
			{
				keycb.exit_curr_level=0;
				keycb.menu_level=1;
			}
			lcdcb.event_notice=SCR_EVENT_MAIN_MENU;
		}	
	}

	switch(lcdcb.event_notice)
	{		
		case SCR_EVENT_DISPLAY_FINISHED	:
		break;
		
		case SCR_EVENT_INIT_INFO:	
			disp_init_info();
			if(ppcb.msg_ack_flag&(BROADCAST_MSG_ON|DISPATCH_MSG_ON|WATERLEVEL_AJUST_MSG_ON))
			{
				ppcb.msg_ack_flag&=~BROADCAST_MSG_ON;
				ppcb.msg_ack_flag&=~DISPATCH_MSG_ON;
				ppcb.msg_ack_flag&=~WATERLEVEL_AJUST_MSG_ON;
				clear_state_msg();
			}
			if(keycb.exit_curr_level==1)
			{
				keycb.exit_curr_level=0;
				keycb.menu_level=0;
			}
			if(keycb.enter_next_level==1)
			{
				keycb.enter_next_level=0;
				keycb.menu_level++;

⌨️ 快捷键说明

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