📄 gai610.c
字号:
i&=0x3f;
j=i;
i&=0xf0;
i>>=4;
led[6]=i; /*日的十位*/
i=j;
i&=0x0f;
led[7]=i; /*日的个位*/
//时
i=rd[2];
i&=0x3f;
j=i;
i&=0xf0;
i>>=4;
led[9]=i; /*时的十位*/
i=j;
i&=0x0f;
led[10]=i; /*时的个位*/
//分
i=rd[1];
i&=0x7f;
j=i;
i&=0xf0;
i>>=4;
led[11]=i; /*分的十位*/
i=j;
i&=0x0f;
led[12]=i; /*分的个位*/
//秒
i=rd[0];
i&=0x7f;
j=i;
i&=0xf0;
i>>=4;
led[13]=i; /*秒的十位*/
i=j;
i&=0x0f;
led[14]=i; /*秒的个位*/
}
/************************************************************************************
显示函数
*************************************************************************************/
void Display(uchar *s)
{ uchar i,k=0;
P3=0x00;
for(i=0;i<15;i++)
{ k=*s;
P0=tab[k];
Delay1ms(1);
P3+=1;
s++;
}
}
/**************************************************************************************
isd4004驱动
**************************************************************************************/
void Delay(uint i) /*isd4004专用延时程序*/
{
while(i--);
}
void Stopmode() /*停止*/
{
uchar m,i,j;
_cs=1;
_sclk=0;
_cs=0;
m=0x30;
for(i=0;i<8;i++)
{
m=_cror_(m,1);
j=m<<1;
_mosi=CY;
_sclk=0;
_sclk=1;
}
_cs=1;
}
void Powerdown() /*下电*/
{
uchar m,i,j;
_cs=1;
_sclk=0;
_cs=0;
m=0x10;
for(i=0;i<8;i++)
{
m=_cror_(m,1);
j=m<<1;
_mosi=CY;
_sclk=0;
_sclk=1;
}
_cs=1;
}
void Powerup() /*上电*/
{
uchar m,i,j;
_cs=1;
_sclk=0;
_cs=0;
m=0x20;
for(i=0;i<8;i++) /*参照8位命令格式*/
{
m=_cror_(m,1); /*循环右移*/
j=m<<1;
_mosi=CY; /*主控器应在串行时钟上升沿之前半个周期将数据送到本端*/
_sclk=0;
_sclk=1;
}
_cs=1;
}
void Record4004(uint address) /*录音 address--录音地址 0---2400*/
{
uchar i,m,j;
uint datasoute;
Powerup();
Delay1ms(50);/*上电延时*/
Powerup();
Delay1ms(50);/*上电延时*/
Delay1ms(50);/*上电延时*/
_cs=1;
_sclk=0;
m=0xa0;
_cs=0;
for(i=0;i<16;i++) /*发地址为00的SETREC命令*/
{
address=_iror_(address,1);
datasoute=address<<1;
_mosi=CY;
_sclk=0;
_sclk=1;
}
for(i=0;i<8;i++)
{
m=_cror_(m,1);
j=m<<1;
_mosi=CY;
_sclk=0;
_sclk=1;
}
_cs=1;
_sclk=0;
m=0xb0;
_cs=0;
for(i=0;i<8;i++) /*发REC指令*/
{
m=_cror_(m,1);
j=m<<1;
_mosi=CY;
_sclk=0;
_sclk=1;
}
_cs=1;
P1=0xff;
}
void Recording(uint address)
{
uchar i=0;
uchar hour,minute,second; /*用来保存td[9]中的时、分、秒、数据*/
uchar *pointer;
bit flag=0; /*录音满标志位*/
racaddress[tag]=rac_address; /*保存每段的首地址*/
segment[tag]=seg_ment; /*保存录音段的段号*/
tag++;
seg_ment++;
_segment=seg_ment;
TMOD=0x50; /*T1工作在计数方式1*/
pointer=&address; /*预置计数初值*/
TL1=*(pointer+1);
TH1=*pointer;
TR1=1; /*启动T1*/
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
hour=rd[2]; /*保存时分秒*/
minute=rd[1];
second=rd[0];
td[4]=td[3]=td[2]=0;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563,录音时pcf8563计时*/
}
while(kbscan()!=0x77&&flag!=1)
{
*(pointer+1)=TL1;
*pointer=TH1;
if(address==2400) /*如果rac到了2400行,就将flag置1,并将T1清0,退出循环*/
{
flag=1;
TL1=0;
TH1=0;
}
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
Ledsave();
Display(led); /*显示*/
}
Stopmode(); /*停止录音*/
TR1=0; /*停止T1*/
{
TL1+=3;
pointer=&rac_address;
*(pointer+1)=TL1;
*pointer=TH1;
} /*将T1的值加3后赋给rac_address*/
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
seg_ment--;
length[seg_ment][0]=rd[0]; /*保存录音秒长*/
length[seg_ment][1]=rd[1]; /*保存录音分长*/
seg_ment++;
}
{
second+=rd[0]; //pcf8563读出来的都是bcd数
if(second>=0x60)
{
i=1;
second-=0x60;
}
minute+=rd[1]+i;
i=0;
if(minute>=0x60)
{
i=1;
minute-=0x60;
}
hour+=rd[2]+i;
i=0;
}
{
td[4]=hour;
td[3]=minute;
td[2]=second;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563*/
}
if(flag==1) /*如果录音录满了led全亮3s作为提示*/
{
Ledcheck();
}
if(tag==4)
tag=0;
if(seg_ment==4)
{
seg_ment=0;
}
}
void Audioout(uint address) /*放音程序*/
{
uchar i,m,j;
unsigned int datasoute;
Powerup();
Delay1ms(50);//上电延时
_cs=1;
_sclk=0;
_cs=0;
m=0xe0;
for(i=0;i<16;i++)
{
address=_iror_(address,1);
datasoute=address<<1;
_sclk=0;
_mosi=CY;
_sclk=1;
}
for(i=0;i<8;i++)
{
m=_cror_(m,1);
j=m<<1;
_sclk=0;
_mosi=CY;
_sclk=1;
}
_cs=1;
_sclk=0;
m=0xf0;
_cs=0;
for(i=0;i<8;i++)
{
m=_cror_(m,1);
j=m<<1;
_sclk=0;
_mosi=CY;
_sclk=1;
}
_cs=1;
P1=0xff;
}
void Playing(uchar segment)
{
uchar hour,minute,second; /*用来保存td[9]中的时、分、秒、数据*/
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
hour=rd[2]; /*保存时分秒*/
minute=rd[1];
second=rd[0];
td[4]=td[3]=td[2]=0;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563,放音时pcf8563计时*/
}
while(_int==1)
{
IRcvStr(PCF8563,RDADDR,rd,0x07); /*读pcf8563*/
Ledplay(segment);
Display(led); /*显示*/
}
{
second+=rd[0]; //pcf8563读出来的都是bcd数
if(second>=0x60)
{
i=1;
second-=0x60;
}
minute+=rd[1]+i;
i=0;
if(minute>=0x60)
{
i=1;
minute-=0x60;
}
hour+=rd[2]+i;
i=0;
}
{
td[4]=hour;
td[3]=minute;
td[2]=second;
ISendStr(PCF8563,WRADDR,td,0x09); /*重写pcf8563*/
}
}
/**************************************************************************************
按键转化为相应的数字
**************************************************************************************/
uchar Key_number(uchar keycode)
{
uchar number;
if(keycode==0xee)
number=0;
if(keycode==0xde)
number=1;
if(keycode==0xbe)
number=2;
if(keycode==0x7e)
number=3;
if(keycode==0xed)
number=4;
if(keycode==0xdd)
number=5;
if(keycode==0xbd)
number=6;
if(keycode==0x7d)
number=7;
if(keycode==0xeb)
number=8;
if(keycode==0xdb)
number=9;
if(keycode==0xbb)
number=10;
if(keycode==0x7b)
number=11;
if(keycode==0xe7)
number=12;
if(keycode==0xd7)
number=13;
if(keycode==0xb7)
number=14;
if(keycode==0x77)
number=15;
if(keycode==0xff)
number=16;
return(number);
}
/**************************************************************************************
时间设置函数
**************************************************************************************/
void Settime()
{
uchar keycode,keynumber;
uchar i=2;
while(kbscan()!=0x77)
{
keycode=kbscan();
keynumber=Key_number(keycode);
do
{
Display(led);
}while(keycode==kbscan());
Delay1ms(5);
if(keynumber!=10&&keynumber!=11&&keynumber!=12&&keynumber!=13&&keynumber!=14&&keynumber!=15&&keynumber!=16)
{
led[i]=keynumber;
i++;
}
if(i==15)
{
i=2;
}
Display(led);
}
}
/**************************************************************************************
合成
**************************************************************************************/
void Led_change()
{
uchar i;
i=led[2];
i<<=4;
td[8]=i+led[3]; /*年*/
i=led[4];
i<<=4;
td[7]=i+led[5]; /*月*/
i=led[6];
i<<=4;
td[5]=i+led[7]; /*日*/
td[6]=led[8]; /*星期*/
i=led[9];
i<<=4;
td[4]=i+led[10]; /*时*/
i=led[11];
i<<=4;
td[3]=i+led[12]; /*分*/
i=led[13];
i<<=4;
td[2]=i+led[14]; /*秒*/
}
/*************************************主程序******************************************/
void main()
{
uchar key;
//Ledcheck(); /*开机后LED全亮3秒*/
{
//Record4004(0); /*录音*/
//Delay1ms(400);
//Stopmode(); /*停止录音*/
}
ISendStr(PCF8563,WRADDR,td,0x09);
while(1)
{
{
IRcvStr(PCF8563,RDADDR,rd,0x07);
Change_Led();
Display(led);
} /*LED显示*/
{
key=kbscan();
do
{
IRcvStr(PCF8563,RDADDR,rd,0x07);
Change_Led();
Display(led);
}while(key==kbscan()); /*当按键弹起来的时候再转向各功能*/
}
switch(key)
{
case 0xe7: /*如果设置键按下就可以设置时间*/
{
Settime(); /*设置时间*/
Led_change(); /*重写td*/
ISendStr(PCF8563,WRADDR,td,0x09); /*写pcf8563*/
}break;
case 0xbb: /*如果录音键按下就可以录音*/
{
if(rac_address==2400)
{
rac_address=0; /*如果录满了从头开始录音*/
}
{
Record4004(rac_address); /*录音*/
Recording(rac_address);
}
}break;
case 0xdb: /*如果播放键按下就可以放音*/
{
Audioout(racaddress[seg_ment1]);
Playing(seg_ment1);
seg_ment1++;
if(seg_ment1==4)
seg_ment1=0;
}break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -