找回密码
 立即注册
查看: 1589|回复: 1

LCM-DMA-EEPROM实验例程

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-11-26 13:41:15

14

主题

87

回帖

669

积分

高级会员

积分
669
发表于 2023-1-31 14:59:53 | 显示全部楼层 |阅读模式
春节在家无事,学习了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
完整程序在附件中,欢迎查阅,吐槽和指正。



例图.png

hard_test.zip

312.19 KB, 下载次数: 89

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:142
  • 最近打卡:2025-04-27 09:42:20

11

主题

157

回帖

1780

积分

版主

积分
1780
发表于 2023-3-22 11:27:29 | 显示全部楼层
收藏了,一起来学这个强大的DMA
1.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:13 , Processed in 0.383302 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表