📄 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 + -