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

📄 main.c

📁 使用LPC2131控制KM12864液晶显示屏实现绘图功能
💻 C
📖 第 1 页 / 共 2 页
字号:
		{
			lcd_draw_switch(0);
      		
    		lcd_write(1,0x80+j);
    		lcd_write(1,0x80+i);
    		lcd_write(2,(display_ram[i][j] & 0xff00)>>8);
    		lcd_write(2,(display_ram[i][j] & 0x00ff));       		
      	
    		lcd_draw_switch(1);
    	}
    }
}
//此处要实现的功能是使用将点的坐标转换为显示缓存中相应的数据位
//描述:输入x的范围为0-127,y的范围是0-63
//mode:显示模式 1-实点 0-虚点 -1-取反点
void display_dot(uint8 x, uint8 y, int8 mode)
{
	//首先确定需要对哪一个数据进行修改?
	uint8 i,j,bx; 
	
	i = x>>4;
	j = y;
	if(y >31)
	{
		i = i+8;
		j = j-32;
	}
	
	//对这个存储器的第几位进行修改?	
	bx = 15 - x%16;
	
	if(mode == 1)
	{
		display_ram[i][j] |= (1<<bx);
	}
	else if(mode == 0)
	{
		display_ram[i][j] &= ~(1<<bx);
	}
	else if(mode == -1)
	{
		display_ram[i][j] ^= (1<<bx);
	}
}
//根据给定的2个点(x1,y1)和(x2,y2)画一条直线
//mode,线段的模式,1表示实线,0表示虚点连成的线(黑线),-1表示点画线(虚线)
//画虚线采用的是连续4个实心点,然后一个空格点,一个实心点,一个空格,接着3个实心点,继续
void display_line(uint8 x1, uint8 y1, uint8 x2, uint8 y2, int8 mode)
{
	uint8 i,count=0;
	
	double k=0.0;//线段的斜率
	
	if(x1 == x2)//垂线
	{
		if(y1 <= y2)
		{
			for(i=y1;i<=y2;i++)
			{
				if(mode == 1 || mode == 0)
					display_dot(x1,i,mode);
				else//画虚线
					{count++;
					if(count <= 4)display_dot(x1,i,1);
					else if(count == 5)display_dot(x1,i,0);
					else if(count == 6)display_dot(x1,i,1);
					else if(count == 7)
					{display_dot(x1,i,0);
					 count = 0;}
					 }					
			}
		}
		else
		{
			for(i=y2;i<=y1;i++)
			{
				if(mode == 1 || mode == 0)
					display_dot(x1,i,mode);
				else//画虚线
					{count++;
					if(count <= 4)display_dot(x1,i,1);
					else if(count == 5)display_dot(x1,i,0);
					else if(count == 6)display_dot(x1,i,1);
					else if(count == 7)
					{display_dot(x1,i,0);
					 count = 0;}
					 }
			}
		}
		
		return;
	}
	
	else if(y1 == y2)//水平线
	{
		if(x1 <= x2)
		{
			for(i=x1;i<=x2;i++)
			{
				if(mode == 1 || mode == 0)
					display_dot(i,y1,mode);
				else//画虚线
					{count++;
					if(count <= 4)display_dot(i,y1,1);
					else if(count == 5)display_dot(i,y1,0);
					else if(count == 6)display_dot(i,y1,1);
					else if(count == 7)
					{display_dot(i,y1,0);
					 count = 0;}
					 }
			}
		}
		else
		{
			for(i=x2;i<=x1;i++)
			{
				if(mode == 1 || mode == 0)
					display_dot(i,y1,mode);
				else//画虚线
				{
					count++;
					if(count <= 4)display_dot(i,y1,1);
					else if(count == 5)display_dot(i,y1,0);
					else if(count == 6)display_dot(i,y1,1);
					else if(count == 7)
					{display_dot(i,y1,0);
					 count = 0;}
					 }
			}
		}
		
		return;
	}
	
	else
	{
		//一般的直线
		k = (y2 - y1)*1.0/(x2 - x1);
			
		if(x1 <= x2)
		{
			for(i=x1;i<=x2;i++)
			{
				if(mode == 1 || mode == 0)
					display_dot(i,(uint8)(k*(i-x1)+y1),mode);
				else//画虚线
					{
					count++;
					if(count <= 4)display_dot(i,(uint8)(k*(i-x1)+y1),1);
					else if(count == 5)display_dot(i,(uint8)(k*(i-x1)+y1),0);
					else if(count == 6)display_dot(i,(uint8)(k*(i-x1)+y1),1);
					else if(count == 7)
					{display_dot(i,(uint8)(k*(i-x1)+y1),0);
					 count = 0;}
					 }
			}
		}
		else
		{
			for(i=x2;i<=x1;i++)
			{
				if(mode == 1 || mode == 0)
					display_dot(i,(uint8)(k*(i-x2)+y2),mode);
				else//画虚线
					count++;
					if(count <= 4)display_dot(i,(uint8)(k*(i-x1)+y1),1);
					else if(count == 5)display_dot(i,(uint8)(k*(i-x1)+y1),0);
					else if(count == 6)display_dot(i,(uint8)(k*(i-x1)+y1),1);
					else if(count == 7)
					{display_dot(i,(uint8)(k*(i-x1)+y1),0);
					 count = 0;}
			}
		}
	}
}

void lcd_all_dark(void)
{
	uint8 i,j;
	
	for(i=0;i<16;i++)
        {for(j=0;j<32;j++)
        {
    	display_ram[i][j] = 0x0000;
    	}
    	}          
}

//根据给定的原点坐标和x,y轴的单位长度,画出一个坐标轴系来
void lcd_draw_referenceframe(uint8 origin_x, uint8 origin_y, uint8 unit_x, uint8 unit_y)
{
	uint8 i;
	
	//先画2条x和y轴,实线
	display_line(0,origin_y,127,origin_y,1);
	display_line(origin_x,0,origin_x,63,1);
	//再画网格状的虚线
	//先画横着的虚线
	for(i=0;i<64;i++)
	{
		if((i-origin_y)%unit_y == 0 && i != origin_y)
		{
			display_line(0,i,127,i,-1);
		}
	}
	//再画竖着的虚线
	for(i=0;i<128;i++)
	{
		if((i-origin_x)%unit_x == 0 && i !=  origin_x)
		{
			display_line(i,0,i,63,-1);
		}
	}
}


//根据给定的输入数组,显示出整个扫频曲线
void lcd_draw_curve(float input[2][10],uint8 origin_x,uint8 origin_y,uint8 unit_x,uint8 unit_y,uint8 unit_x_value,uint8 unit_y_value)
{
	//首先计算这些扫描过来的点在显示屏幕上的坐标
	uint8 dot_xy[10][2];
	
	uint8 i;
	
	for(i=0;i<10;i++)
	{
		//x坐标
		dot_xy[i][0] = origin_x + unit_x*input[0][i]/unit_x_value;
		//y坐标
		dot_xy[i][1] = origin_y + unit_y*input[1][i]/unit_y_value;
	}
	
	//将这一系列的点组成的线绘制出来
	for(i=0;i<9;i++)
	{
		display_line(dot_xy[i][0],dot_xy[i][1],dot_xy[i+1][0],dot_xy[i+1][1],1);
	}
	
	display_line(dot_xy[8][0],dot_xy[8][1],dot_xy[9][0],dot_xy[9][1],1);
}

int main (void)
{
	
	uint8 i,j;
	
	//输入的信息,需要显示的信息,第一行对应频率,单位k,第二行对应增益,单位db
	float input[2][10] = {{0,1,2,3,4,5,6,7,8,9},{10,5,2,2,2,2,2,3,5,8}};
	
	//原点的坐标,x和y轴的1个单位对应多少个点?x轴为频率1k,y轴为增益-10db
	uint8 origin_x=1,origin_y=1,unit_x=48,unit_y=48,unit_x_value = 4,unit_y_value = 8;
	
	PINSEL1 &= ~0x80;
	IO1DIR |= 1 << 24;
	IO1SET |= 1 << 24;
    lcd_init();
    
    
    
    lcd_all_dark();//屏幕全部变黑
    
    display_all();
    
    lcd_draw_referenceframe(origin_x,origin_y,unit_x,unit_y);//画出坐标轴
    
    display_all();
    
    lcd_draw_curve(input,origin_x,origin_y,unit_x,unit_y,unit_x_value,unit_y_value);
    
    display_all();
    	   	
}
/*********************************************************************************************************
End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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