📄 lcd.c
字号:
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 + -