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

LCM-DMA-EEPROM实验例程

[复制链接]
  • TA的每日心情
    无聊
    2023-11-26 13:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    14

    主题

    85

    回帖

    607

    积分

    高级会员

    积分
    607
    发表于 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, 下载次数: 51

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 16:02
  • 签到天数: 39 天

    [LV.5]常住居民I

    5

    主题

    112

    回帖

    1074

    积分

    版主

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

    本版积分规则

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

    GMT+8, 2024-4-20 02:34 , Processed in 0.054724 second(s), 35 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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