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

📄 demo.c

📁 液晶控制芯片SED1335的控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	j++;
	LCD_CMD_ADR=0x46;	  // CSRW 代码
	LCD_DAT_ADR=(uchar)j; // 设置光标地址
	LCD_DAT_ADR=(uchar)(j>>8);

	LCD_CMD_ADR=0x42;	// MWRITE代码
	LCD_DAT_ADR=0x82;  // 写入汉字代码右上部
	LCD_DAT_ADR=0x83;  // 写入汉字代码右下部
}

//	写汉字函数(图形方式)
//  输入坐标都是以 8 点阵为增量单位
//  O_X: 0~38
//  O_Y: 0~28
//  num: 要写入字符对应的 CGTAB[num][count1] 的num 值
void CCW2_PR(uchar O_X,uchar O_Y,uint num)
{
	uchar idata count1;
	uint  idata i,j;

	j=PARA*8*O_Y+O_X;
	j=j+SAD2;		// added by gao.
	LCD_CMD_ADR=0x4f;   // CSRDIR 代码(下移)

	for(i=0;i<2;i++)
	{
		LCD_CMD_ADR=0x46;	  // CSRW 代码
		LCD_DAT_ADR=(uchar)j;	  // 设置光标地址CSR
		LCD_DAT_ADR=(uchar)(j>>8);

		LCD_CMD_ADR=0x42;	// MWRITE 代码
		for(count1=i*16;count1<16*(i+1);count1++)
			LCD_DAT_ADR=CGTAB[num][count1]; // 写入数据

		j=j+1;
	}
}


// 函数功能:在指定坐标位置写入ASCII码字符,
//  O_X: 0~39
//  O_Y: 0~29
void w_ASCII(uchar O_X,uchar O_Y,uchar num)
{
	uint idata j;
	
	j=PARA*O_Y+O_X;

	LCD_CMD_ADR=0x46;	// CSRW	代码
	LCD_DAT_ADR=(uchar)j;	// 设置光标地址CSR
	LCD_DAT_ADR=(uchar)(j>>8);

	LCD_CMD_ADR=0x4c;	// CSRDIR 代码
	LCD_CMD_ADR=0x42;	// MWRITE 代码

	LCD_DAT_ADR=num;  // 写入数据
}

// 从指定起始点写入字符串(ASCII码)
//  O_X: 0~39
//  O_Y: 0~29
void w_string(uchar O_X,uchar O_Y,const uchar *STRING)
{
	while(*STRING)
	{
		w_ASCII(O_X,O_Y,*STRING);
		STRING++;
		O_X++;
		if(O_X>319)
		{
			O_X=0;
			O_Y+=1;
		}
	}
}

// 功能:绘点函数
// 输入范围:O_X:0~319; O_Y:0~239;
// 说明:坐标定位 左上角为原点(0,0),水平向右为X轴正方向,垂直向下为Y轴正方向
void draw_dot(int O_X,uchar O_Y)
{
	uchar idata i,j,dat;
	uint  idata k;

	i=((uchar)O_X)&0x07;	// i 为O_X 除以 8 的余数
	O_X=O_X>>3;	// O_X 为O_X 除以 8 的整数
	k=PARA*O_Y+O_X+SAD2;

	LCD_CMD_ADR=0x46;		// 设置光标地址
	LCD_DAT_ADR=(uchar)k;	// 计算光标地址
	LCD_DAT_ADR=(uchar)(k>>8);

	j=0x80;		// 确定要画的点对应的字节数据的值
	if(i!=0)
		j=j>>i;

	LCD_CMD_ADR=0x43;	// MREAD 代码
	dat=LCD_CMD_ADR;	// 读取当前显示数据

	LCD_CMD_ADR=0x46;	// 设置光标地址
	LCD_DAT_ADR=(uchar)k;	 //	计算光标地址
	LCD_DAT_ADR=(uchar)(k>>8);

	LCD_CMD_ADR=0x42;	// MWRITE 代码
	LCD_DAT_ADR=dat|j;  // 写入合成数据
}

// 函数功能: 画水平线
// 纵坐标: 固定为 y
// x1: 起始横坐标; x2: 终点横坐标
void draw_horizontal(int x1,int x2,uchar y)
{
	uint idata i;
	
	for(i=x1;i<=x2;i++)
		draw_dot(i,y);
}

// 函数功能: 画垂直线
// 横坐标: 固定为 x
// y1: 起始纵坐标; y2: 终点纵坐标
void draw_vertical(uchar y1,uchar y2,int x)
{
	uchar idata i;
	
	for(i=y1;i<=y2;i++)
		draw_dot(x,i);
}

// 函数功能:画任意斜率的直线
// 起点坐标: x1:(0~319),y1:(0~239)
// 终点坐标: x2:(0~319),y2:(0~239)
void draw_bias(int x1,uchar y1,int x2,uchar y2)
{
	uint idata i;
	int  idata err=0;
	int  idata delta_x,delta_y;
	
	if(y2<y1)	// 此步骤使起点纵坐标小于等于终点纵坐标
	{	err=x1;
		x1=x2;
		x2=err;
		
		i=y1;
		y1=y2;
		y2=(uchar)i;
	}
	
	delta_x=x2-x1;
	delta_y=(int)(y2-y1);
	
	if(delta_x>=0)
	{	if(delta_y<=delta_x)	// 斜率 K:0~1
		{	for(i=x1;i<x2;i++)
			{	draw_dot(x1,y1);
				x1++;
				if(err<0)
					err+=delta_y;
				else
				{	y1++;
					err=err+delta_y-delta_x;
				}
			}
		}
		else				// 斜率 K>1
		{	for(i=y1;i<y2;i++)
			{	draw_dot(x1,y1);
				y1++;
				if(err<0)
				{	x1++;
					err=err+delta_y-delta_x;
				}
				else
					err-=delta_x;
			}
		}
	}
	else if(delta_x<0)
	{	delta_x=0-delta_x;
		
		if(delta_y<=delta_x)	// 斜率 K: -1~0
		{	for(i=x1;i>x2;i--)
			{	draw_dot(x1,y1);
				x1--;
				if(err<0)
					err+=delta_y;
				else
				{	y1++;
					err=err+delta_y-delta_x;
				}
			}
		}
		else			// 斜率 K < -1
		{	for(i=y1;i<y2;i++)
			{	draw_dot(x1,y1);
				y1++;
				if(err<0)
				{	x1--;
					err=err+delta_y-delta_x;
				}
				else
					err-=delta_x;
			}
		}		
	}
}


/*void draw_line(int startx,uchar starty,int endx,uchar endy)
{
	register char t,distance;
	int xerr=0,yerr=0,delta_x,
	char delta_y;
	char incx,incy;

//  compute the distance in both directions
	delta_x=endx-startx;
	delta_y=endy-starty;

// compute  the direction of the increment ,
// an increment of "0" means either a vertical or horizontal lines 

	if(delta_x>0) 
		incx=1;
	else if( delta_x==0 ) 
		incx=0;
	else incx=-1;


	if(delta_y>0) 
		incy=1;
	else if( delta_y==0 ) 
		incy=0;
	else incy=-1;

//  determine which distance is greater
	delta_x = cabs( delta_x );	// 取绝对值
	delta_y = cabs( delta_y );

	if( delta_x > delta_y ) 
		distance=delta_x;
	else distance=delta_y;

//draw the line 
	for( t=0;t <= distance+1; t++ ) 
	{
		draw_dot(startx,starty);
      	xerr += delta_x;
		yerr += delta_y;
		
		if( xerr > distance ) 
		{
			xerr-=distance;
      		startx+=incx;
		}
		if( yerr > distance ) 
		{
			yerr-=distance;
      		starty+=incy;
		}
	}
}
*/


// 函数功能:画圆
// 圆心坐标: x0,y0
// 半径:	 radius
// 说明:为了不使画圆速度太慢,没有对坐标位置是否超出屏幕范围做判断
//		所以在调用时,应该保证圆周上点的坐标不会超出显示屏幕,否则可能得到错误的显示
void draw_circle(int x0,uchar y0,uchar radius)
{
	long  idata delta1,delta2;
	int   idata x1,x2,tempx;
	uchar idata y1,y2,tempy;
	
	x1=0;
	y1=radius;
	x2=(int)radius;
	y2=0;
	
	draw_dot(x1+x0,y1+y0);
	draw_dot(x2+x0,y2+y0);
	draw_dot(x1+x0,y0-y1);
	draw_dot(x0-x2,y2+y0);
	
	while(1)
	{
		delta1=(x1+1)*(x1+1)+(y1+radius)*(y1-radius)-y1;
		x1++;
		if(delta1>0)
			y1--;
		draw_dot(x1+x0,y1+y0);	// 画第 1 象限 45°~90°  圆弧
		tempx=x0-x1;
		tempy=y0-y1;
		draw_dot(tempx,y1+y0);	// 镜像画第 2 象限 90°~135°  圆弧
		draw_dot(tempx,tempy);	// 镜像画第 3 象限 225°~270° 圆弧
		draw_dot(x1+x0,tempy);	// 镜像画第 4 象限 270°~315° 圆弧
		if(y1==y2)
			break;

		delta2=(y2+1)*(y2+1)+(x2+radius)*(x2-radius)-x2;
		y2++;
		if(delta2>0)
			x2--;
		draw_dot(x2+x0,y2+y0);	// 画第 1 象限 0°~45°  圆弧
		tempx=x0-x2;
		tempy=y0-y2;
		draw_dot(tempx,y2+y0);	// 镜像画第 2 象限 135°~180° 圆弧
		draw_dot(tempx,tempy);	// 镜像画第 3 象限 180°~225° 圆弧
		draw_dot(x2+x0,tempy);	// 镜像画第 4 象限 315°~360° 圆弧
		if(y1==y2)
			break;
	}
}

⌨️ 快捷键说明

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