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

📄 pointline.c

📁 提供12864的LCD上的画点和画线函数
💻 C
字号:
#define RLCDI XBYTE[0xff80]	//读出忙标志(BF)
#define WLCDI XBYTE[0xff00]	//写指令到指令寄存器
#define RLCDD XBYTE[0xffc0]	//从数据寄存器读出数据
#define WLCDD XBYTE[0xff40]	//写数据到数据寄存器

#define uchar unsigned char
#define uint unsigned int

void dwrctrl(uchar x)	//写指令
{			
	while((RLCDI&0x80)==0x80);	//检查忙标志
	WLCDI=x;	
}

void dwrdata(uchar x)	//写数据
{
	while((RLCDI&0x80)==0x80);
	WLCDD=x;	
}

void writeXY(uchar x,uchar y,uchar data1,uchar data2)	//在x,y坐标处写两字节数据
{
	dwrctrl(y|0x80);_nop_();_nop_();
	dwrctrl(x|0x80);_nop_();_nop_();
	dwrdata(data1);_nop_();_nop_();
	dwrdata(data2);_nop_();_nop_();
}

/*画点实现*/
void pixel(uchar x,uchar y) //在指定位置画点函数,x坐标范围为0~127,y坐标范围为0~63
{
	uchar i,j;	
	uint position=0x8000;	//每次向绘图RAM写入16个点的画点位置
	if(y>31)	//屏128*64对应绘图RAM的256*32
		{
			y=y-32;
			x=x+128;
		}
	position=position>>(x%16);	//确定画点位置
	dwrctrl(y|0x80);_nop_();	//将垂直坐标写入绘图RAM
	dwrctrl(x/16|0x80);_nop_();	//将水瓶座表写入绘图RAM
	while((RLCDI&0x80)==0x80);i=RLCDD;	//先DUMMYREAD一次
	while((RLCDI&0x80)==0x80);i=RLCDD;	//从绘图RAM读取一个字节数据到i
	while((RLCDI&0x80)==0x80);j=RLCDD;	//读取两个字节数据到就j
	writeXY(x/16,y,position/256|i,(uchar)position|j);	//写入,实现画点
}

/*画线函数 */
void line(uchar sx,uchar sy,uchar ex,uchar ey)	
{
	char Err=0,dx,dy;
	if(ey<sy)	//如果终点纵坐标大于起点纵坐标则交换之
	{
		dx=ex;ex=sx;sx=dx;
		dy=ey;ey=sy;sy=dy;	
	}
	pixel(sx,sy);//画起点
	dx=ex-sx;dy=ey-sy;//画点步数,dy大于等于0
	if(dx>0)	//终点在起点右方
	{
		if(dx>=dy)	//横坐标间距大于纵坐标间距
		{	while(sx!=ex)
			{
				if(Err>=0)
				{
					sy=sy+1;
					Err=Err+(dy-dx);//Err为sy的调整因子,决定sy是加1还是不变	
				}
				else
				{	Err=Err+dy;
					sx=sx+1;//sx想ex逼近,步距为1
				}
				pixel(sx,sy);		
			}
		}
		else //横坐标间距小于纵坐标间距	
		{
			while(sy!=ey)
			{
				if(Err>=0)
				{
					sx=sx+1;
					Err=Err+(dx-dy);//Err为sx的调整因子,决定sx是加1还是不变	
				}
				else
				{	Err=Err+dx;
					sy=sy+1;//sy想ey逼近,步距为1
				}
				pixel(sx,sy);		
			}	
		}
	}
	else //终点在起点左方
	{
		dx=sx-ex;
		if(dx>=dy)	//横坐标间距大于纵坐标间距
		{	while(sx!=ex)
			{
				if(Err>=0)
				{
					sy=sy+1;
					Err=Err+(dy-dx);//Err为sy的调整因子,决定sy是加1还是不变	
				}
				else
				{	Err=Err+dy;
					sx=sx+1;//sx想ex逼近,步距为1
				}
				pixel(sx,sy);		
			}
		}
		else //横坐标间距小于纵坐标间距	
		{
			while(sy!=ey)
			{
				if(Err>=0)
				{
					sx=sx+1;
					Err=Err+(dx-dy);//Err为sx的调整因子,决定sx是加1还是不变	
				}
				else
				{	Err=Err+dx;
					sy=sy+1;//sy想ey逼近,步距为1
				}
				pixel(sx,sy);		
			}	
		}
	}	
}

⌨️ 快捷键说明

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