?? main.c
字號:
#include <iom32v.h>
#pragma interrupt_handler Timer:11 Timer:12
#include "E:\CountWork\AVRMp3Oka\AVRMp3Ok\Lcd\LCD.H" //
#include "E:\CountWork\AVRMp3Oka\AVRMp3Ok\Usb\ch375x.h" // CH375 AVR 外部程序
#include "E:\CountWork\AVRMp3Oka\AVRMp3Ok\STA013\Sta013.h"//
#include "main.h"
#include "Ch375HFD.h"
#include <string.h>
//#define NO_USB 1
#define LED_Low() {PORTB|=8;}
#define LED_Hig() {PORTB&=0xf7;}
#define Light_On() {PORTB&=0xbf;}
#define Light_Off(){PORTB|=0x40;}
#define SoundRst_Low() {PORTA&=0xf7;}
#define SoundRst_Hig() {PORTA|=0x08;}
#define SoundDat_Low() {PORTB&=0xfd;}
#define SoundDat_Hig() {PORTB|=0x02;}
#define SoundClk_Low() {PORTB&=0xfe;}
#define SoundClk_Hig() {PORTB|=0x01;}
#define DC_Hig() {PORTB|=0x80;}
#define DC_Low() {PORTB&=0x7f;}
#define DCTest PINB&0x80
#define DCCLow 183
#define DCCMid 193
#define DCCHig 225
void KeyDo(void);
void KeySz(void);
void LrdDo(void);
void mDelaymS( UINT8 ms )
{
UINT16 i;
while ( ms -- ) for ( i = 2600; i != 0; i -- );
}
void Timer(void)
{
//if(!F_Sound){
TCNT0=0;
if(!F_DC)//
{
if(DCTest){DC_Low();}
else {DC_Hig();}
if(F_InDc<60)
{
if(++F_InDc>=60)
{
F_InDc=61;
Data[0+3]=Data[1+3]=Data[2+3]=0xdd;
LcdFlash1();
}
}
}
else{DC_Hig();}
if((++LightTime)>=100)
{
//SREG=0x00;
//TIMSK=0;
Light_Off();
LightTime=101;
}
}
}*/
}
void LightOn(void)
{
TCCR0=5;
SREG=0x80;
TIMSK=1; //TIMER0 Int
Light_On();
TCNT0=0;
LightTime=0;
}
//**************************************************毫秒
//**************************************************
//**************************************************
void mStopIfError( unsigned char iError ) /* 檢查操作狀態,如果錯誤則顯示錯誤代碼并停機 */
{
if ( iError == ERR_SUCCESS )//=0
{
return; /* 操作成功 */
}
while ( 1 )
{
LcdON(); /* LED閃爍 */
mDelaymS( 100 );
LcdOn();
Data[0]=0xff;
Data[1]=0xef;
Data[2]=0xff;
LcdSetNoub();
LcdFlash();
mDelaymS( 100 );
LcdOff();
mDelaymS( 100 );
}
}
//**************************************************
//**************************************************
//列舉文件
/*
*/
//****************************************************************************
unsigned char ListFile(unsigned char c) //列出本目錄下第N個文件
{
unsigned char i;
if(F_AB)
{
PATH[0]='/';
for(i=0;i<6;i++){PATH[i+1] = (ListPath[i]&0x0f)|0x30;}
PATH[7]='/'; //kinderpower
PATH[8] ='K';
PATH[9] ='P';
PATH[10]='/';
for(i=0;i<6;i++){PATH[i+11] = (ListPath[i]&0x0f)|0x30;}
PATH[17]='.';
for(i=0;i<3;i++){PATH[i+18] = (ListPath[i+6]&0x0f)|0x30;}
for(i=21;i<30;i++){PATH[i]=0;}
}
else
{
PATH[0]='/';
for(i=0;i<6;i++){PATH[i+1] = (ListPath[i]&0x0f)|0x30;}
PATH[7]='/';
for(i=0;i<6;i++){PATH[i+8] = (ListPath[i]&0x0f)|0x30;}
PATH[14]='.';
for(i=0;i<3;i++){PATH[i+15] = (ListPath[i+6]&0x0f)|0x30;}
for(i=18;i<30;i++){PATH[i]=0;}
}
if(c)
{
if(F_AB){for(i=10;i<40;i++){PATH[i]=0;}}//kp
else {for(i=7 ;i<40;i++){PATH[i]=0;}}
}
for(i=0;i<30;i++){mCmdParam.Open.mPathName[i]=PATH[i];}
//strcpy( (char *)mCmdParam.Open.mPathName, "/001005/001005.001");/* 搜索文件名,*為通配符,適用于所有文件或者子目錄 */
i = CH375FileOpen( ); /* 打開文件,如果文件名中含有通配符*,則為搜索文件而不打開 */
//if (i==ERR_FOUND_NAME) /* 搜索到與通配符相匹配的文件名,文件名及其完整路徑在命令緩沖區中 */
//if(c){if(i==ERR_OPEN_DIR)return(ERR_SUCCESS);}
if (i==ERR_SUCCESS||i==ERR_FOUND_NAME) { return(ERR_SUCCESS);}
else if(i==ERR_OPEN_DIR) { return(ERR_SUCCESS);}
else { /* 出錯 */ return i;}
}
//******************************************************************************
//按鍵處理
//******************************************************************************
//*************************************************************************************
extern const unsigned char Mp3[];
//解碼程序
unsigned char mDecoder(void)
{
UINT8 i;
UINT32 File_mSectorCount;
unsigned char Staty;
File_mSectorCount=0;
CH375vFileSize=CH375vFileSize+511;
STA013StopDec();
STARTMP3:
mCmdParam.Read.mSectorCount = FILE_BUF_SIZE/512;
mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF; //選擇緩沖區0
i = CH375FileReadX( ); /* 從文件讀取尾部零頭數據,如果原尾部沒有零頭數據,那么什么也讀不到,返回時mCmdParam.Read.mSectorCount為實際讀出扇區數 */
if(i!=ERR_SUCCESS)return i; //出錯則反回
mCmdParam.Read.mSectorCount = FILE_BUF_SIZE/512;
mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF1; //選擇緩沖區1
i = CH375FileReadX( ); /* 從文件讀取尾部零頭數據,如果原尾部沒有零頭數據,那么什么也讀不到,返回時mCmdParam.Read.mSectorCount為實際讀出扇區數 */
if(i!=ERR_SUCCESS)return i; //出錯則反回
File_mSectorCount+=2;
//************************
pBuf=0;
F_DEC=0;
F_Read=0;
LcdSetPlay(1);
LcdFlash();
F_Staty=0;
STA013StarDec();
while(1)
{
i=DataStrBit();//RAM 中 MP3流 輸出
if(i==0||i==2)
{
KeyRead();
if(F_Lrd){F_Lrd=0;LrdDo();}
if(F_Key)
{
LightOn();
F_InDc=0;
if (KeyBuf==0x21)//OK
{
if (KeyDownNoub==1){F_Rep=0;return (0);}
else if(KeyDownNoub==2){F_Rep=0;return (0);}
else if(KeyDownNoub==3){F_Rep=0;return (0);}
else if(KeyDownNoub==6){F_Rep=0;return (0);}
}
else if(KeyBuf==0x16)//PUSH
{
F_Key=0;
if(Staty==2)
{
STA013ResumeDec();
Staty=0;
LcdSetPlay(1);
}
else
{
Staty=2;
STA013PauseDec();
LcdSetPlay(2);
}
LcdFlash();
}
else if(KeyBuf==0x13)//>>
{
F_Key=0;
STA013PauseDec();
LcdSetPlay(4);
LcdFlash();
if((CH375vCurrentOffset+1024*200)>=CH375vFileSize)
{
STA013StopDec();
F_Staty=1;
return(0);
}
else
{
File_mSectorCount +=200;
mCmdParam.Locate.mSectorOffset = File_mSectorCount;//以扇區為單位,如果原文件是3字節,則從512字節開始添加
i = CH375FileLocate( );
}
mDelaymS( 50 );
LcdSetPlay(1);
LcdFlash();
goto STARTMP3;
}
else if(KeyBuf==3)//上
{
STA013StopDec();
F_Rep=0;
return(0);
}
else if(KeyBuf==0x22)//重復
{
STA013StopDec();
return(0);
}
else if(KeyBuf==0x24)//下
{
STA013StopDec();
F_Rep=0;
return(0);
}
else if(KeyBuf==0x7)//<<
{
F_Key=0;
STA013PauseDec();
if(File_mSectorCount >= 250){File_mSectorCount-=250;}
else {File_mSectorCount=0;}
LcdSetPlay(3);
LcdFlash();
mCmdParam.Locate.mSectorOffset = File_mSectorCount;//以扇區為單位,如果原文件是3字節,則從512字節開始添加
i = CH375FileLocate( );
mDelaymS( 50 );
LcdSetPlay(1);
LcdFlash();
goto STARTMP3;
}
else if(KeyBuf==0x23)//X
{
F_Key=0;
KeyDownNoub=0;
Data[0]=0xff;Data[1]=0xff;
Data[2] =CourntPath[6]<<4;
Data[2]|=CourntPath[7];
LcdFlash();
}
else if(KeyBuf==0x19)//手動
{
F_Key=0;
LcdSetHand(0);
F_Sys&=0xfe;
WriteSys();
LcdFlash();
F_Auto=0;
}
else if(KeyBuf==0x10)//自動
{
F_Key=0;
LcdSetHand(1);
F_Sys|=0x01;
WriteSys();
LcdFlash();
F_Auto=1;
}
else if(KeyBuf==0x2)//A
{
STA013StopDec();
return(0);
}
else if(KeyBuf==0x5)//B
{
STA013StopDec();
return(0);
}
else if(KeyBuf==1)//VOL+
{
F_Key=0;
VOL-=2;
if(VOL>0x20){VOL=0;}
STA013VOL();
}
else if(KeyBuf==4)//VOL-
{
F_Key=0;
VOL+=2;
if(VOL>0x20){VOL=0x20;}
STA013VOL();
}
else{KeySz();}
F_Key=0;
}
//-----------------------------------------------------
if(F_Read) //數據更新請求
{
Read:
if(F_DEC)
{
F_Read=0;
mCmdParam.Read.mSectorCount = FILE_BUF_SIZE/512;
mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF; //選擇緩沖區0
i = CH375FileReadX( ); /* 從文件讀取尾部零頭數據,如果原尾部沒有零頭數據,那么什么也讀不到,返回時mCmdParam.Read.mSectorCount為實際讀出扇區數 */
if(i!=ERR_SUCCESS)return i; //出錯則反回
File_mSectorCount++;
}
else
{
F_Read=0;
mCmdParam.Read.mSectorCount = FILE_BUF_SIZE/512;
mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF1; //選擇緩沖區0
i = CH375FileReadX( ); /* 從文件讀取尾部零頭數據,如果原尾部沒有零頭數據,那么什么也讀不到,返回時mCmdParam.Read.mSectorCount為實際讀出扇區數 */
if(i!=ERR_SUCCESS)return i; //出錯則反回
File_mSectorCount++;
}
if(mCmdParam.Read.mSectorCount ==0){F_Key=0;F_Staty=1;STA013StopDec(); return 0;} //讀到文件最后,沒有數據
if(F_Read){goto Read;}
}
//-----------------------------------------------------
}
}
return (0);
}
//******************************************************************************
//******************************************************************************
void main(void)
{
UINT8 i, c,k;
USB_WATI:
mDelaymS(100);
DDRB|=0xc8; //背光燈端口輸出
//**************************************************
KeyInit(); //按鍵初始化
ReadSys();
Light_On(); //打開背光
//----------------------------------------
PowOnTime++;
//if(PowOnTime<200){WriteSys();}//----------上電次數限定
//else{for(;;){}}
//----------------------------------------
if(F_Sys&0xf0){F_Sys=0;WriteSys();}
if(F_Sys&2){LED_Low();}
else {LED_Hig();}
//********************************上電延時
LcdON();
Data[0]=0x00;Data[1]=0;Data[2]=0;
mDelaymS(100 ); /* 延時100毫秒 */
LcdOn();
LcdSetNoub();
LcdFlash();
mDelaymS(100 ); /* 延時100毫秒 */
mDelaymS(100 ); /* 延時100毫秒 */
mDelaymS(100 ); /* 延時100毫秒 */
//*************************************************電池檢測1
DC_Hig(); //關閉充電
mDelaymS(10 );
i=TestPow();
if(i<=DCCMid)//如小于可靠工作電壓
{
F_DC=1; //充電標志
DC_Low(); //打開充電
mDelaymS(10 );
i=TestPow();
if(i<=DCCMid)
{
Data[0]=0x1f;Data[1]=0xff;Data[2]=0xff;
LcdFlash();
mDelaymS(100);
Light_Off(); //關閉背光
for(;;)
{
i=TestPow();
LcdFlash();
if(i<(DCCMid+5)){}//等待電壓升高
else{goto RunInit;}
}
}
else{DC_Hig();}
}
else{F_DC=1;}
RunInit:
//********************************Sta013
LcdON();
VOL=0; //音量設置最大
Mp3Start=0;
i=STA013Init();
mStopIfError(i);
Data[0]=0xff;
//Data[0]=i;
LcdFlash();
//********************************
//********************************CH375
CH375_PORT_INIT();//初試化CH375接口
mDelaymS(100); /* 延時100毫秒 */
mDelaymS(100); /* 延時100毫秒 */
mDelaymS(100); /* 延時100毫秒 */
i=CH375LibInit( );/* 初始化CH375程序庫和CH375芯片,操作成功返回0 */
mStopIfError( i );
Data[1]=0xff;
LcdFlash();
//*************************調試MP3 解碼器
//STA013StarDec();
//for(;;){StrBitFlash();}
//*************************
/* 其它電路初始化 */
while (1)
{
CH375DiskConnect(); /* 查詢U盤是插入 */
if( CH375DiskStatus >= DISK_CONNECT ) break; //ru如果有盤插入則向下執行
mDelaymS(100); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */
i=CH375LibInit( );
mDelaymS(100);
mDelaymS(100);
}
mDelaymS(100);
mDelaymS(100);
mDelaymS(100);
/* 檢查U盤是否準備好,有些U盤不需要這一步,但是某些U盤必須要執行這一步才能工作 */
for (i=0;i<5;i++)/* 有的U盤總是返回未準備好,不過可以被忽略 */
{
mDelaymS(100);
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */
}
Data[2]=0xff;
LcdSetPlay(0);
for(i=100;i!=0;i--){KeyRead();}
ReadSet();
CourntPath[6]=CourntPath[7]=0;
Data[0] =CourntPath[0]<<4;
Data[0]|=CourntPath[1];
Data[1] =CourntPath[2]<<4;
Data[1]|=CourntPath[3];
Data[2] =CourntPath[4]<<4;
Data[2]|=CourntPath[5];
LcdFlash();
F_Staty=0;//上電 MP3還未開起過
F_Key=0;
F_Lrd=0;
if(F_Sys&1){LcdSetHand(1);F_Auto=1;}
else {LcdSetHand(0);F_Auto=0;}
if(F_Sys&2){LcdSetAB(1);LED_Low();F_AB=1;}
else {LcdSetAB(0);LED_Hig();F_AB=0;}
LcdFlash();
LightOn();
///**********************************************************U盤調試
//strcpy( (char *)mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目錄下 */
//i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經存在則先刪除后再新建 */
//mStopIfError( i );
//i = CH375FileClose( );
//mStopIfError( i );
///**********************************************************
//SoundData=0x0e;
//SoundV();
//for(;;){}
//******************************************************************************
//******************************************************************************
for(;;)
{
CH375DiskConnect(); /* 查詢U盤是插入 */
if( CH375DiskStatus == DISK_DISCONNECT ) goto USB_WATI;
//-----------------------------------------------------電池檢測2
if(DCTest)
{
TIMSK=0;
i=TestPow();
TIMSK=1;
if(i<=DCCMid)//如小于可靠工作電壓
{
if(F_DC)
{
Data[0+3]=Data[1+3]=Data[2+3]=0xdd;
LcdFlash1();
}
F_DC=0; //充電標志
DC_Low(); //打開充電
mDelaymS(2);
TIMSK=0;
i=TestPow();
if(i<=DCCLow)
{
TIMSK=0;
SREG=0;
Light_Off();
Data[0]=0x1f;Data[1]=0xff;Data[2]=0xff;
LcdFlash();
goto USB_WATI;
}
TIMSK=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -