📄 voice.c
字号:
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
#define ROM XBYTE[0X8001]
#define SECOND XBYTE[0XA000]
#define MINUTE XBYTE[0XA002]
#define HOUR XBYTE[0XA004]
#define WEEK XBYTE[0XA006]
#define DATE XBYTE[0XA007]
#define MONTH XBYTE[0XA008]
#define YEAR XBYTE[0XA009]
#define REG_A XBYTE[0XA00A]
#define REG_B XBYTE[0XA00B]
#define REG_C XBYTE[0XA00C]
#define CENTURY XBYTE[0XA032]
#define SEG7_DATA XBYTE[0X8003]
#define SEG7_SCAN XBYTE[0X8004]
#define I2C_ADDR XBYTE[0X8005]
#define READ_KEY XBYTE[0X8006]
#define K1 0XfE
#define K2 0xfd
#define K3 0xfb
#define K4 0xf7
#define K5 0xef
#define K6 0xdf
#define K7 0xbf
#define K8 0X7F
#define ERRORCOUNT 10
sbit MISO=P1^0;
sbit MOSI=P1^1;
sbit RAC =P3^5;
sbit SCLK=P1^2;
sbit SS =P1^3;
sbit SDA=P1^6;
sbit SCL=P1^5;
uchar code seg7_a[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X00,0XFF,0x8c,0xc7,0x88,0x91,0xaf,0x86,0xa7};
// 0 1 2 3 4 5 6 7 8 9 8. P L A Y r E c
uchar code seg7_b[19]={0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8,0x40,0x50,0X00,0XFF,0x8c,0xc7,0x88,0x91,0xaf,0x86,0xa7};
uchar code scan_tab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned long int sec_count;
unsigned int timer;
unsigned int Segment;
unsigned int CurrentSeg;
unsigned int iic_addr=0; //操作 IIC 存储器内部地址
unsigned long int start; // 延时播放参数
bit VoiceRun;
bit sec_flag;
bit BufferFlag;
uchar row;
uchar key;
uchar prekey;
bit keyflag;
bit EomFlag;
bit OvfFlag;
uchar idata led_buffer[4];
bit OVF;
bit EOM;
bit rflag;
uint RAC_Read;
uint RAC_Count;
uchar status;
uchar idata rdata[6];
uchar data sbufcount;
enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
enum eepromtype EepromType;
/***********************************************************************************/
bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
unsigned char ControlByte,enum eepromtype EepromType)
{
void Delay(unsigned char DelayCount);
void IICStart(void);
void IICStop(void);
bit IICRecAck(void);
void IICNoAck(void);
void IICAck(void);
unsigned char IICReceiveByte(void);
void IICSendByte(unsigned char sendbyte);
unsigned char data j,i=ERRORCOUNT;
bit errorflag=1;
while(i--)
{
IICStart();
IICSendByte(ControlByte&0xfe);
if(IICRecAck())
continue;
if(EepromType>M2416)
{
IICSendByte((unsigned char)(Address>>8));
if(IICRecAck())
continue;
}
IICSendByte((unsigned char)Address);
if(IICRecAck())
continue;
if(!(ControlByte&0x01))
{
j=ByteQuantity;
errorflag=0; //********clr errorflag
while(j--)
{
IICSendByte(*DataBuff++);
if(!IICRecAck())
continue;
errorflag=1;
break;
}
if(errorflag==1)
continue;
break;
}
else
{
IICStart();
IICSendByte(ControlByte);
if(IICRecAck())
continue;
while(--ByteQuantity)
{
*DataBuff++=IICReceiveByte();
IICAck();
}
*DataBuff=IICReceiveByte(); //read last byte data
IICNoAck();
errorflag=0;
break;
}
}
IICStop();
if(!(ControlByte&0x01))
{
Delay(255);
Delay(255);
Delay(255);
Delay(255);
}
return(errorflag);
}
/*****************以下是对IIC总线的操作子程序***/
/*****************启动总线**********************/
void IICStart(void)
{
SCL=0; //
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=1; //
}
/*****************停止IIC总线****************/
void IICStop(void)
{
SCL=0;
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
SCL=0;
}
/**************检查应答位*******************/
bit IICRecAck(void)
{
SCL=0;
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
CY=SDA; //因为返回值总是放在CY中的
SCL=0;
return(CY);
}
/***************对IIC总线产生应答*******************/
void IICACK(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
SDA=1;
}
/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
/*******************向IIC总线写数据*********************/
void IICSendByte(unsigned char sendbyte)
{
unsigned char data j=8;
for(;j>0;j--)
{
SCL=0;
sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
SDA=CY;
SCL=1;
}
SCL=0;
}
/**********************从IIC总线上读数据子程序**********/
unsigned char IICReceiveByte(void)
{
register receivebyte,i=8;
SCL=0;
while(i--)
{
SCL=1;
receivebyte=(receivebyte<<1)|SDA;
SCL=0;
}
return(receivebyte);
}
/***************一个简单延时程序************************/
void Delay(unsigned char DelayCount)
{
while(DelayCount--);
}
void Delay_ms(uchar delay)
{
uint i;
while(delay--)
{
i=500;
while(i--);
}
}
unsigned long int GetStartDelay(uint segment)
{
union
{
uchar byte[4];
unsigned long int spd;
} num;
uint iic_addr;
iic_addr=segment*8;
RW24XX(num.byte,4,iic_addr,0xa1,M24256);
return(num.spd);
}
void SaveStartDelay(uint segment,unsigned long delay)
{
union
{
uchar byte[4];
unsigned long int spd;
} num;
uint iic_addr;
num.spd=delay;
iic_addr=segment*8;
RW24XX(num.byte,4,iic_addr,0xa0,M24256);
}
uint CheckStartDelay(unsigned long delay)
{
union
{
uchar byte[4];
unsigned long int spd;
} num;
uint iic_addr;
uint seg;
for(seg=0;seg<4096;seg++)
{
iic_addr=seg*8;
RW24XX(num.byte,4,iic_addr,0xa1,M24256);
if(num.spd==delay)
break;
}
if(seg>4095)
seg=0;
return(seg);
}
uint ISD_WriteByte(uint addr,uchar command)
{
uchar j;
uint rac;
rac=0;
SCLK=1;
SS=0;
for(j=0;j<16;j++)
{
SCLK=0;
if(j==0)
{
OVF=MISO;
}
else
if(j==1)
{
EOM=MISO;
}
else
{
if(MISO)
{
rac=rac|0x4000;
}
else
{
rac=rac&0x3fff;
}
rac=rac>>1;
}
if(addr&0x01)
MOSI=1;
else
MOSI=0;
addr=addr>>1;
SCLK=1;
}
for(j=0;j<8;j++)
{
SCLK=0;
if(command&0x01)
MOSI=1;
else
MOSI=0;
command=command>>1;
SCLK=1;
// SCLK=0;
}
SS=1;
return(rac);
}
void ISD_PowerUp()
{
ISD_WriteByte(0x00,0x20);
Delay_ms(50);
Delay_ms(50);
Delay_ms(50);
Delay_ms(50);
}
void ISD_Stop()
{
ISD_WriteByte(0x00,0x30);
VoiceRun=0;
}
void ISD_StopPwrDn()
{
ISD_WriteByte(0x00,0x10);
VoiceRun=0;
}
void ISD_REC()
{
ISD_WriteByte(0x00,0xb0);
VoiceRun=1;
}
void ISD_SET_REC(uint addr)
{
ISD_WriteByte(addr,0xa0);
VoiceRun=1;
}
void ISD_Play()
{
ISD_WriteByte(0x00,0xf0);
VoiceRun=1;
}
void ISD_SetPlay()
{
ISD_WriteByte(0,0xe0);
VoiceRun=1;
}
void ISD_MC()
{
ISD_WriteByte(0x00,0xf8);
VoiceRun=1;
}
void ISD_SET_MC()
{
ISD_WriteByte(0x00,0xe8);
VoiceRun=1;
}
void RINT()
{
ISD_WriteByte(0x00,0x30);
VoiceRun=0;
}
uint ByteToInt(uchar byte1,byte2)
{
union
{
uchar byte[2];
uint int_num;
} Num;
Num.byte[0]=byte2;
Num.byte[1]=byte1;
return(Num.int_num);
}
void ResetCounter()
{
TH1=0;
TL1=0;
}
void DispIntToLED(unsigned int num)
{
led_buffer[0]=num%10;
led_buffer[1]=(num%100)/10;
led_buffer[2]=(num%1000)/100;
led_buffer[3]=num/1000;
}
unsigned int Total_Segment()
{
unsigned int segment;
segment=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -