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

📄 tuxing.h

📁 在ARM中实现图片、文字的转换
💻 H
字号:
#include <stdio.h>

#include "710defs.h"
#include "HB_it.h"
#include "main.h"
#include "lcd_pattern.h"
double sinc[128]={

0.000000,0.098017,0.195090,0.290285,0.382683,
0.471397,0.555570,0.634393,0.707107,0.773010,
0.831470,0.881921,0.923880,0.956940,0.980785,
0.995185,1.00000,0.995185,0.980785,0.956940,
0.923880,0.881921,0.831470,0.773010,0.707107,
0.634393,0.555570,0.471397,0.382683,0.290285,
0.195090,0.098017,0.000000,-0.098017,-0.195090,
-0.290285,-0.382683,-0.471397,-0.555570,-0.634393,
-0.707107,-0.773010,-0.831470,-0.881921,-0.923880,
-0.956940,-0.980785,-0.995185,-1.00000,-0.995185,
-0.980785,-0.956940,-0.923880,-0.881921,-0.831470,
-0.773011,-0.707107,-0.634393,-0.555570,-0.471397,
-0.382684,-0.290285,-0.195090,-0.098017,-0.000000,
0.098017,0.195090,0.290285,0.382683,0.471397,
0.555570,0.634393,0.707107,0.773010,0.831470,
0.881921,0.923879,0.956940,0.980785,0.995185,
1.00000,0.995185,0.980785,0.956940,0.923880,
0.881921,0.831470,0.773011,0.707107,0.634393,
0.555570,0.471397,0.382684,0.290285,0.195090,
0.098017,0.000000,-0.098017,-0.195090,-0.290285,
-0.382683,-0.471397,-0.555570,-0.634393,-0.707107,
-0.773010,-0.831470,-0.881921,-0.923879,-0.956940,
-0.980785,-0.995185,-1.00000,-0.995185,-0.980785,
-0.956940,-0.923880,-0.881921,-0.831470,-0.773011,
-0.707107,-0.634393,-0.555570,-0.471397,-0.382684,
-0.290285,-0.195091,-0.098017,
};

int main(void)
{	
	PUINT8 LcdBuffer;
	LCD_IMAGE_T LCD_Size;
	LCD_LOCATION_T LCD_Location;
	
	U32 Loop,j=0;
	U32 ClearLoop;
	U32 i,sinb[256];
	
	for(i=0;i<256;i++)
	  {
	     sinb[i] = sinc[i]*100+100;
	  }   
	
	for(ClearLoop = 0; ClearLoop < 230400; ClearLoop++)
    	{
    		BlackBoard[ClearLoop] =0x5;
    	}
	LCD_Size.width = 480;
	LCD_Size.height = 240;
	
	LCD_Location.StartX = 0;
	LCD_Location.StartY = 0;
	LCD_Location.EndX = 960;
	LCD_Location.EndY = 240;
	
	LCDInit();
	LCDShow(LCD_Size, LCD_Location);	

	while(1)
	{
		//显示LOGO
		LCDFIFOBufferSet(ImageNEU);		
		LCDDisplayOn();
		Delay(20000000);
		LCDDisplayOff();	
		
		//测试各种画图函数
	
        	    
		LCDFIFOBufferSet(BlackBoard);
		LCDDisplayOn();
	   
	   while(1){
	    if(j>56)
	      j=0; 
		Loop = 0;
		do
		{
		    LCDLine(400 - Loop<<1,sinb[(Loop+j)%128],399 - Loop<<1,sinb[(Loop+j+1)%128],0xff,BlackBoard);
		   //LCDDotOne(400 - Loop,sinb[(Loop+j)%256],0xff,BlackBoard);
		    Loop++;
		}while(Loop<127);
		Delay(200000);
		Loop=0;
		do
		{
		    LCDLine(400 - Loop<<1,sinb[(Loop+j)%128],399 - Loop<<1,sinb[(Loop+j+1)%128],0x5,BlackBoard);
		   //LCDDotOne(400 - Loop,sinb[(Loop+j)%256],0x5,BlackBoard);
		    Loop++;
		}while(Loop<127);
		
		
		j++;
		
	}
		
		
		//画20个点
		Loop = 20;
		do
    	{
    		LCDDotOne(40 + 20 * Loop, 220,0xff, BlackBoard);
    		Delay(1000000);
        	Loop--;
    	}while(Loop);
    	
    	//画15条线
    	Loop = 15;
		do
    	{
    		LCDLine(440, 125 + 1 * Loop, 40, 125 + 5 * Loop,0xff, BlackBoard);
    		Delay(1000000);
       		Loop--;
    	}while(Loop);
    	
    	//画5个椭圆
    	Loop = 5;
		do
    	{
    		LCDCircle(80 * Loop, 65, 30,0xff, BlackBoard);
    		Delay(1000000);
       		Loop--;
    	}while(Loop);
    	
    	Delay(10000000);
    	    	
    	LCDDisplayOff();
    	for(ClearLoop = 0; ClearLoop < 230400; ClearLoop++)
    	{
    		BlackBoard[ClearLoop] =0;
    	}
	}
	return 0;
}


/*******************************************************************************
* Function Name  : LCDInit
* Description    : LCD初始化
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCDInit(void)
{
	REG_GPIO_CFG6 = 0x555555;
	
	REG_LCD_LCDCON = 0x30c05;
	REG_LCD_FIFO1PRM = 0xa;
	
	REG_LCD_F1DREQCNT = 0x1e000f0;
	REG_LCD_FIFO1RELACOLCNT = 0x1e0;
	//LCD CLK
	REG_LCD_LCDTCON1 = 0x3b166; 
	REG_LCD_LCDTCON2 = 0x3bf00f1;
	REG_LCD_LCDTCON3 = 0x105401;
	REG_LCD_LCDTCON4 = 0x20101;
	REG_LCD_LCDTCON5 = 0xe;
}

/*******************************************************************************
* Function Name  : LCDShow
* Description    : 设置LCD显示位置
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCDShow(LCD_IMAGE_T Size, LCD_LOCATION_T Location)
{
	REG_LCD_F1DREQCNT = (Size.width <<15 ) + Size.height;
	REG_LCD_FIFO1RELACOLCNT = (Size.width >> 1);
	
	REG_LCD_DISPWINS = (Location.StartY << 16) + Location.StartX;
	REG_LCD_DISPWINE = (Location.EndY << 16) + Location.EndX;
}

/*******************************************************************************
* Function Name  : LCDShow
* Description    : 设置LCD显示位置
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCDFIFOBufferSet(PUINT8 Buffer)
{
	REG_LCD_F1SADDR = (U32) Buffer;
}

/*******************************************************************************
* Function Name  : LCDDisplayOn
* Description    : 打开LCD
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCDDisplayOn(void)
{
	lcdIoctl(1, 1, 0);
}

/*******************************************************************************
* Function Name  : LCDDisplayOff
* Description    : 关闭LCD
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCDDisplayOff(void)
{
	lcdIoctl(1, 2, 0);
//	REG_LCD_LCDCON &= 0xfeffffff;
}


/*******************************************************************************
* Function Name  : Delay
* Description    : 用于不精确延时
* Input          : 延时时间
* Output         : None
* Return         : None
*******************************************************************************/
void Delay(U32 t)
{
    do
    {
        t--;
    }while(t);
}

/*******************************************************************************
* Function Name  : LCDDotOne
* Description    : 画任意点函数
* Input          : x:横坐标(0-480)
				   y:纵坐标(0-240) 
				   Buffer:LCD缓冲区首地址
* Output         : None
* Return         : None
*******************************************************************************/
void LCDDotOne(U32 x, U32 y,U32 color,PUINT8 Buffer)
{
	PUINT8 temp = Buffer;
	* (temp + ((480 * y + x) << 1)) = color;
	* (temp + (((480 * y + x) << 1) + 1)) = color;
}

/*******************************************************************************
* Function Name  : LCDLine
* Description    : 输入两点坐标,用Bresenham算法绘制直线
* Input          : x1,x2:横坐标(0-480)
				   y1,y2:纵坐标(0-240)
				   Buffer:LCD缓冲区首地址
* Output         : None
* Return         : None
*******************************************************************************/
void LCDLine(U32 x1, U32 y1, U32 x2, U32 y2,U32 color, PUINT8 LBuffer)
{
    U32 xa, ya, xb, yb;
	S32 i, dx, dy, pk, towdx, towdy, towdydx;
	if(x1 > x2)
    {
        xa = x2;
        ya = y2;
        xb = x1;
        yb = y1;
    }
    else
    {
        xa = x1;
        ya = y1;
        xb = x2;
        yb = y2;
    }
    dx = xb - xa;
    dy = yb - ya;
    
    if(dy >= 0)
    {
        towdy = dy<<1;
        towdx = dx<<1;
        towdydx = (dy-dx) << 1;
		LCDDotOne(xa, ya,color, LBuffer);
        if(abs(dx) >= abs(dy))
        {
            pk = (dy << 1) - dx;
            for(i = 0; i < abs(dx); i++)
            {
                xa++;
                if(pk > 0)
                {
                    ya++;
                    pk += towdydx;
                }
                else
                {
                    pk += towdy;
                }
                LCDDotOne(xa, ya,color, LBuffer);
            }
        }
        else
        {
            pk=((dx+dy)<<1)-1;
			LCDDotOne(xa, ya,color, LBuffer);
            for(i=0;i<abs(dy);i++)
            {
                ya++;
                if(pk>0)
                {
                    xa++;
                    pk-=towdydx;
                }
                else
                {
                    pk+=towdx;
                }
                LCDDotOne(xa, ya,color, LBuffer);
            }
        }
    }
    else
    {
        towdy=(-1) * (dy << 1);
        towdx=(-1) * (dx << 1);
        towdydx=(-1) * ((dx + dy) << 1);
		LCDDotOne(xa, ya,color, LBuffer);
		if(abs(dx) >= abs(dy))
        {
            pk=(-1) * dx;
            for(i = 0; i < abs(dx); i++)
            {
                xa++;
                if(pk > 0)
                {
                    ya--;
                    pk += towdydx;
                }
                else
                {
                    pk += towdy;
                }
                LCDDotOne(xa, ya,color, LBuffer);
            }
        }
        else
        {
            pk=((dx + dy) << 1) + 1;
            LCDDotOne(xa, ya,color, LBuffer);
            for(i = 0; i < abs(dy); i++)
            {
                ya--;
                if(pk > 0)
                {
                    xa++;
                    pk -= towdydx;
                }
                else
                {
                    pk -= towdx;
                }
                LCDDotOne(xa, ya,color, LBuffer);
            }
        }
    }
}

/*******************************************************************************
* Function Name  : LCDCircle
* Description    : 输入圆心坐标和半径,用图形学中的一种算法画出圆
* Input          : x_center:横坐标(0-480)
				   y_center:纵坐标(0-240) 
				   radius:半径
				   Buffer:LCD缓冲区首地址
* Output         : None
* Return         : None
*******************************************************************************/
void LCDCircle(U32 x_center, U32 y_center, U32 radius,U32 color, PUINT8 CBuffer)
{
    S32 x;
    S32 y, delta;
    y = radius;

    delta = 3 - (radius << 1);

    for (x = 0; x <= y; x++)
    {
        LCDDotOne(x+x_center, y+y_center,color, CBuffer);
        LCDDotOne(x+x_center, -y+y_center,color, CBuffer);
        LCDDotOne(-x+x_center, -y+y_center,color, CBuffer);
        LCDDotOne(-x+x_center, y+y_center,color, CBuffer);
        LCDDotOne(y+x_center, x+y_center,color, CBuffer);
        LCDDotOne(y+x_center, -x+y_center,color, CBuffer);
        LCDDotOne(-y+x_center, -x+y_center,color, CBuffer);
        LCDDotOne(-y+x_center, x+y_center,color, CBuffer);
        if (delta < 0)
        {
            delta += (x << 2) + 6;
        }
        else
        {
            delta += ((x - y) << 2) + 10;
            y--;
        }
    }
}

⌨️ 快捷键说明

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