【龙芯1B】:龙芯1B200字号修改程序(基于龙芯1B200)

嵌入式芯片与系统设计竞赛开发板


 项目场景:

        由于龙芯的资料很少,于是想普及一下龙芯1B的字号修改例程。希望对大家有所帮助,如有不妥之处,可联系博主!一切的资源都是为了传播学习,让大家都能学会,这才是目的

        本文技术开发板支持的是 全国职业技能大赛-嵌入式赛项  及   嵌入式芯片与系统设计竞赛(高职高专组)

        板子支持由百科荣创公司(公司很好,可以建议去实习)!!!


问题描述&解决方案:

        字号修改,可变大变小,修改字体颜色。

/**
  * @file   lkdGuiBasic.c
  * @author  guoweilkd
  * @version V1.1.0
  * @date    2018/03/19
  * @brief  lkdGui基本函数库
  */
  
#include "lkdGui.h"

uint8_t const GetBit[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
/**
  *@brief 画点
  *@param  x,y 坐标
  *@param  color 颜色
  *@retval None
  */
void GuiPoint(lkdCoord x, lkdCoord y, lkdColour color)
{
	/* 坐标检测 */
	if(x >= GUIXMAX || y >= GUIYMAX || x < 0 || y < 0)
		return;
	GuiDrawPoint(x, y, color);
}

/**
  *@brief 画斜线
  *@param  x,y 坐标
  *@param  color 颜色
  *@retval None
  */
void GuiBiasLine(lkdCoord x0, lkdCoord y0,\
	lkdCoord x1, lkdCoord y1, lkdColour color)
{
	float offset,tf;	
	lkdCoord tempCoord;
	
	if(x0 > x1){
		tempCoord = x1;
		x1 = x0;
		x0 = tempCoord;
		tempCoord = y1;
		y1 = y0;
		y0 = tempCoord;
		
	}
	
	/* 坐标检查 */
	if(y0 >= GUIYMAX || x0 >= GUIXMAX || y1 < 0 || x1 < 0){
		return;
	}
	if(x1 >= GUIXMAX){
		x1 = GUIXMAX - 1;
	}
	if(y1 >= GUIYMAX){
		y1 = GUIYMAX - 1;
	}
	if(x0 < 0){
		x0 = 0;
	}
	if(y0 < 0){
		y0 = 0;
	}
	if(x0 == x1){
		GuiRPointLine(x0,y0,y1,1,color);
	}
	else if(y0 == y1){
		GuiHPointLine(x0,y0,x1,1,color);
	}
	else if(y1 - y0 > 0){
		if((y1 - y0) < (x1 - x0)){
			tf = y0;
			offset = ((float)(y1 - y0))/(x1 - x0);
			while(1){
				GuiDrawPoint(x0, (lkdCoord)tf, color);
				x0 ++;
				tf += offset;
				if(tf > y1){
					tf = y1;
				}
				if(x0 > x1){
					break;
				}
			}
		}
		else{
			tf = x0;
			offset = ((float)(x1 - x0))/(y1 - y0);
			while(1){
				GuiDrawPoint((lkdCoord)tf, y0, color);
				y0 ++;
				tf += offset;
				if(x0 > x1){
					x0 = x1;
				}
				if(y0 > y1){
					break;
				}
			}
		}
	}
	else{
		if((y0 - y1) < (x1 - x0)){
			tf = y0;
			offset = ((float)(y0 - y1))/(x1 - x0);
			while(1){
				GuiDrawPoint(x0, (lkdCoord)tf, color);
				x0 ++;
				tf -= offset;
				if(tf <= y1){
					tf = y1;
				}
				if(x0 > x1){
					break;
				}
			}
		}
		else{
			tf = x0;
			offset = ((float)(x1 - x0))/(y0 - y1);
			while(1){
				GuiDrawPoint((lkdCoord)tf, y0, color);
				y0 --;
				tf += offset;
				if(tf > x1){
					tf = x1;
				}
				if(y0 <= y1){
					break;
				}
			}
		}
	}
}
/**
  *@brief 画水平点线
  *@param  x0,y0 起始坐标
  *@param  x1 结束坐标
  *@param  interval 每隔N点画一个点
  *@param  color 颜色
  *@retval None
  */
void GuiHPointLine(lkdCoord x0, lkdCoord y0,\
	lkdCoord x1, uint8_t interval, lkdColour color)
{
	lkdCoord tx;
	
	if(x0 > x1){//检查,交换-> x0 < x1
		tx = x1;
		x1 = x0;
		x0 = tx;
	}
	
	/* 坐标检查 */
	if(y0 < 0 || y0 >= GUIYMAX){
		return;
	}
	if(x1 < 0){
		return;
	}
	if(x0 >= GUIXMAX){
		return;
	}
	if(x1 >= GUIXMAX){
		x1 = GUIXMAX - 1;
	}
	if(x0 < 0){
		x0 = 0;
	}
	
	/* 画线 */
	if(x0 == x1){
		GuiDrawPoint(x0, y0, color);
		return;
	}
	while(1){
		GuiDrawPoint(x0, y0, color);
		x0 += interval;
		if(x0 > x1){
			break;
		}
	}
}

/**
  *@brief 画垂直点线
  *@param  x0,y0 起始坐标
  *@param  y1 结束坐标
  *@param  interval 每隔N点画一个点
  *@param  color 颜色
  *@retval None
  */
void  GuiRPointLine(lkdCoord x0, lkdCoord y0,\
	lkdCoord y1,uint8_t interval, lkdColour color)
{
	lkdCoord ty;
	if(y0 > y1){//检查,交换-> y0 < y1
		ty = y1;
		y1 = y0;
		y0 = ty;
	}
	
	/* 坐标检查 */
	if(x0 < 0 || x0 >= GUIXMAX){
		return;
	}
	if(y1 < 0){
		return;
	}
	if(y0 >= GUIYMAX){
		return;
	}
	if(y1 >= GUIYMAX){
		y1 = GUIYMAX - 1;
	}
	if(y0 < 0){
		y0 = 0;
	}
	
	/* 画线 */
	if(y0 == y1){
		GuiDrawPoint(x0, y0, color);
		return;
	}
	while(1){
		GuiDrawPoint(x0, y0, color);
		y0 += interval;
		if(y0 > y1){
			break;
		}
	}
}
/**
  *@brief 画水平线
  *@param  x0,y0 起始坐标
  *@param  x1结束坐标
  *@param  color 颜色
  *@retval None
  */
void GuiHLine(lkdCoord x0, lkdCoord y0, lkdCoord x1, lkdColour color)
{
	GuiHPointLine(x0, y0, x1, 1, color);
}

/**
  *@brief 画垂直线
  *@param  x0,y0 起始坐标
  *@param  y1 结束坐标
  *@param  color 颜色
  *@retval None
  */
void  GuiRLine(lkdCoord x0, lkdCoord y0, lkdCoord y1, lkdColour color)
{
	GuiRPointLine(x0, y0, y1, 1, color);
}

/**
  *@brief 画矩形
  *@param  x0,y0 起始坐标
  *@param  x1,y1 结束坐标
  *@param  color 颜色
  *@retval None
  */
void GuiRect(lkdCoord x0, lkdCoord y0, lkdCoord x1,lkdCoord y1, lkdColour color)
{
	GuiHPointLine(x0, y0, x1, 1, color);
	GuiHPointLine(x0, y1, x1, 1, color);
	GuiRPointLine(x0, y0, y1, 1, color);
	GuiRPointLine(x1, y0, y1, 1, color);
}

/**
  *@brief 画填充矩形
  *@param  x0,y0 起始坐标
  *@param  x1,y1 结束坐标
  *@param  color 颜色
  *@retval None
  */
void GuiFillRect(lkdCoord x0, lkdCoord y0, lkdCoord x1,lkdCoord y1, lkdColour color)
{
	lkdCoord i;	
	lkdCoord tempCoord;
	
	if(y0 > y1){//排序
		tempCoord = y1;
		y1 = y0;
		y0 = tempCoord;
	}
	if(x0 > x1){
		tempCoord = x1;
		x1 = x0;
		x0 = tempCoord;
	}
	for(i = y0; i<= y1; i++){
		GuiHPointLine(x0, i, x1, 1, color);
	}
}

/**
  *@brief 画位图
  *@param  bitMap 位图数组
  *@param  x0,y0 起始坐标
  *@param  xlen,ylen 宽度和高度
  *@param  flag 0 正常显示 1反显
  *@retval None
  */
void GuiBitMap(uint8_t *bitMap,lkdCoord x0,\
	lkdCoord y0,uint32_t xlen,uint32_t ylen, uint8_t flag)
{
	uint8_t z,zMax;
	lkdColour colour;
	uint32_t i,j,tj,tx,eachRow;
	
	if(x0 < 0 || y0 < 0 || x0 >= GUIXMAX || y0 >= GUIYMAX){
		return;
	}
	/* 列像素单位为字节 */
	if(xlen%8 != 0){
		eachRow = xlen/8 + 1;
	}
	else{
		eachRow = xlen/8;
	}
	/* 检查坐标最大,超过不显示 */
	if(x0 + xlen >= GUIXMAX){
		xlen = GUIXMAX - x0 - 1;
	}
	if(y0 + ylen >= GUIYMAX){
		ylen = GUIYMAX - y0 - 1;
	}
	/* 画图 */
	for(j = 0; j < ylen; j++){
		tj = eachRow * j;
		zMax = 8;
		for(i = 0; i < xlen; i += 8){
			if(i + 8 >= xlen){
				zMax = xlen - i;
			}
			tx = i/8;
			for(z = 0; z < zMax; z++){//位处理
				colour = (bitMap[tj + tx]&GetBit[z])?CBLACK:CWHITLE;
				if(flag){//反显处理
					colour = colour?CWHITLE:CBLACK;
				}
				GuiDrawPoint(x0 + i + z,y0 + j,colour);
			}
		}
	}
}

/**
  *@brief 画指定范围的位图
  *@param  bitMap 位图数组
  *@param  x0,y0 起始坐标
  *@param  endx,endy 终点坐标
  *@param  flag 0 正常显示 1反显
  *@retval None
  */
void GuiAreaBitMap(lkdBitmap *bitMap,\
	lkdCoord x0, lkdCoord y0, lkdCoord endx, lkdCoord endy, uint8_t flag)
{
	lkdCoord tcoord;
	lkdColour colour;
	uint8_t str,z,zMax,tflag = 0;
	uint16_t rowWide,i,j,yNum,xNum,tx;
	uint32_t tj;
	if(x0 >= GUIXMAX || y0 >= GUIYMAX || endx >= GUIXMAX || endy >= GUIYMAX ||\
		 x0 < 0 || y0 < 0 || endx < 0 || endy < 0 || endx == x0 || endy == y0 ||\
		 bitMap->beginx >= bitMap->wide || bitMap->beginy >= bitMap->high)
	{
		return;
	}
	if(x0 > endx){
		tcoord = x0;
		x0 = endx; 
		endx = tcoord;
	}
	if(y0 > endy){
		tcoord = y0;
		y0 = endy; 
		endy = tcoord;
	}
	if(bitMap->wide - bitMap->beginx < endx - x0){
		endx = bitMap->wide - bitMap->beginx + x0;
	}
	if(bitMap->high - bitMap->beginy < endy - y0){
		endy = bitMap->high - bitMap->beginy + y0;
	}

	/* 列像素单位为字节 */
	rowWide = bitMap->wide / 8;
	if(bitMap->wide % 8 != 0){
		rowWide = rowWide + 1;
	}

	/* 处理开始不对齐部分  */
	xNum = endx - x0;
	yNum = endy - y0;
	z = bitMap->beginx % 8;
	if(z != 0){
		if(xNum + z >= 8){
			zMax = 8;
		}
		else{
			zMax = xNum + z;
		}
		tj = rowWide * bitMap->beginy;
		tx = bitMap->beginx / 8;
		for(j = 0; j < yNum; j ++){
			str = bitMap->bitmap[tj + tx];
			z = bitMap->beginx % 8;
			for( ; z < zMax; z ++){
				colour = (str & GetBit[z]) ? CBLACK : CWHITLE;
				if(flag){//反显处理
					colour = colour ? CWHITLE : CBLACK;
				}
				GuiDrawPoint(x0 + z,y0 + j,colour);
			}
			tj += rowWide;
		}
		tflag = 1;
	}
	/* 处理其他部分  */
	tx = tflag + bitMap->beginx / 8;
	tj = rowWide * bitMap->beginy;
	if(bitMap->beginx % 8){
		x0 += (8 - bitMap->beginx % 8);
	}
	xNum = endx - x0;
	for(j = 0; j < yNum; j ++){
		for(i = 0; i < xNum; i += 8){
			zMax = 8;
			str = bitMap->bitmap[tj + tx + i / 8];
			if(i + 8 >= xNum){
				zMax = xNum - i;
			}
			for(z = 0 ; z < zMax; z ++){
				colour = (str & GetBit[z]) ? CBLACK : CWHITLE;
				if(flag){//反显处理
					colour = colour ? CWHITLE : CBLACK;
				}
				GuiDrawPoint(x0 + i + z,y0 + j,colour);
			}
		}
		tj += rowWide;
	}
}

void GuiAreaBitMapNumber(lkdBitmap *bitMap,uint8_t number,\
	lkdCoord x0, lkdCoord y0, lkdCoord endx, lkdCoord endy, uint8_t flag)
{
	GuiAreaBitMap(bitMap,x0, y0, endx, endy, flag);
}

/* END */

        由于文件太多,所以没有全部贴出来,就直接贴工程。

        工程链接:龙芯1B200字号


联系我们

        公众号:嵌入式up


认清自己往往比轻视别人更重要。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值