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

📄 main.c

📁 在ARM中实现图片、文字的转换
💻 C
📖 第 1 页 / 共 2 页
字号:
#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,
};
U32 key=0;
U32 temp = 0;
U32 i = 0x3c0;
int main(void)
{	    
	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;
	
	KPIInit();
	
	LCDInit();
	LCDShow(LCD_Size, LCD_Location);

	LCDDisplayOn();

	
	Timer0Init();
	Timer0On();
	
	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);
}


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

/*******************************************************************************
* Function Name  : KPIInit
* Description    : 
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void KPIInit(void)
{
    REG_GPIO_CFG2 |= 0x000aaaaa; //将GPIO设置为KPI模式
    REG_GPIO_CFG2 &= 0xfffaaaaa;
    
    REG_AIC_SCR29 = 0x00000045; //将KPI中断设置为高电平有效,优先级为5
    REG_AIC_MECR = 0x20000000;
    
    REG_KPICONF = 0x00142fff;
}

/*******************************************************************************
* Function Name  : Timer0Init
* Description    : Timer0初始化
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void Timer0Init(void)
{
    /*关闭看门狗定时控制寄存器*/
    REG_WTCR = 0;
    /*初始化定时器控制寄存器,设置定时器模式为循环模式*/                              
    REG_TCR0 = 0x88000000;                             
    /*定时器初始计数值*/
    REG_TICR0  =0x0000f0;                           
    /*中断控制寄存器设置,正边沿触发,优先级为1*/ 
    REG_AIC_SCR13 = 0x41;
    /*使能相应的中断源*/                         
    REG_AIC_MECR = 0x00002000;                               
    /*开定时器中断*/
    REG_TCR0 |= 0x20000000;                   
}

/*******************************************************************************
* Function Name  : Timer0On
* Description    : 打开Timer0
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void Timer0On(void)
{
    /*定时器启动*/                                  
    REG_TCR0 |= 0x40000000;
}

/*******************************************************************************
* Function Name  : Timer0Off
* Description    : 打开Timer0
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/

void Timer0Off(void)
{
    /*定时器启动*/                                  
    REG_TCR0 &= ~0x40000000;
}



/*******************************************************************************
* Function Name  : StringShow
* Description    : 显示单个字符
* Input          : LCD显示字符相关信息
* Output         : None
* Return         : None
*******************************************************************************/
void StringShow(LCDShowParameter LCDShowPara)
{
    //用于取汉字点阵图
    U32 Offset = 0, Length = 0; 
    U8 PBuffer[32] = {0};
    //用于将汉字点阵图转化为LCD显示图
    U32 BitCounter = 8; //8  
    U32 ByteCounter = 0; //32
    U32 temp;
    U8 ColorHigh, ColorLow;
    //用于在LCD上显示汉字
    U32 X = 0, Y = 0, Line = 0, Row = 0;
    U8 LBuffer[512] = {0};
    
    
    Offset = ((LCDShowPara.LetterChar[0]-0xa1) * 0x5e + (LCDShowPara.LetterChar[1] - 0xa1)) << 5;
    for(Length = 0; Length < 32; Length++)
    {
        PBuffer[Length] = (* (unsigned int volatile *)(LCDShowPara.LibPlace + Offset + Length));
    }
    
    ColorLow = (U8)(0x00ff & LCDShowPara.Color); 
    ColorHigh = (U8)(0xff00 & LCDShowPara.Color >> 8);
    for(ByteCounter = 0; ByteCounter < 32; ByteCounter++)
    {
        BitCounter = 8;
        temp = PBuffer[ByteCounter];
        for(BitCounter = 0; BitCounter < 8; BitCounter++)
        {
        	
            if((temp & 0x80) == 0x80)
            {	
                LBuffer[(ByteCounter << 4) + (BitCounter << 1)] = ColorHigh;
                LBuffer[(ByteCounter << 4) + (BitCounter << 1) + 1] = ColorLow;
        	}
            else
        	{
                LBuffer[(ByteCounter << 4) + (BitCounter << 1)] = 0x00;
                LBuffer[(ByteCounter << 4) + (BitCounter << 1) + 1] = 0x00;
        	}
            temp <<= 1;
        }
    }
    
    for(Row = 0; Row < 16; Row++)
    {
        for(Line = 0; Line < 32; Line++)
        {
            X = (LCDShowPara.StartX << 5) + Line;
            Y = (LCDShowPara.StartY << 4)+ Row;
            LCDShowPara.LCDBuffer[X + 960 * Y] = LBuffer[Line + (Row << 5)];
        }
    }

}
/*******************************************************************************
* Function Name  : LCDOutputShow
* Description    : 显示多字符并自动换行
* Input          : LCD显示字符相关信息及字数
* Output         : None
* Return         : None
*******************************************************************************/
void LCDOutputShow(LCDShowParameter LCDShowPara, U32 NUM)
{
    U32 temp;
    StringShow(LCDShowPara);

    for(temp=1; temp < NUM; temp++)
    {
        LCDShowPara.StartX = LCDShowPara.StartX + 1;
        if(LCDShowPara.StartX > 29)
        {
            LCDShowPara.StartY = LCDShowPara.StartY + 1;
            LCDShowPara.StartX = 0;
        }
        LCDShowPara.LetterChar = &LCDShowPara.LetterChar[2];
        StringShow(LCDShowPara);        
    }


}

/*******************************************************************************
* Function Name  : LCDDotOne
* Description    : 画任意点函数
* Input          : x:横坐标(0-480)

⌨️ 快捷键说明

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