亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 基于STC32G12K128單片機(jī)的LCM-DMA-EEPROM實(shí)驗(yàn)例程 [打印本頁(yè)]

作者: 麗江春水    時(shí)間: 2023-1-31 15:11
標(biāo)題: 基于STC32G12K128單片機(jī)的LCM-DMA-EEPROM實(shí)驗(yàn)例程
      春節(jié)在家無(wú)事,學(xué)習(xí)了LCM,DMA和EEPROM的使用,寫(xiě)了一個(gè)例程,上機(jī)調(diào)試運(yùn)行通過(guò),分享給大家,相信這類(lèi)東西多些對(duì)我們初學(xué)者是有利的。也歡迎大神們指點(diǎn)和吐槽。

      程序采用模塊化編程,一個(gè)主程序main.c,一個(gè)mcu初始化程序mcu_initial,c。一個(gè)tft320x240屏的驅(qū)動(dòng)程序。其余兩個(gè)看名子就知是什么了。
下面是單片機(jī)主程序:
#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緩沖區(qū),按技術(shù)手冊(cè)要求,必須在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();//不清屏的結(jié)果是屏上會(huì)顯示上一個(gè)程序運(yùn)行時(shí)的圖像
/***清全部eeprom區(qū),寫(xiě)完屏蔽掉,這里設(shè)置了37K的eeprom
        for(j=0;j<37887;j=j+512)
         IapErase(j);
        */
        /***先把數(shù)據(jù)寫(xiě)入eeprom
                p=gImage_picture;//gImage_picture是頭文件中的圖像數(shù)組的名

        for (j=0;j<36960;j++)
        {
                //dat=*p;//從目標(biāo)位置取操作數(shù)據(jù),本例是直接把數(shù)據(jù)源位置寫(xiě)入
                IapProgram(j,*p);//把數(shù)據(jù)寫(xiě)入指定位置
                p++;//源數(shù)據(jù)地址加一
               
        }
*/
//讀eeprom數(shù)據(jù)文件并顯示出來(lái)
for (cont=0;cont<10;cont++)
{
        IapReadmany(cont*3696,3696,buffer);//讀一組數(shù)據(jù),因?yàn)閤data空間限制,要分次讀到,次數(shù)與每次的數(shù)量的積正好為全部數(shù)據(jù),這個(gè)讀取函數(shù)很厲害,一句就把需要的數(shù)據(jù)讀到緩沖區(qū)了

        lcm_dma_test(0,(0+cont*12),154,120,3696,buffer);//分四個(gè)位置顯示,因?yàn)榭臻g限制,不能存下全屏用的數(shù)據(jù),只存了四分之一幅
while(!(DMA_LCM_STA&0x01));//這時(shí)本應(yīng)該做其它事,可我打算繼續(xù)刷屏,所以只好等待
        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);//顯示時(shí)鐘秒位
digit_display(160,96,MIN);//顯示時(shí)鐘分位,只為測(cè)試,隨意顯示的

        }
}

void LCMIF_DMA_Interrupt(void) interrupt 13
{
        if(DMA_LCM_STA& 0x01)//lcm中斷請(qǐng)求標(biāo)志位
        {
        //        LCMIFSTA = 0x00;//清中斷標(biāo)志位
                        DMA_LCM_STA = 0x00; //清除 DMA 狀態(tài)
//LcmFlag = 0;
        }
        /***先屏蔽DMA內(nèi)容
        if(DMA_LCM_STA & 0x01)//lcm的dma中斷請(qǐng)求標(biāo)志位
        {
                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官方數(shù)據(jù)手冊(cè)的例程。特別是中斷程序,是照抄的。如果哪句在官方手冊(cè)里沒(méi)有,一定是我自己造改的。
tft_320_drv.c里的寫(xiě)數(shù)據(jù)函數(shù):

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;
        */
}

這是個(gè)基礎(chǔ)函數(shù),使用這個(gè)函數(shù)說(shuō)明使用了LCM功能,這個(gè)功能能提高芯片的工作效率,這種用法就是把LCM功能日常化使用了。
這里附了一個(gè)舊函數(shù),方便不能使用LCM功能的朋友使用其它兩項(xiàng)功能(eeprom和dma).
STC官方數(shù)據(jù)手冊(cè)上的寫(xiě)數(shù)據(jù)程序是這樣的:
#define LCM_WRDB(d)  LCM_WR = 0;\  
                                       LCM_DB = (d);\
                                         _nop_();\
                                      LCM_WR = 1  

做為新人,看不太懂,但感覺(jué)是用了LCM這個(gè)名子,但沒(méi)用LCM功能。
圖像數(shù)據(jù)放在頭文件Picture里,使用這個(gè)程序時(shí)需要自己做個(gè)圖形數(shù)據(jù)的頭文件。我自己的圖不太嚴(yán)謹(jǐn)就不上傳了。自己做圖里要考慮圖像的大小與屏,eeprom空間容量的關(guān)系,我用了一半的eeprom存了四分之一屏的圖像。約37K。320*240*2/1024=37.5k
完整程序在附件中,歡迎查閱,吐槽和指正。
補(bǔ)充一句,stc32g12k128的eeprom容量是在stc-isp軟件里設(shè)置的。如圖所示的位置。

stc-isp.png (35 KB, 下載次數(shù): 91)

stc-isp.png

例圖.png (7.23 KB, 下載次數(shù): 81)

例圖.png

hard_test.zip

312.19 KB, 下載次數(shù): 25, 下載積分: 黑幣 -5


作者: 麗江春水    時(shí)間: 2023-2-1 08:20
補(bǔ)充一下:
1,做為學(xué)習(xí)階段的例程,程序中還使用了外晶振和內(nèi)部RTC時(shí)鐘源,沒(méi)有安裝外晶振的朋友可以把相關(guān)語(yǔ)句屏蔽掉,系統(tǒng)會(huì)自動(dòng)選擇內(nèi)部高速時(shí)鐘源,其頻率可在STC-ISP軟件界面選定。
2,緩沖數(shù)組的確定和程序中幾個(gè)數(shù)字的解釋?zhuān)以谶@個(gè)程序中用了一個(gè)隨手拿來(lái)的圖片,經(jīng)軟件(Image2Lcd或其它)縮小后大小為154*120(320和240兩者只能照顧一個(gè))。其數(shù)據(jù)量為:
154*120*2=36960(字節(jié))
選擇緩沖數(shù)組3696一是該 值小于8K(stc32g12k128的xdata空間是8K,DMA緩沖數(shù)組只能放在這個(gè)空間)
二是總數(shù)據(jù)量正好分十次讀完(整除)。三是3696/154/2=12.就是刷屏?xí)r正好12行(整除),所以程序中出現(xiàn)了3696,154,120,12這幾個(gè)數(shù)字,如果哪位同學(xué)的圖像數(shù)據(jù)不同,可按這個(gè)關(guān)系自己確定相應(yīng)的常數(shù)。
3,調(diào)試程序時(shí)借助了stc-usb link1d工具,進(jìn)行硬件仿真,用它可以清楚地看到程序運(yùn)行到哪一步,各種變量的變化,及數(shù)組內(nèi)數(shù)值的變化。明顯的減少了調(diào)試時(shí)間。記得聽(tīng)過(guò)一句話,說(shuō)程序不是寫(xiě)出來(lái)的,是調(diào)出來(lái)的。意思大概是寫(xiě)一個(gè)程序并不難,但寫(xiě)完后難免存在各種小bug.一點(diǎn)小問(wèn)題可能耽誤很多時(shí)間,甚至調(diào)錯(cuò)方向,把對(duì)的改成錯(cuò)的,結(jié)果越調(diào)越亂(我這種新人難免出這種情況),有了硬件仿真,就容易多了。程序卡在哪里,一看就知道,針對(duì)性的進(jìn)行調(diào)整,容易多了,記得卡的最多的是外晶振無(wú)法開(kāi)啟(這也是上來(lái)做補(bǔ)充說(shuō)明的原因)到現(xiàn)在我也沒(méi)能把控時(shí)鐘管理。只到了能用的程度,出現(xiàn)問(wèn)題時(shí),沒(méi)能力解決這方面的問(wèn)題。而最夸張的一次是完全正確的程序,執(zhí)行時(shí)卻連第一行都沒(méi)進(jìn)去。如果沒(méi)有硬件仿真器支持,真的要多花太多時(shí)間去查。
作者: STC莊偉    時(shí)間: 2023-2-2 09:47
我也在學(xué)  
真12位ADC, 熱敏電阻/NTC 測(cè)溫 《STC32位8051單片機(jī)原理及C語(yǔ)言程序設(shè)計(jì) 視頻教程》,第19集

作者: 麗江春水    時(shí)間: 2023-2-3 13:10
STC莊偉 發(fā)表于 2023-2-2 09:47
我也在學(xué)  
真12位ADC, 熱敏電阻/NTC 測(cè)溫 《STC32位8051單片機(jī)原理及C語(yǔ)言程序設(shè)計(jì) 視頻教程》,第19集

NTC的性能參數(shù)我不熟。沒(méi)搞這方面的驗(yàn)證實(shí)驗(yàn),只做了ds18b20的測(cè)溫實(shí)驗(yàn)。
作者: 麗江春水    時(shí)間: 2023-2-3 13:14
STC莊偉 發(fā)表于 2023-2-2 09:47
我也在學(xué)  
真12位ADC, 熱敏電阻/NTC 測(cè)溫 《STC32位8051單片機(jī)原理及C語(yǔ)言程序設(shè)計(jì) 視頻教程》,第19集

后來(lái)才知道在屠龍刀核心板上就設(shè)計(jì)安裝了NTC測(cè)溫電路的,直接編程就能調(diào)試了




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1