不可否认的是,编译器的设计很难。P18CC的源代码全部是白手起家,<br />一个字符一个字符地输入,其中的数据结构很复杂,几句话是讲不明<br />白的。<br /><br />已经使用该改编译器做了一个MP3,用pic18f2520控制,下面是main()<br />的代码:<br /><br />#include <p18f2520.h><br />#include <stdio.h><br />#include "define.h"<br />#include "timer0.h"<br />#include "pwr.h"<br />#include "spi.h"<br />#include "key.h"<br />#include "vs1011.h"<br />#include "lcd3310.h"<br />#include "nokialcd.h"<br />#include "mmcfile.h"<br />#include "play.h"<br /><br />#pragma CONFIG1H 0x88<br />#pragma CONFIG2L 0x1e<br />#pragma CONFIG2H 0x1e<br />#pragma CONFIG3H 0x81<br />#pragma CONFIG4L 0xc1<br /><br />//#pragma short_branch<br />//#pragma short_call<br /><br />enum {<br /> MP3_READY,<br /> MP3_PLAY,<br /> MP3_PAUSE,<br /> MP3_STOP,<br /> MP3_SKIP,<br /> MP3_DELAY<br />};<br /><br />void turn_off (void);<br />char key_process (char mp3_status, unsigned int *music_cnt);<br />void VS1011_test (void);<br /><br />//char *string3 = "MMC file ok!";<br /><br />////////////////////////////////////////////////////////////////////<br />#pragma void_return<br />void main ()<br />{<br /> bank0 static unsigned char mp3_status = MP3_READY;<br /><br /> ADCON1 = 0x07; // set PORTA as digital port<br /> OSCCON = 0x60; // INCOSC block on: 4MHz, primary mode<br /> OSCTUNE |= 0x4f; // PLLEN = 1: enable PLLx4<br />// PLLEN = 0; // PLLEN = 0: disable PLLx4<br /> SWDTEN = 0;<br /><br /> LATC |= 3; // LED pin init<br /> TRISC &= ~3;<br /><br /> CMCON = 0x02; // comparator mode<br /> CVRCON = 0xc0 + 10; // reference valtage mode and voltage<br /><br /> KEY_init ();<br /> TMR0_Init ();<br /><br /> /* devices initialization */<br /> SPI_init ();<br /> VS1011_init ();<br /> LCD_init ();<br /><br /> // wait for power buttom really pressed<br /> while ( PWR_status == PWR_INIT );<br /><br /> TRISA &= ~(1 << 3);<br /> LATA |= (1 << 3);<br /><br /> for (;;)<br /> {<br /> LCD_clear();<br /> LCD_write_stringROM (0, 1, "Check MMC SPI ");<br /><br /> if ( MMC_Init () != MMC_OK )<br /> {<br /> LCD_clear();<br /> LCD_write_stringROM (0, 1, "MMC SPI not OK!");<br /><br /> if ( PWR_status == PWR_OFF )<br /> turn_off ();<br /><br /> continue;<br /> }<br /><br /> LCD_write_stringROM (0, 1, "MMC SPI OK!");<br /><br /> if ( FILE_InitEntry () == FILE_OK )<br /> {<br /> LCD_write_stringROM (0, 1, "MMC file OK!");<br /> LCD_write_stringROM (0, 2, "search...");<br /><br /> PLAY_ctrlBlk.totalMusic = FILE_searchMP3Files ();<br /> PLAY_ctrlBlk.currentMusic = 1;<br /><br /> mp3_status = MP3_READY;<br /> VS1011_setVol (30);<br /><br /> while ( PWR_status != PWR_OFF )<br /> {<br /> if ( PLAY_ctrlBlk.currentMusic > PLAY_ctrlBlk.totalMusic )<br /> PLAY_ctrlBlk.currentMusic = 1;<br /> else if ( PLAY_ctrlBlk.currentMusic == 0 )<br /> PLAY_ctrlBlk.currentMusic = PLAY_ctrlBlk.totalMusic;<br /><br /> FileDesc_t *fp = FILE_FindFile (PLAY_ctrlBlk.currentMusic);<br /><br /> if ( fp == NULL )<br /> break;<br /><br /> PLAY_init (fp);<br /><br /> unsigned char play_status, delay_time;<br /><br /> play_status = PLAY_OK;<br /><br /> do<br /> {<br /> mp3_status = key_process (mp3_status, &PLAY_ctrlBlk.currentMusic);<br /><br /> switch ( mp3_status )<br /> {<br /> case MP3_PLAY:<br /> play_status = PLAY_music (0);<br /> break;<br /><br /> case MP3_SKIP:<br /> PLAY_music (100); // skip 100 sectors of data<br /> delay_time = TMR0_cnt;<br /> mp3_status = MP3_DELAY;<br /> break;<br /><br /> case MP3_DELAY:<br /> if ( TMR0_Elapsed (delay_time) >= (750/5) )<br /> mp3_status = MP3_PLAY;<br /> break;<br /><br /> case MP3_STOP:<br /> PLAY_fade_out ();<br /> play_status = PLAY_DONE;<br /> mp3_status = MP3_READY;<br /> break;<br /> }<br /><br /> } while ( play_status != PLAY_DONE && play_status != PLAY_ERR && PWR_status != PWR_OFF );<br /><br /><br /> if ( mp3_status == MP3_PLAY && play_status == PLAY_DONE )<br /> PLAY_ctrlBlk.currentMusic++;<br /> }<br /> }<br /><br /> if ( PWR_status == PWR_OFF )<br /> turn_off ();<br /> }<br />}<br /><br />/////////////////////////////////////////////////////////////////////////<br />#pragma void_return<br />void turn_off (void)<br />{<br /> LCD_clear();<br /><br /> for(;;)<br /> LATA &= ~(1 << 3);<br />}<br /><br />/////////////////////////////////////////////////////////////////////////<br />char key_process (char mp3_status, unsigned int *music_cnt)<br />{<br /> switch ( KEY_get () )<br /> {<br /> case KEY_PLAY:<br /> switch ( mp3_status )<br /> {<br /> case MP3_READY:<br /> case MP3_PAUSE:<br /> KEY_ctrl = MODE_KEY_DISABLED;<br /> return MP3_PLAY;<br /><br /> case MP3_PLAY:<br /> KEY_ctrl = MODE_KEY_ENABLED;<br /> return MP3_PAUSE;<br /> }<br /> break;<br /><br /> case KEY_UP:<br /> switch ( mp3_status )<br /> {<br /> case MP3_PLAY:<br /> WREG = VS1011_incVol ();<br /> LCD_volStatus (WREG);<br /> break;<br /><br /> case MP3_READY:<br /> case MP3_PAUSE:<br /> (*music_cnt)++;<br /> return MP3_STOP;<br /> }<br /> break;<br /><br /> case KEY_DOWN:<br /> switch ( mp3_status )<br /> {<br /> case MP3_PLAY:<br /> WREG = VS1011_decVol ();<br /> LCD_volStatus (WREG);<br /> break;<br /><br /> case MP3_READY:<br /> case MP3_PAUSE:<br /> (*music_cnt)--;<br /> return MP3_STOP;<br /> }<br /> break;<br /><br /> case KEY_UP | KEY_MODE:<br /> if ( mp3_status == MP3_PLAY || mp3_status == MP3_DELAY )<br /> {<br /> if ( mp3_status == MP3_PLAY ) // fade out the sound<br /> PLAY_fade_out (); // when in PLAY status,<br /> // to reduce jitter<br /> return MP3_SKIP;<br /> }<br /> break;<br /><br /> case KEY_MODE:<br /> KEY_ctrl = MODE_KEY_DISABLED;<br /> return MP3_STOP;<br /> }<br /><br /> return mp3_status;<br />}<br /><br />
|