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

📄 lcd.c

📁 在LCD显示器上显示灰度图象
💻 C
📖 第 1 页 / 共 2 页
字号:

    if( usX1 < usX0 )
    {
        GUISWAP (usX1, usX0);
    }

    while( (usWidth--) > 0 )
    {
        usLen = usX1 - usX0 + 1;
        while( (usLen--) > 0 )
        {
        	LCD_PUT_PIXEL(usX0 + usLen, usY0, ucColor);
        }
        usY0++;
    }
}

/*********************************************************************************************
* name:		lcd_draw_vline()
* func:		Draw vertical line with appointed color
* para:		usX0,usY0 -- line's start point coordinate
*			usY1 -- line's end point Y-coordinate
*			ucColor -- appointed color value
*			usWidth -- line's width
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void lcd_draw_vline (INT16T usY0, INT16T usY1, INT16T usX0, UINT8T ucColor, UINT16T usWidth)
{
	INT16T usLen;

    if( usY1 < usY0 )
    {
        GUISWAP (usY1, usY0);
    }

    while( (usWidth--) > 0 )
    {
        usLen = usY1 - usY0 + 1;
        while( (usLen--) > 0 )
        {
        	LCD_PUT_PIXEL(usX0, usY0 + usLen, ucColor);
        }
        usX0++;
    }
}

/*********************************************************************************************
* 函数名称:lcd_disp_ascii8x16()
* 说明:在8*16的点阵上显示字符
* 参数:usX0,usY0 -- 要显示字符的起始位置坐标 
        ForeColor -- 要显示字符的颜色值
        *s -- 要显示的字符串
* 返回值:无
*********************************************************************************************/
void lcd_disp_ascii8x16(UINT16T x0, UINT16T y0, UINT8T ForeColor, UINT8T * s)
{
	INT16T i,j,k,x,y,xx;
	UINT8T qm;
	UINT32T ulOffset;
	INT8T ywbuf[16],temp[2];
    
	for( i = 0; i < strlen((const char*)s); i++ )
	{   //要显示的字符串中包含非法字符,例如汉字。
		if( (UINT8T)*(s+i) >= 161 )
		{
			temp[0] = *(s + i);
			temp[1] = '\0';
			return;
		}
		else
		{   //得到字符在字符映射表中的位置
			qm = *(s+i);
			ulOffset = (UINT32T)(qm) * 16;	
			//显示字符	
			for( j = 0; j < 16; j ++ )
			{
				ywbuf[j] = g_ucAscii8x16[ulOffset + j];
            }

            for( y = 0; y < 16; y++ )
            {
            	for( x = 0; x < 8; x++ ) 
               	{
                	k = x % 8;
			    	if( ywbuf[y]  & (0x80 >> k) )
			       	{
			       		xx = x0 + x + i*8;
			       		LCD_PUT_PIXEL(xx, y + y0, (UINT8T)ForeColor);
			       	}
			   	}
            }
		}
	}
}

#ifdef CHINESE_VERSION
/*********************************************************************************************
* 函数名称:lcd_disp_hz16()
* 说明:在16*16的点阵上显示汉字
* 参数:usX0,usY0 -- 要显示汉字的起始位置坐标 
        ForeColor -- 要显示汉字的颜色值
        *s -- 要显示的字符串
* 返回值:无
*********************************************************************************************/
void lcd_disp_hz16(UINT16T x0, UINT16T y0, UINT8T ForeColor, UINT8T *s)
{
	INT16T 	i,j,k,x,y,xx;
	UINT8T 	qm,wm;
	UINT32T ulOffset;
	INT8T 	hzbuf[32],temp[2];

	for( i = 0; i < strlen((const char*)s); i++ )
	{
		if( ((UINT8T)(*(s+i))) < 161 )//如果字符串中包含非汉字部分,则停止。
		{
			temp[0] = *(s+i);
			temp[1] = '\0';
			break;
		}
		else
		{   //一个汉字是由两个字节组成的。
		    //得到一个汉字在映射表中的位置
			qm = *(s+i) - 161;
    		wm = *(s + i + 1) - 161;
       		ulOffset = (UINT32T)(qm * 94 + wm) * 32;
       		//显示汉字
			for( j = 0; j < 32; j ++ )
            {
            	hzbuf[j] = g_ucHZK16[ulOffset + j];
            }
            for( y = 0; y < 16; y++ )
            {
	        	for( x = 0; x < 16; x++ ) 
	            {
                	k = x % 8;
				   	if( hzbuf[y * 2 + x / 8]  & (0x80 >> k) )
				    {
				    	xx = x0 + x + i * 8;
				    	LCD_PUT_PIXEL( xx, y + y0, (UINT8T)ForeColor);
				    }
			   	}
           	}
		    i++;
		}
	}
}
#endif


/*********************************************************************************************
* 函数名称:lcd_dma_trans()
* 说明:dma传输虚拟的LCD屏幕到实际的LCD屏幕
* 参数:无
* 返回值:无
*********************************************************************************************/
void lcd_dma_trans(void)
{
	f_ucZdma0Done=1;
	// #define LCD_VIRTUAL_BUFFER	(0xc400000)
	// #define LCD_ACTIVE_BUFFER	(LCD_VIRTUAL_BUFFER+(SCR_XSIZE*SCR_YSIZE/2))	//DMA ON
	// #define LCD_ACTIVE_BUFFER	LCD_VIRTUAL_BUFFER								//DMA OFF
	// #define LCD_BUF_SIZE			(SCR_XSIZE*SCR_YSIZE/2)
	// So the Lcd Buffer Low area is from LCD_VIRTUAL_BUFFER to (LCD_ACTIVE_BUFFER+(SCR_XSIZE*SCR_YSIZE/2))

	rNCACHBE1 = (((unsigned)(LCD_ACTIVE_BUFFER)>>12) <<16 ) | ((unsigned)(LCD_VIRTUAL_BUFFER)>>12);
  	rZDISRC0  = (DW<<30)| (1<<28) | LCD_VIRTUAL_BUFFER; 
 	rZDIDES0  = (2<<30) | (1<<28) | LCD_ACTIVE_BUFFER; 
	rZDICNT0  = (2<<28) | (1<<26) | (3<<22) | (0<<20) | (LCD_BUF_SIZE);
   	//			|            |            	|             |            |---->0 = Disable DMA
    //          |            |            	|             |------------>Int. whenever transferred
    //          |            |            	|-------------------->Write time on the fly
    //          |            |---------------------------->Block(4-word) transfer mode
    //          |------------------------------------>whole service
	//reEnable ZDMA transfer
  	rZDICNT0 |= (1<<20);										// after ES3
    rZDCON0=0x1; 												// start!!!  

	delay(500);
	//while(f_ucZdma0Done);										//wait for DMA finish
}


/************************************************************************
* 函数名称:lcd_draw_circle()
* 说明:在lcd上画圆
* 参数:Ox:原点的横坐标;Oy:原点的纵坐标;Rx:半径;ucColor:颜色
* 返回值:无
************************************************************************/
void lcd_draw_circle(INT16T Ox,INT16T Oy,UINT16T Rx,UINT8T ucColor)
{
        UINT16T xx,rr,xt,yt,rs;
        UINT16T col,row;
        yt=Rx;
        rr=Rx*Rx;
        rs=Rx*707/1000;           //分开1/8圆弧来画,0.707=二分之根号2
        for (xt=0;xt<=rs;xt++)
        {
                xx=xt*xt;
                while ((yt*yt)>(rr-xx))yt--;
                col=Ox+xt;              //第一象限
                row=Oy-yt;
                LCD_PUT_PIXEL(col, row, (UINT8T)ucColor);
                col=Ox-xt;              //第二象限
                row=Oy-yt;
                LCD_PUT_PIXEL(col, row, (UINT8T)ucColor);
                col=Ox-xt;              //第三象限
                row=Oy+yt;
                LCD_PUT_PIXEL(col, row, (UINT8T)ucColor);
                col=Ox+xt;              //第四象限
                row=Oy+yt;
                LCD_PUT_PIXEL(col, row, (UINT8T)ucColor);

/***************45度镜象变换,画另一半***************/

                col=Ox+yt;              //第一象限
                row=Oy-xt;
                LCD_PUT_PIXEL(col, row, (UINT8T)ucColor);
                col=Ox-yt;              //第二象限
                row=Oy-xt;
                LCD_PUT_PIXEL(col, row, (UINT8T)ucColor);
                col=Ox-yt;              //第三象限
                row=Oy+xt;
                LCD_PUT_PIXEL(col, row, (UINT8T)ucColor);
                col=Ox+yt;              //第四象限
                row=Oy+xt;
                LCD_PUT_PIXEL(col, row, (UINT8T)ucColor);
        }
        
}
/********************************************************************
* 函数名称:lcd_test()
* 说明:lcd测试程序
* 参数:无
* 返回值:无
********************************************************************/
void lcd_test(void) {
	int i,j,k;
		
	lcd_init();											// 初始化LCD控制器
	lcd_clr();											// 清屏
	lcd_active_clr();

//如果定义了宏CHINESE_VERSION,则输出汉字,否则输出英文字符
#ifdef CHINESE_VERSION 
	lcd_disp_hz16(10,0,DARKGRAY,"大家好");
	lcd_disp_hz16(10,20,BLACK,"李宝轶和王振华的嵌入式实验");
#else
	lcd_disp_ascii8x16(10,0,DARKGRAY,"Hello Everyone! ");
	lcd_disp_ascii8x16(10,20,BLACK,"This is a test for LI and WANG.");
#endif

//进入死循环
	while(1) {
		for (i = 0; i < 3; i++)	{
			if (i==0) {   //画BOX
				for (j=1; j < 17; j++) {
					lcd_draw_box(10*j,35+5*j,320-10*j,235-5*j,17-j);
					lcd_dma_trans();
					delay(5000);
				}
				//擦除BOX
				for (j=1; j < 17; j++) {
					lcd_draw_box(10*j,35+5*j,320-10*j,235-5*j,WHITE);
					lcd_dma_trans();
					delay(5000);
				}
			}
			if (i==1) {   //画圆
				for (j=1; j < 11; j++) {
					lcd_draw_circle(150,140,10*j,j);
					lcd_dma_trans();
					delay(5000);
				}
				//擦除圆
				for (j=1; j < 11; j++) {
					lcd_draw_circle(150,140,10*j,WHITE);
					lcd_dma_trans();
					delay(5000);
				}
			}
			if (i==2) {//鼠标位图在屏幕上游走
				for (k=40; k<220; k+=20) {
					for (j=10; j < 300; j+=20) {
						bitmap_view(j, k, g_struBitmapMouse);
						lcd_dma_trans();
						delay(200);
						bitmap_view(j, k, g_struBitmapMouse1);
						lcd_dma_trans();
						delay(200);
					}
				}
			}
		}
	}
}

⌨️ 快捷键说明

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