- 打卡等级:以坛为家II
- 打卡总天数:494
- 最近打卡:2025-05-02 09:16:59
荣誉版主
- 积分
- 3480
|
发表于 2024-8-28 22:38:47
|
显示全部楼层
本帖最后由 浦江一水 于 2024-8-31 20:26 编辑
为节约版面和看官的阅读时间,贴一下主函数和清屏函数部分,主要可关注一下,预编译部分,和以16色清屏的代码: (详细可见工程文件包中源文件)
//主函数
void main(void)
{ u16 i;
SYS_Init(); //系统初始化
//液晶屏初始化
#if (USE_LCM==1)
LCM_Config(); //LCM模式初始化
#endif
#if (USE_LCM==1)
DMA_Config(); //DMA模式初始化
#endif
Timer0_Init(); //定时器0初始化
EA=1;
LCD_Init();
//LCD_SetDIR(0); //原显示方向(纵向屏)
LCD_SetDIR(3); //调整显示方向(横屏)
while(1)
{ for(i=0;i<16;i++)
{ DelayNms=0; //计数器复0
LCD_CLS((u8)i); //测试单色清屏
sprintf(S," Time %04d ms ",DelayNms);
LCD_Str16(20,20,S,15,0); //显示清屏用时ms
sprintf(S," Color %02d RGB=%04X ",i,COLOR);
if(USE_LCM)strcat(S,"+LCM "); //加入LCM模式
if(USE_DMA)strcat(S,"+DMA "); //加入DMA模式
LCD_Str16(20,40,S,15,0); //显示字符串..
delay_ms(1000);
}
LCD_CLS(1); //清屏(蓝色)
for(i=0;i<32;i++){ LCD_Box(i*10,215,10,20,15,15,(u8)i); } //32色号定义
for(i=0;i<20;i++)LCD_Line(5,5,315,5+i*10,13); //任意两点一线
for(i=0;i<20;i++)LCD_Line(315,5,5,5+i*10,13); //任意两点一线
delay_ms(1000); //延时1s
for(i=0;i<11;i++)
{ LCD_LineH(5,5+i*20,310,10); //画水平线
LCD_LineV(5+i*31,5,200,10); //画垂直线
}
delay_ms(2000);
MainMenu(); //图标彩色显示+中西文混合字符串+下拉主菜单演示
delay_ms(3000); //延时3s
//画示波器背景底图...
LCD_CLS(0); //清屏(黑色)
LCD_BoxF(10,0,50,18,3,3); //画圆角填色矩形
LCD_BoxF(65,0,40,18,3,4);
LCD_BoxF(110,0,68,18,3,7);
LCD_A16(20,2,'A',15,3); //显示单字符
LCD_A16(28,2,'U',15,3); //青底白字
LCD_A16(36,2,'T',15,3);
LCD_A16(44,2,'O',15,3);
LCD_A16(72,2,'A',14,4); //显示单字符
LCD_A16(80,2,'B',14,4); //红底黄字
LCD_A16(88,2,'C',14,4);
LCD_Str16(120,2,"STC32G",0,7); //显示字符串
LCD_Str16(195,0,"8*16_ASCII_ABC",10,0); //显示16点阵字符串
LCD_Str8(10,226,"6*8_ASCII_ABCD",11,0); //显示8点阵字符串
for(i=0;i<7;i++)LCD_LineH0(10,45+25*i,301,5,10,0); //画7条水平虚线
for(i=0;i<11;i++)LCD_LineV0(35+25*i,20,200,5,10,0); //画11条垂直虚线
LCD_LineH0(10,45+25*3-1,301,5,10,0); //画一水平虚线
LCD_LineH0(10,45+25*3+1,301,5,10,0);
LCD_LineV0(35+25*5-1,20,200,5,10,0); //画一垂直虚线
LCD_LineV0(35+25*5+1,20,200,5,10,0);
LCD_Box0(9,20,301,200,0,15); //空心方框
LCD_A08( 2,116,126,10,1); //小箭头
LCD_A08(312,116,127,10,1); //小箭头
delay_ms(1000); //延时1s
n=0;y0=SIN[n++];
for(i=0;i<150;i++)
{
y1=SIN[n];
LCD_Line(10+i*2,y0,10+i*2+3,y1,14); //画11条垂直虚线
y0=y1;
n=n<49?n+1:0;
}
delay_ms(3000); //延时3s
//循环进行各项测试
}
}
再贴一下LCD9341.C文件中的清屏函数代码:比较使用DMA和不用DMA的不同方式代码...
//清屏函数
void LCD_CLS(u8 Color)
{ u16 i,j;
LCD_SetWindow(0,0,LCD_W-1,LCD_H-1);
#if (USE_DMA==1) //若使用DMA方式
for(j=0,i=0;i<=DMA_AMT_LEN;i++)LCD_Buf = COLOR[Color]; //先向缓存区填颜色字
DMA_TxCount = 75; //确定发送次数: (320 * 240 * 2) / 2048 = 75 总字节数/缓存区大小=循环次数
LCD_CS=0; //片选中,让DMA向显示屏发送数据...
DMA_LCM_CR = 0xA0; //(Write dat 写数据) 使能LCM_DMA / 启动发送数据模式操作 / 引发中断
while(!LCD_CS); //等待中断操作完成... 在中断服务程序中翻转片选。
#else
for(i=0;i<LCD_W;i++)
{ for (j=0;j<LCD_H;j++)
{ LCD_WR_DAT_16Bit(COLOR[Color]); }
}
#endif
}
|
|