|
春節在家無事,學習了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軟件里設置的。如圖所示的位置。
|
-
-
-
-
hard_test.zip
2023-1-31 15:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
312.19 KB, 下載次數: 25, 下載積分: 黑幣 -5
評分
-
查看全部評分
|