久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3578|回復: 4
收起左側

基于STC32G12K128單片機的LCM-DMA-EEPROM實驗例程

[復制鏈接]
ID:1039438 發表于 2023-1-31 15:11 | 顯示全部樓層 |閱讀模式
      春節在家無事,學習了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;//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
完整程序在附件中,歡迎查閱,吐槽和指正。
補充一句,stc32g12k128的eeprom容量是在stc-isp軟件里設置的。如圖所示的位置。
stc-isp.png
例圖.png

hard_test.zip

312.19 KB, 下載次數: 25, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1039438 發表于 2023-2-3 13:14 | 顯示全部樓層
STC莊偉 發表于 2023-2-2 09:47
我也在學  
真12位ADC, 熱敏電阻/NTC 測溫 《STC32位8051單片機原理及C語言程序設計 視頻教程》,第19集

后來才知道在屠龍刀核心板上就設計安裝了NTC測溫電路的,直接編程就能調試了
回復

使用道具 舉報

ID:1039438 發表于 2023-2-3 13:10 | 顯示全部樓層
STC莊偉 發表于 2023-2-2 09:47
我也在學  
真12位ADC, 熱敏電阻/NTC 測溫 《STC32位8051單片機原理及C語言程序設計 視頻教程》,第19集

NTC的性能參數我不熟。沒搞這方面的驗證實驗,只做了ds18b20的測溫實驗。
回復

使用道具 舉報

ID:961114 發表于 2023-2-2 09:47 | 顯示全部樓層
我也在學  
真12位ADC, 熱敏電阻/NTC 測溫 《STC32位8051單片機原理及C語言程序設計 視頻教程》,第19集
1111.png
回復

使用道具 舉報

ID:1039438 發表于 2023-2-1 08:20 | 顯示全部樓層
補充一下:
1,做為學習階段的例程,程序中還使用了外晶振和內部RTC時鐘源,沒有安裝外晶振的朋友可以把相關語句屏蔽掉,系統會自動選擇內部高速時鐘源,其頻率可在STC-ISP軟件界面選定。
2,緩沖數組的確定和程序中幾個數字的解釋,我在這個程序中用了一個隨手拿來的圖片,經軟件(Image2Lcd或其它)縮小后大小為154*120(320和240兩者只能照顧一個)。其數據量為:
154*120*2=36960(字節)
選擇緩沖數組3696一是該 值小于8K(stc32g12k128的xdata空間是8K,DMA緩沖數組只能放在這個空間)
二是總數據量正好分十次讀完(整除)。三是3696/154/2=12.就是刷屏時正好12行(整除),所以程序中出現了3696,154,120,12這幾個數字,如果哪位同學的圖像數據不同,可按這個關系自己確定相應的常數。
3,調試程序時借助了stc-usb link1d工具,進行硬件仿真,用它可以清楚地看到程序運行到哪一步,各種變量的變化,及數組內數值的變化。明顯的減少了調試時間。記得聽過一句話,說程序不是寫出來的,是調出來的。意思大概是寫一個程序并不難,但寫完后難免存在各種小bug.一點小問題可能耽誤很多時間,甚至調錯方向,把對的改成錯的,結果越調越亂(我這種新人難免出這種情況),有了硬件仿真,就容易多了。程序卡在哪里,一看就知道,針對性的進行調整,容易多了,記得卡的最多的是外晶振無法開啟(這也是上來做補充說明的原因)到現在我也沒能把控時鐘管理。只到了能用的程度,出現問題時,沒能力解決這方面的問題。而最夸張的一次是完全正確的程序,執行時卻連第一行都沒進去。如果沒有硬件仿真器支持,真的要多花太多時間去查。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情在线视频网站 | 国产一级在线 | 亚州精品天堂中文字幕 | 黑人精品xxx一区一二区 | 久久久久久久久国产精品 | 91色在线 | 久久黄色网| 日韩精品1区2区 | 国产精品99久久久久久人 | 亚洲先锋影音 | 99re6在线| 一级毛片大全免费播放 | 久久夜色精品国产 | 精品久久久久一区 | 在线一区 | 日韩欧美国产一区二区三区 | 国产精品久久久久婷婷二区次 | 亚洲精选一区二区 | 国产免费麻豆视频 | 精品国产91乱码一区二区三区 | 色综合一区二区 | 国产精品福利一区二区三区 | 日韩国产精品一区二区三区 | 九九热精品免费 | 色爱综合网 | 午夜丁香视频在线观看 | www.99热这里只有精品 | 日韩不卡视频在线观看 | 欧美日韩精品久久久免费观看 | 久久综合九九 | 亚洲精品 在线播放 | www国产精 | 欧美国产一区二区 | 91久久久久久久久久久久久 | 欧美一级淫片免费视频黄 | av毛片 | 国产精品久久久久久久久久免费 | 中文字幕精品一区 | 成人在线视频一区 | 国产一区二区三区久久久久久久久 | 美女拍拍拍网站 |