|
本帖最后由 慕名而来 于 2023-1-6 19:54 编辑
文接上回:STC屠龙刀实验板驱动7寸TFT屏测试代码分享1-LCM接口驱动
https://www.mydigit.cn/thread-363836-1-1.html
(出处: 数码之家)
STC32G硬件LCM接口测试完成后接下来就测试它的DMA功能,话说STC的资料真的丰富,新手做测试只要找到相关例程就很容易成功的,但是,例程毕竟是演示程序是不可能完全与自己的硬件系统相吻合,除非是你完全按照例程来匹配硬件,但那样一来也就失去了玩的意义,我玩单片机的兴趣其实就来源于改程序、编程序、找错的过程。
废话止于此下面继续分享代码。
主函数:
- //STC32G单片机LCM接口+DMA驱动SSD1963-7寸TFT液晶屏测试程序
- //程序原创:wannenggong 于2022年12月28日测试通过
- //程序基于STC32G为主控芯片的实验箱测试例程改编
- //使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
- //edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
- //硬件LCM接口的指令(数据)并行口已经控制信号RS、RD、WR由配置寄存器控制、由函数LCM_Config()进行配置、无需再次定义
- //------------------------------------------------
- //本案LCM接口的应用配置(引脚接线方式)如下:(参照STC32G.pdf--27.x)
- //驱动LCM控制芯片型号为:SSD1963(7”屏幕为创群AT070N92)
- //16bit-MCU并行总线 I8080模式,
- //低8位口接D0~D7连接P0.0-P0.7
- //高8位口接D8~D15连接P2.0-P2.7
- //LCD_RS = P4^5;//数据/命令切换
- //LCD_WR = P4^2;//写控制
- //LCD_RD = P4^4;//读控制
- //下载时, 选择内部时钟 24MHz
- //------------------------------------------------
- #include "STC32G.h"
- #include "TFT_LCD.h"
- #include "delay.h"
- #include "SSD1963.h"
- #define DMA_AMT_LEN 2047 //n+1
- u16 index;//(800 * 480 * 2) / 2048 = 375、每次中断发送一包数据并减掉一个包数;//LCM_MDA发送数据计数变量
- u16 xdata Color[DMA_AMT_LEN+1];
- bit LcmFlag;
- bit DmaFlag=1;
- //----LCM-DMA寄存器配置函数(用于STC32G)----------------------------------
- void DMA_Config(void)
- {
- DMA_LCM_AMT = (u8)DMA_AMT_LEN; //设置传输总字节数(低8位):n+1
- DMA_LCM_AMTH = (u8)(DMA_AMT_LEN>>8); //设置传输总字节数(高8位):n+1
- DMA_LCM_TXAH = (u8)((u16)&Color >> 8); //LCM-DMA发送数据的地址指向Color[]的地址
- DMA_LCM_TXAL = (u8)((u16)&Color);
- DMA_LCM_STA = 0x00;//清除所有标志、B0=中断标志、B1=数据覆盖标志
- DMA_LCM_CFG = 0x82;//配置LCM-DMA寄存器:使能LCM-DMA中断、设置中断等级最低级、设置数据总线访问优先级为较高级
- }
- //----DMA_LCM设定范围内涂色函数------------------------------------------------
- //DMA_LCM设置一次传输数据量为2047+1个字节(一包数据=2Kbit)
- //满屏刷新时:(800 * 480 * 2) / 2048 = 375
- //每次中断发送2Kbit数据
- void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
- {
- u16 i;
- index=(((u32)ex-sx)*((u32)ey-sy)*2)/2048;
- LCD_SetWindows(sx,sy,ex,ey);//设置显示窗口
- while(index>0)
- {
- index--;
- for(i=0; i<=DMA_AMT_LEN; i++)
- {
- Color[i] = color;
- }
- DmaFlag=0;
- DMA_LCM_CR = 0xa0; //Write dat
- while(DmaFlag);
- }
- }
- //----LCMIF_DMA中断函数----------------------------------
- void LCMIF_DMA_Interrupt(void) interrupt 13
- {
- if(LCMIFSTA & 0x01)
- {
- LCMIFSTA = 0x00;
- LcmFlag = 0;
- }
- if(DMA_LCM_STA & 0x01)
- {
- if(DmaFlag)
- {
- DmaFlag = 0;
- DMA_LCM_CR = 0;
- }
- else
- {
- if(index == 0)
- {
- DMA_LCM_CR = 0;
- DmaFlag=1;
- }
- }
- DMA_LCM_STA = 0;
- }
- }
- //==========================================================================
- void main(void)
- {
- WTST = 0; //设置程序指令延时参数、赋值为0为等待0个时钟、可将CPU执行指令的速度设置为最快
- EAXFR=1; //相当于P_SW2 |= 0x80(使能扩展寄存器(XFR)访问)
- CKCON = 0; //提高访问XRAM速度
- EXTRAM=1; //使能外部扩展寄存器(xdata)的操作
- P0M0=0xff; //P0推挽输出
- P0M1=0x00;
- P2M0=0xff; //P2推挽输出
- P2M1=0x00;
- P3M0=0x10; //P3.4推挽输出
- P3M1=0x00;
- P4M0=0x3c; //P4-2.3.4.5推挽输出
- P4M1=0x00;
- EA = 1;
- LCM_Config();
- DMA_Config();
- LCD_Init(); //LCM初始化
- LCD_Fill(0,0,800,480,BLUE);
- while(1)
- {
- LCD_Fill(0,0,400,180,RED);
- delay_ms(1000);
- LCD_Fill(0,0,600,280,GREEN);
- delay_ms(1000);
- LCD_Fill(0,0,800,480,YELLOW);
- delay_ms(1000);
- LCD_Fill(0,0,800,480,BLUE);
- delay_ms(1000);
- }
- }
复制代码
其他代码与上一篇一样就不再贴出来了。
网站可能是阳了,无法上传图片,也无法复制粘贴前文的链接。
注:烧录代码时设置内部时钟频率为24MHz!
由于我不知道怎样上传演示视频,所以无法演示DMA_LCD刷7“ 800*480TFT屏的效果
网盘分享请移步:STC屠龙刀实验板驱动7寸TFT屏测试代码分享3-片内RTC时钟演示
https://www.mydigit.cn/thread-364135-1-1.html
(出处: 数码之家)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|