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

📄 19264.c

📁 AVR单片机学习笔记
💻 C
📖 第 1 页 / 共 2 页
字号:
};

struct typFNT_GB16 const GB_16[] = {	// 宋体 9小五 显示为12*16 

"液",0x19,0xE2,0x14,0x42,0xF2,0x2E,0x72,0x8F,0xAA,0x7A,0x02,0x00,0x01,0x07,0x00,0x00,0x07,0x04,0x04,0x02,0x01,0x02,0x04,0x00,
"晶",0x00,0xC0,0x40,0x5F,0xD5,0x15,0xD5,0x55,0x5F,0x40,0xC0,0x00,0x00,0x07,0x05,0x05,0x07,0x00,0x07,0x05,0x05,0x05,0x07,0x00,
"显",0x00,0x40,0x9F,0x15,0xD5,0x15,0xD5,0x15,0x1F,0xC0,0x00,0x00,0x04,0x04,0x05,0x04,0x07,0x04,0x07,0x06,0x05,0x04,0x04,0x00,
"示",0x10,0x12,0x92,0x52,0x12,0xF2,0x12,0x12,0x53,0x92,0x10,0x00,0x02,0x01,0x00,0x04,0x04,0x07,0x00,0x00,0x00,0x00,0x03,0x00,
"的",0xFC,0x44,0x46,0x45,0xFC,0x10,0x2C,0xC7,0x04,0x04,0xFC,0x00,0x07,0x02,0x02,0x02,0x07,0x00,0x00,0x04,0x04,0x04,0x03,0x00,
"第",0x04,0xEA,0xAB,0xAE,0xAA,0xFC,0xAA,0xAB,0xAE,0xBA,0x82,0x00,0x04,0x04,0x02,0x01,0x00,0x07,0x00,0x02,0x02,0x02,0x01,0x00,
"一",0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
"行",0x48,0x24,0xF3,0x08,0x09,0x09,0x09,0x09,0xF9,0x09,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x04,0x04,0x04,0x07,0x00,0x00,0x00,
"二",0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
"三",0x00,0x02,0x22,0x22,0x22,0x22,0x22,0x22,0x23,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,
"四",0x00,0xFF,0x81,0x41,0x3F,0x01,0x01,0xFF,0x81,0x81,0xFF,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x07,0x00,
"五",0x00,0x11,0x11,0x91,0x7F,0x11,0x11,0x11,0xF1,0x01,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x00,
"左",0x08,0x08,0x88,0x68,0x5E,0x48,0xC8,0x48,0x48,0x4C,0x08,0x00,0x04,0x0A,0x09,0x08,0x08,0x08,0x0F,0x08,0x08,0x08,0x08,0x00,
"中",0x00,0xF8,0x88,0x88,0x88,0xFE,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,
"右",0x08,0x08,0x88,0xE8,0x58,0x4E,0x48,0x48,0x48,0xC8,0x08,0x00,0x02,0x01,0x00,0x0F,0x04,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,

};
unsigned char GetPage(void) /*得到当前页*/
{
	return CurPage;
}

unsigned char GetCol(void) /*得到当前列*/
{
	return CurCol;
}

void SetPageCol(unsigned char upage, unsigned char ucol) /* 设置液晶的页和列 */
{
	CurPage = upage;
	CurCol = ucol;
	if(ucol<64)
	{
		set_page_L(upage);
		set_col_addr_L(ucol);
	}
	else if(ucol<128)
	{
	 	 set_page_M(upage);
		 set_col_addr_M(ucol-64);
	}
	else
	{
		set_page_R(upage);
		set_col_addr_R(ucol-128);
	}
}

/* 设置当前显示的页和列 */
void SetRowCol(unsigned char urow, unsigned char ucol) 
{
	unsigned char page;
	CurRow = urow;
	CurCol = ucol;
	
	switch(urow)
	{
		case 1:
			page=0;
			CurOffset=1;
			break;
		case 2:
			page=1;
			CurOffset=2;
			break;
		case 3:
			page=3;
			CurOffset=1;
			break;
		case 4:
			page=4;
			CurOffset=2;
			break;
		case 5:
			page=6;
			CurOffset=1;
			break;
	}
	SetPageCol(page,ucol);
}

void disp_char(unsigned char c)
{
	unsigned char k,j,uPage,uCol,ch_r,ch_w;
	unsigned char width;
	unsigned char len;
	uPage = GetPage();
	uCol = GetCol();
	len=sizeof(ASC_16)/sizeof(ASC_16[0]);
	for(k=0;k<len;k++)
	{
		if(c == ASC_16[k].Index[0] ) break;
	}
	if(k<len)
	{
		
		if(c=='-'||c==':') 
			width=ASC_CHR_WIDTH-2;
		else if(c=='|')
			width=ASC_HZ_WIDTH-ASC_CHR_WIDTH;
		else 
			width=ASC_CHR_WIDTH;
		
		if(CurOffset==1) //下半部是写半个字节
		{
			for(j=0;j<width;j++)
			{
				SetPageCol(uPage,uCol+j);
				ch_w=ASC_16[k].Msk[j];
				if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w);
				else if(uCol+j<128) write_LCD(MID,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w);
			}
			SetPageCol(uPage+1,uCol);
			
			for(j=0;j<width;j++)
			{
				SetPageCol(uPage+1,uCol+j);
				if(uCol+j<64) ch_r=read_LCD(LEFT);
				else if (uCol+j<128) ch_r=read_LCD(MID);
				else ch_r=read_LCD(RIGHT);
				ch_r&=0xf0;
				ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j]&0x0f; 
				ch_w|=ch_r;
				SetPageCol(uPage+1,uCol+j);
				if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w);
				else if(uCol+j<128) write_LCD(MID,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w);
			}
		}
		else //上半部是写半个字节
		{
			for(j=0;j<width;j++)
			{
				SetPageCol(uPage,uCol+j);
				if(uCol+j<64) ch_r=read_LCD(LEFT);
				else if (uCol+j<128) ch_r=read_LCD(MID);
				else ch_r=read_LCD(RIGHT);
				ch_r&=0x0f;
				ch_w=ASC_16[k].Msk[j];
				ch_w=ch_w<<4;
				ch_w|=ch_r;
				SetPageCol(uPage,uCol+j);
				if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w);
				else if(uCol+j<128) write_LCD(MID,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w);
			}
			SetPageCol(uPage+1,uCol);
			for(j=0;j<width;j++)
			{
				SetPageCol(uPage+1,uCol+j);
				
				ch_r=ASC_16[k].Msk[j];
				ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j];
				ch_r=ch_r>>4;
				ch_w=ch_w<<4; 
				ch_w|=ch_r;
				SetPageCol(uPage+1,uCol+j);
				if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w);
				else if(uCol+j<128) write_LCD(MID,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w);
			}
		}
	}
	 SetPageCol(uPage,uCol+width);
}


void disp_hz(unsigned char const *hz)
{
	unsigned char k,j,uPage,uCol,ch_r,ch_w;
	uPage = GetPage();
	uCol = GetCol();
	for(k=0;k<sizeof(GB_16)/sizeof(GB_16[0]);k++)
	{
		if(hz[0] == GB_16[k].Index[0] && hz[1] == GB_16[k].Index[1])
			break;
	}

	if(CurOffset==1) 
	{
	for(j=0;j<ASC_HZ_WIDTH;j++)
	{
		SetPageCol(uPage,uCol+j);
		ch_w=GB_16[k].Msk[j];
	            if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w);
				else if(uCol+j<128) write_LCD(MID,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w);
	}
	SetPageCol(uPage+1,uCol);

	for(j=0;j<ASC_HZ_WIDTH;j++)
	{
		SetPageCol(uPage+1,uCol+j);
		if(uCol+j<64) ch_r=read_LCD(LEFT);
				else if (uCol+j<128) ch_r=read_LCD(MID);
				else ch_r=read_LCD(RIGHT);
		ch_r&=0xf0;
		ch_w=GB_16[k].Msk[ASC_HZ_WIDTH+j]&0x0f; 
		ch_w|=ch_r;
		SetPageCol(uPage+1,uCol+j);
		if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w);
		else if(uCol+j<128) write_LCD(MID,DATA,ch_w); 
		else write_LCD(RIGHT,DATA,ch_w);
	}
	SetPageCol(uPage,uCol+ASC_HZ_WIDTH);
	}

	else //汉字上半部是写半个字节
	{
	for(j=0;j<ASC_HZ_WIDTH;j++)
	{
		SetPageCol(uPage,uCol+j);
		if(uCol+j<64) ch_r=read_LCD(LEFT);
				else if (uCol+j<128) ch_r=read_LCD(MID);
				else ch_r=read_LCD(RIGHT);
		ch_r&=0x0f;
		ch_w=GB_16[k].Msk[j];
		ch_w=ch_w<<4;
		ch_w|=ch_r;
		SetPageCol(uPage,uCol+j);
	if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w);
				else if(uCol+j<128) write_LCD(MID,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w);
	}
	SetPageCol(uPage+1,uCol);
	for(j=0;j<ASC_HZ_WIDTH;j++)
	{
		SetPageCol(uPage+1,uCol+j);

		ch_r=GB_16[k].Msk[j];
		ch_w=GB_16[k].Msk[ASC_HZ_WIDTH+j];
		ch_r=ch_r>>4;
		ch_w=ch_w<<4; 
		ch_w|=ch_r;
		SetPageCol(uPage+1,uCol+j);
		if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w);
				else if(uCol+j<128) write_LCD(MID,DATA,ch_w); 
				else write_LCD(RIGHT,DATA,ch_w);
	}
	SetPageCol(uPage,uCol+ASC_HZ_WIDTH);
	}
}

void disp_str(unsigned char const *p)
{
	unsigned char i=0;
	while(p[i]>0)
	{
		if(p[i] < 128)
		{	/* ASCII */
			disp_char(p[i]);
		}
		else
		{	/* 中文 */
			disp_hz(&p[i]);
			i++;
		}
		i++;
	}
}

void circle(unsigned char xxx,unsigned char yyy,unsigned char Rx,unsigned char flag)
{
	unsigned int xx,rr,xt,yt,rs,col,row;
	yt=Rx;
	rr=Rx*Rx+1;			//补偿 1 修正方形
	rs=(yt+(yt>>1))>>1;		//(*0.75)分开1/8圆弧来画
	for (xt=0;xt<=rs;xt++)
	{
		xx=xt*xt;
		while ((yt*yt)>(rr-xx))yt--;
		col=xxx+xt;		//第一象限
		row=yyy-yt;
		pixel(col,row,flag);
		col=xxx-xt;		//第二象限
		pixel(col,row,flag);
		row=yyy+yt;		//第三象限
		pixel(col,row,flag);
		col=xxx+xt;		//第四象限
		pixel(col,row,flag);

/***************45度镜象画另一半***************/

		col=xxx+yt;		//第一象限
		row=yyy-xt;
		pixel(col,row,flag);
		col=xxx-yt;		//第二象限
		pixel(col,row,flag);
		row=yyy+xt;		//第三象限
		pixel(col,row,flag);
		col=xxx+yt;		//第四象限
		pixel(col,row,flag);
	}
}

				
/************************************************/
/*画线。任意方向的斜线,直线数学方程 aX+bY=1	*/
/************************************************/
void line(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char flag)
{
	register unsigned char t,col,row;
	int xerr=0,yerr=0,delta_x,delta_y,distance;
	int incx,incy;

	delta_x=xt-x0;				/*计算坐标增量	*/
	delta_y=yt-y0;
	col = x0;
	row = y0;
	if(delta_x>0) incx=1;			/*设置单步方向	*/
	else if( delta_x==0 ) incx=0;		/*垂直线	*/
		else {incx=-1;delta_x=-delta_x;}

	if(delta_y>0) incy=1;
	else if( delta_y==0 ) incy=0;		/*水平线	*/
		else {incy=-1;delta_y=-delta_y;}

	if( delta_x > delta_y )	distance=delta_x; /*选取基本增量坐标轴*/
	else distance=delta_y;

	for( t=0;t <= distance+1; t++ )	{	/*画线输出	*/
		pixel(col,row,flag);		/*画点		*/
		xerr +=	delta_x	;
		yerr +=	delta_y	;
		
		if( xerr > distance ) {
			xerr-=distance;
			col+=incx;
		}
		if( yerr > distance ) {
			yerr-=distance;
			row+=incy;
		}
	}
}

void main()
{
unsigned char i;
DDRA=0xff;
init_lcd();
clr_lcd();
SetRowCol(1,5);
disp_str("晶晶晶晶11晶晶晶晶22晶晶晶晶33");
while(1);
}

⌨️ 快捷键说明

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