#include"at89x52.h"
#include"intrins.h"
#include"yejing.h"
#define Isd_PowerUp 0x20 //上电指令
#define Isd_SetPlay 0xe0 //设置放音地址指令
#define Isd_Stop 0x30 //停止指令
sbit SS=P1^2; //片选低电平有效
sbit MOSI=P1^3; //串行输入端
sbit MISO=P1^4; //串行输出端
sbit SCLK=P1^5; //串行时钟
sbit key0=P3^3;//站点按键接口
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit Led0=P2^0;//站点指示灯接口
sbit Led1=P2^1;
sbit Led2=P2^2;
sbit Led3=P2^3;
unsigned int IntCnt=0;//360
unsigned char Currentaddr=0;
unsigned char Key_count=0;
const unsigned char code table[4]={
0,102,204,307
}; //录音地址
void T0_Init(void)//中段初始化
{
TMOD=0x01;
TH0=0x3c;
TL0=0xaf;
ET0=1;
TR0=0;
EA=1;
}
void Delay_ms(unsigned int ms)//延时函数,以毫秒为单位
{
unsigned int dt=0;
for(;ms>0;ms--)
for(dt=800;dt>0;dt--);
}
void EnableSpi(void)//4004片选选通函数
{
SS=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void DisableSpi(void) // 4004片选关闭函数
{
SS=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void SendByte(unsigned char Byte) //4004串行发送数据
{
unsigned char buf=0,i=0;
buf=0x01;
SCLK=0;
for(i=0;i<8;i++)
{
if(Byte&buf) MOSI=1;
else MOSI=0;
SCLK=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
buf=buf<<1;
}
SCLK=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void Pwr_Up(void) //上电函数
{
EnableSpi();
SendByte(Isd_PowerUp);
DisableSpi();
}
void Stop(void) //停止4004芯片当前工作函数
{
EnableSpi();
SendByte(Isd_Stop);
DisableSpi();
}
void SetPlay(unsigned int addr)//设置放音函数
{
unsigned char temp=0;
EnableSpi();
temp=(unsigned char)(addr);
SendByte(temp);
temp=(unsigned char)(addr>>8);
SendByte(temp);
SendByte(Isd_SetPlay);
DisableSpi();
}
void PlayRoutine(unsigned int addr) //放音程序
{
Pwr_Up();
Delay_ms(50);
Pwr_Up();
SetPlay(addr);
}
void KeyScan(void) //键盘扫描,检测放音地址及显示地址
{
if(key0==0)
{ Delay_ms(20);
if(key0==0)
{
Led0=0;
Led1=1;
Led2=1;
Led3=1;
display1();
while(key0==0);
PlayRoutine(0);
}
}
else if(key1==0)
{
Delay_ms(20);
if(key1==0)
{
Led0=1;
Led1=0;
Led2=1;
Led3=1;
display2();
while(key1==0);
PlayRoutine(102);
}
}
else if(key2==0)
{
Delay_ms(20);
if(key2==0)
{
Led0=1;
Led1=1;
Led2=0;
Led3=1;
display3();
while(key2==0);
PlayRoutine(204);
}
}
else if(key3==0)
{
Delay_ms(20);
if(key3==0)
{
Led0=1;
Led1=1;
Led2=1;
Led3=0;
display4();
while(key3==0);
PlayRoutine(307);
}
}
else return;
}
void main(void) // 主函数
{
T0_Init();
LCD_Init();
Pwr_Up();
Delay_ms(50);
Pwr_Up();
while(1)
{
KeyScan();
}
}
void T0_Int(void) interrupt 1 // 定时器0中断
{
TH0=0x3c;
TL0=0xaf;
IntCnt++;
if(IntCnt>360)
{
IntCnt=0;
Stop();
Led0=1;
Led1=1;
Led2=1;
Led3=1;
TR0=0;
}
}