//**************************************
// Moving Sign V:1.0
// Version 1.0 Dec 2003
// Sylvain Bissonnette
//
// Clock : 8Mhz
// Stack : 32
//**************************************
#include <macros.h>
#include <stdlib.h>
#include <iom8v.h>
#include <eeprom.h>
#include <STRING.H>
#define VERSION 10
#define TRUE 0x01
#define FALSE 0x00
#define SPIDDR DDRB
#define SPIPORT PORTB
#define SPIPIN PINB
#define SCLK 0x20
#define MOSI 0x08
#define MISO 0x10
#define CS 0x04
#define MMCPOWER 0x80
#define D_OUT 0x04
#define LAT 0x08
#define EN 0x10
#define TXD 0x20
#define LED 0x04
//static const char FontLookup [][5] =
//{
// { 0x3c, 0x41, 0x42, 0x20, 0x7c } // ?
//};
//**************************************
// P R O T O T Y P E
//**************************************
void main(void);
void uart1_rx_isr(void);
void adc_isr(void);
void Delay_1ms(int Del);
void PLAY_ANI(unsigned long Ani_End, unsigned int Speed);
void Delay(int del);
int MMCInit(void);
void MMCInfo(void);
int MMCReadSector(unsigned long lba, unsigned char * s);
int MMCWriteSector(unsigned long lba, unsigned char *s);
unsigned char MMCGet(void);
unsigned char MMCDataToken(void);
void MMCCommand(unsigned char command, unsigned int px, unsigned int py);
unsigned char SpiByte(unsigned char byte);
unsigned char read_VFAT_info(void);
unsigned int Search_File(unsigned int num);
unsigned int read_word(unsigned int addr);
unsigned int next_cluster(unsigned int c, unsigned long sec, unsigned int remain);
char play_music(unsigned int fn);
unsigned int SectorNum =0;
unsigned char DataBuff[512];
unsigned char FATtype; // 0:FAT12 1:FAT16
unsigned char SectorsPerCluster;
unsigned int RootDirEntriesCount;
unsigned int FATstart;
unsigned int DIRstart;
//unsigned int DataStart;//0-65535
unsigned long DataStart;//0-4294967295
unsigned int PlayMusic; //
//unsigned int n;
unsigned int FileCount;
unsigned long FileSize;
//unsigned char FatCache[256];
unsigned long FatCacheAddr;
unsigned int Cluster; //
unsigned int NextCluster; //
long RemainSec; //
unsigned char NewData = FALSE;
char RxBuffer[264];
void putchar(unsigned char c)
{
while (!(UCSRA&(1 << UDRE))); //判断上次发送有没有完成
UDR = c;
}
/* 字符串输出函数 */
int puts(char *s)
{
while (*s)
{
putchar(*s);
s++;
}
putchar(0x0a);//回车换行
putchar(0x0d);
return 1;
}
void DisPlay(void)
{
unsigned char ch;
unsigned int i,j;
unsigned char scnt;
PORTD &=~EN;
for(j=0;j<512;j++)//512*4+352=2400
{
if (DataBuff[j]==0)
{
PORTD &=~D_OUT;
PORTD &=~D_OUT;}
else
{ PORTD |=D_OUT;
PORTD |=D_OUT;}
PORTD &= ~TXD;
PORTD &= ~TXD;
PORTD &= ~TXD;
PORTD |= TXD;
PORTD |= TXD;
PORTD |= TXD;
}
}
void DisPlay_END(void)
{
unsigned char ch;
unsigned int i,j;
unsigned char scnt;
PORTD &=~EN;
for(j=0;j<352;j++)//2400-512*4=352
{
if (DataBuff[j]==0)
{
PORTD &=~D_OUT;
PORTD &=~D_OUT;}
else
{ PORTD |=D_OUT;
PORTD |=D_OUT;}
PORTD &= ~TXD;
PORTD &= ~TXD;
PORTD &= ~TXD;
PORTD |= TXD;
PORTD |= TXD;
PORTD |= TXD;
}
PORTD &=~LAT;
PORTD &=~LAT;
PORTD &=~LAT;
PORTD |=LAT;
PORTD |=LAT;
PORTD |=LAT;
}
void Delay(int del)
{
int i,j;
for (j=0;j<del;j++)
{
for (i=0;i<320;i++);
}
}
void PLAY_ANI(unsigned long Ani_End, unsigned int Speed)
{
PORTC ^=LED;
SectorNum++;
MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
DisPlay();
SectorNum++;
MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
DisPlay();
SectorNum++;
MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
DisPlay();
SectorNum++;
MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
DisPlay();
SectorNum++;
MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
DisPlay_END();
Delay(Speed);
if (SectorNum>=Ani_End)
SectorNum=568-1;
}
//**************************************
// M A I N
//**************************************
void main(void)
{
int x = 0;
int i = 0;
unsigned int POS =568;//FAT16格式中,第一个文件的起始扇区位置
unsigned char ANI_END_POS_0 =0;//FAT16格式中,第一个文件的结束扇区位置(最低位)
unsigned char ANI_END_POS_1 =0;//FAT16格式中,第一个文件的结束扇区位置
unsigned char ANI_END_POS_2 =0;//FAT16格式中,第一个文件的结束扇区位置
unsigned char ANI_END_POS_3 =0;//FAT16格式中,第一个文件的结束扇区位置(最高位)
unsigned long ANI_END_POS =0;//FAT16格式中,第一个文件的结束扇区位置
unsigned char ANI_Speed_L =0;//
unsigned char ANI_Speed_H =44;//
unsigned int ANI_Speed;//播出速度
unsigned int fn;
unsigned int vvv,vvvv;//adc5
char r;
////////////////////////////////////////////////////////////////////////////////
DDRC =0x00;//adc5
PORTC =0x00;
ADCSRA =0x00;
ADMUX =(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(1<<MUX0); //采用内部2.56参考电压,ADC5输入
ACSR= (1<<ACD);
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC转换 64分频
////////////////////////////////////////////////////////////////////////////////
DDRD =0xff;
PORTD |=0xff;
PORTD |=TXD;
PORTD |=LAT;
PORTD &=~EN;
PlayMusic=1;
fn=1;
UCSRB =0x00;//ATmega8L
UCSRA=0x00;//ATmega8L
UCSRA=BIT(U2X);//波特率*2
UCSRB = BIT(RXCIE)| BIT(RXEN) |BIT(TXEN); //允许串口发送和接收,并响应接收完成中断
UBRR = 25; //时钟4Mhz,波特率25:9600 12:19200
UCSRC = BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //8位数据+1位stop位
SEI();
ANI_END_POS_0=EEPROMread(0);//16进制
ANI_END_POS_1=EEPROMread(1);//16进制
ANI_END_POS_2=EEPROMread(2);//16进制
ANI_END_POS_3=EEPROMread(3);//16进制
ANI_END_POS=(ANI_END_POS_3 << 24)+(ANI_END_POS_2 << 16)+(ANI_END_POS_1 << 8)+ANI_END_POS_0;
//ANI_END_POS=1128;
// printf("ANI_END_POS: %u\n",SectorNum);
ANI_Speed_L=EEPROMread(4);//16进制
ANI_Speed_H=EEPROMread(5);//16进制
ANI_Speed=(ANI_Speed_H << 8)+ANI_Speed_L;
//ANI_Speed=500;
// printf("ANI_Speed: %u\n",SectorNum);
POS=568-1;
SectorNum=POS;
puts("启动...");
while (MMCInit() != 0) puts(".");
MMCInfo();
if (read_VFAT_info()) { printf("-ERROR-");}
while(1)
{
// puts("正常工作");
PLAY_ANI(ANI_END_POS,ANI_Speed);
// vvv=((25600/1023)*(ADCH*256+ADCL))/1000;//数据计算
// vvvv=((25600/1023)*(ADCH*256+ADCL))/1000;//数据计算
putchar(ADCH);
putchar(ADCL);
if (NewData == TRUE)
{
switch(RxBuffer[1]) //判断功能号
{
case 0x52://R
//printf("SectorNum: %u\n",SectorNum);
// Delay(100);
PLAY_ANI(ANI_END_POS,ANI_Speed);
// PLAY_ANI();
break;
case 0x53://S
{FileCount = Search_File(0xFFFF);
// printf("TXTFileCount: %u\n",FileCount);
if (fn != Search_File(fn))
{
}
FileSize = (unsigned long)DataBuff[28+64] + ((unsigned long)DataBuff[29+64]<<8)
+ ((unsigned long)DataBuff[30+64]<<16) + ((unsigned long)DataBuff[31+64]<<24);
// printf("FileSize is: %u\n",FileSize);
// FileName = &DataBuff[64];
// printf("FileName is:\n");
for (x=64;x<71;x++) putchar(DataBuff[x]);putchar('.');
for (x=72;x<75;x++) putchar(DataBuff[x]);
break;}
case 0x54://T
r = play_music(PlayMusic);
break;
case 0x57://W
{SectorNum = (((RxBuffer[2])-0x30)