- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2023-11-26 13:41:15
高级会员
- 积分
- 669
|
春节在家无事,学习了LCM,DMA和EEPROM的使用,写了一个例程,上机调试运行通过,分享给大家,相信这类东西多些对我们初学者是有利的。也欢迎大神们指点和吐槽。
程序采用模块化编程,一个主程序main.c,一个mcu初始化程序mcu_initial,c。一个tft320x240屏的驱动程序。其余两个看名子就知是什么了。
下面是主程序:
#include <STC32G.H>
#include "mcu_initial.h"
#include "picture.h"
#include "eeprom_drv.h"
#include "tft_320_drv.h"
#include "lcm_dma_test.h"
char xdata buffer[3696];//DMA缓冲区,按技术手册要求,必须在xdata位置
void main(void)
{
unsigned int k;
unsigned long cont;
//unsigned long j;
mcu_initial();
lcd_initial();
lcd_address(0,0,320,240);
display_black();//不清屏的结果是屏上会显示上一个程序运行时的图像
/***清全部eeprom区,写完屏蔽掉,这里设置了37K的eeprom
for(j=0;j<37887;j=j+512)
IapErase(j);
*/
/***先把数据写入eeprom
p=gImage_picture;
for (j=0;j<36960;j++)
{
//dat=*p;//从目标位置取操作数据,本例是直接把数据源位置写入
IapProgram(j,*p);//把数据写入指定位置
p++;//源数据地址加一
}
*/
//读eeprom数据文件并显示出来
for (cont=0;cont<10;cont++)
{
IapReadmany(cont*3696,3696,buffer);//读一组数据,因为xdata空间限制,要分次读到,次数与每次的数量的积正好为全部数据,这个读取函数很厉害,一句就把需要的数据读到缓冲区了
lcm_dma_test(0,(0+cont*12),154,120,3696,buffer);//分四个位置显示,因为空间限制,不能存下全屏用的数据,只存了四分之一幅
while(!(DMA_LCM_STA&0x01));//这时本应该做其它事,可我打算继续刷屏,所以只好等待
lcm_dma_test(154,(0+cont*12),154,120,3696,buffer);
while(!(DMA_LCM_STA&0x01));
lcm_dma_test(154,(120+cont*12),154,120,3696,buffer);
while(!(DMA_LCM_STA&0x01));
lcm_dma_test(0,(120+cont*12),154,120,3696,buffer);
while(!(DMA_LCM_STA&0x01));
}
while(1)
{k=SEC;
digit_display(128,64,k);//显示时钟秒位
digit_display(160,96,MIN);//显示时钟分位,只为测试,随意显示的
}
}
void LCMIF_DMA_Interrupt(void) interrupt 13
{
if(DMA_LCM_STA& 0x01)//lcm中断请求标志位
{
// LCMIFSTA = 0x00;//清中断标志位
DMA_LCM_STA = 0x00; //清除 DMA 状态
//LcmFlag = 0;
}
/***先屏蔽DMA内容
if(DMA_LCM_STA & 0x01)//lcm的dma中断请求标志位
{
if(DmaFlag)
{
DmaFlag = 0;
DMA_LCM_CR = 0;
}
else
{
index--;
if(index == 0)
{
DMA_LCM_CR = 0;
LCD_CS=1;
}
else
{
DMA_LCM_CR = 0xa0; //Write dat
}
}
DMA_LCM_STA = 0;
}
*/
}
尽可能的使用了STC官方数据手册的例程。特别是中断程序,是照抄的。如果哪句在官方手册里没有,一定是我自己造改的。
tft_320_drv.c里的写数据函数:
void transfer_data(char data1)
{//LCM程序
LCMIFDATL = data1;
CS0=0;
LCMIFCR = 0x85; //Enable interface, write data1 out
while(LCMIFSTA==0);
LCMIFSTA=0;
CS0 = 1 ;
//旧程序
/* CS0 = 0;
DC0 = 1;
RD0 = 1;
P2=data1;
WR0 = 0;
WR0 = 1;
CS0 = 1;
*/
}
这是个基础函数,使用这个函数说明使用了LCM功能,这个功能能提高芯片的工作效率,这种用法就是把LCM功能日常化使用了。
这里附了一个旧函数,方便不能使用LCM功能的朋友使用其它两项功能(eeprom和dma).
STC官方数据手册上的写数据程序是这样的:
#define LCM_WRDB(d) LCM_WR = 0;\
LCM_DB = (d);\
_nop_();\
LCM_WR = 1
做为新人,看不太懂,但感觉是用了LCM这个名子,但没用LCM功能。
图像数据放在头文件Picture里,我自己的图不太严谨就不上传了。自己做图里要考虑图像的大小与屏,eeprom空间容量的关系,我用了一半的eeprom存了四分之一屏的图像。约37K。320*240*2/1024=37.5k
完整程序在附件中,欢迎查阅,吐槽和指正。
|
|