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

📄 main.c

📁 嵌入式编程
💻 C
字号:
#include <stdio.h>

#include "710defs.h"
#include "HB_it.h"
#include "main.h"
#include "lcd_pattern.h"

int main(void)
{	
	U8 LBuffer[512]={0};
	U32 ClearLoop;
	
	LCD_IMAGE_T LCD_Size;
	LCD_LOCATION_T LCD_Location;
	
	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);
	LCDFIFOBufferSet(BlackBoard);
	LCDDisplayOn();
	
	for(ClearLoop = 0; ClearLoop < 115200; ClearLoop++)
    { 
    	BlackBoard[ClearLoop*2] =0x07;
    	BlackBoard[ClearLoop*2+1] =0xff;
    }
	
	LetterConvert(NI, LBuffer);
	LetterShow(224, 52, LBuffer, BlackBoard);
	Delay(3000000);
	LetterConvert(Ying, LBuffer);
	LetterShow(352, 52, LBuffer, BlackBoard);
	Delay(3000000);
	LetterConvert(Shi, LBuffer);
	LetterShow(480, 52, LBuffer, BlackBoard);
	Delay(3000000);
	LetterConvert(Yong, LBuffer);
	LetterShow(608, 52, LBuffer, BlackBoard);
	Delay(3000000);
	LetterConvert(Hua, LBuffer);
	LetterShow(96, 122, LBuffer, BlackBoard);
	Delay(3000000);	
	LetterConvert(Bang, LBuffer);
	LetterShow(224, 122, LBuffer, BlackBoard);
	Delay(3000000);
	LetterConvert(Sshi, LBuffer);
	LetterShow(352, 122, LBuffer, BlackBoard);
	Delay(3000000);
	LetterConvert(Yan, LBuffer);
	LetterShow(480, 122, LBuffer, BlackBoard);
	Delay(3000000);
	LetterConvert(Xi, LBuffer);
	LetterShow(608, 122, LBuffer, BlackBoard);
	Delay(3000000);
	LetterConvert(Tong, LBuffer);
	LetterShow(736, 122, LBuffer, BlackBoard);
	Delay(3000000);
	
	while(1)
	{
	}

	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, PUINT8 Buffer)
{
	PUINT8 temp = Buffer;
	* (temp + ((480 * y + x) << 1)) = 0xff;
	* (temp + (((480 * y + x) << 1) + 1)) = 0xff;
}

/*******************************************************************************
* 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, 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, 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, LBuffer);
            }
        }
        else
        {
            pk=((dx+dy)<<1)-1;
			LCDDotOne(xa, ya, LBuffer);
            for(i=0;i<abs(dy);i++)
            {
                ya++;
                if(pk>0)
                {
                    xa++;
                    pk-=towdydx;
                }
                else
                {
                    pk+=towdx;
                }
                LCDDotOne(xa, ya, LBuffer);
            }
        }
    }
    else
    {
        towdy=(-1) * (dy << 1);
        towdx=(-1) * (dx << 1);
        towdydx=(-1) * ((dx + dy) << 1);
		LCDDotOne(xa, ya, 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, LBuffer);
            }
        }
        else
        {
            pk=((dx + dy) << 1) + 1;
            LCDDotOne(xa, ya, LBuffer);
            for(i = 0; i < abs(dy); i++)
            {
                ya--;
                if(pk > 0)
                {
                    xa++;
                    pk -= towdydx;
                }
                else
                {
                    pk -= towdx;
                }
                LCDDotOne(xa, ya, 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, 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, CBuffer);
        LCDDotOne(x+x_center, -y+y_center, CBuffer);
        LCDDotOne(-x+x_center, -y+y_center, CBuffer);
        LCDDotOne(-x+x_center, y+y_center, CBuffer);
        LCDDotOne(y+x_center, x+y_center, CBuffer);
        LCDDotOne(y+x_center, -x+y_center, CBuffer);
        LCDDotOne(-y+x_center, -x+y_center, CBuffer);
        LCDDotOne(-y+x_center, x+y_center, CBuffer);
        if (delta < 0)
        {
            delta += (x << 2) + 6;
        }
        else
        {
            delta += ((x - y) << 2) + 10;
            y--;
        }
    }
}



void LetterConvert(PUINT8 LetterMode, PUINT8 LetterBuffer)
{
	U32 BitCounter = 8; //8
	U32 ByteCounter = 0; //32
	U32 temp;
	
	for(ByteCounter = 0; ByteCounter < 512; ByteCounter++)
	{
		BitCounter = 8;
		temp = LetterMode[ByteCounter];
		for(BitCounter = 0; BitCounter < 8; BitCounter++)
		{
			
			if((temp & 0x80) == 0x80)
			{	
				LetterBuffer[(ByteCounter << 4) + (BitCounter << 1)] = 0x07;
				LetterBuffer[(ByteCounter << 4) + (BitCounter << 1) + 1] = 0xe0;
			}
			else
			{
				LetterBuffer[(ByteCounter << 4) + (BitCounter << 1)] = 0x07;
				LetterBuffer[(ByteCounter << 4) + (BitCounter << 1) + 1] = 0xff;
			}
			temp <<= 1;
		}
   }
}

/*void LetterShow(U32 LetterX, U32 LetterY, PUINT8 LetterBuffer, PUINT8 LCDBuffer) //30*15
{
	U32 DotX = 0, DotY = 0, Line = 0, Row = 0;
	for(Row = 0; Row < 16; Row++)
	{
		for(Line = 0; Line < 16; Line++)
		{
			DotX = 16 * LetterX  + Line;
			DotY = 16 * LetterY + Row;
			LCDDotOne(DotX, DotY, LCDBuffer);
		}
	}
}*/
void LetterShow(U32 LetterX, U32 LetterY, PUINT8 LetterBuffer, PUINT8 LCDBuffer)
{
	U32 DotX = 0, DotY = 0, Line = 0, Row = 0;
	for(Row = 0; Row < 64; Row++)
	{
		for(Line = 0; Line < 128; Line++)
		{
			DotX = LetterX  + Line;
			DotY = LetterY + Row;
			LCDBuffer[DotX+960*DotY] = LetterBuffer[Line+128*Row];
		}
	}
}

⌨️ 快捷键说明

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