📄 allgai.c
字号:
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;
uchar datasoute=0;
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;
datasoute=0;
while(_int==1) //存储地址换行标志
{
if(_rac) {Delay(44444); datasoute++; } //记录本次录音所占的行数(也就是本次录音有多大)
if(datasoute==0x96) //delay(44444)是延时0.4s
{ //录音60s
Stopmode(); //0x32是20s
_int=0; //
} // 在这里应该加上自己的程序,就是录音退出程序
//
}
}//while end;
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;
while(_int==1)
{
}//while end;
}
/************************************键盘专用延时****************************************/
void dlms(void)
{
uchar i;
for(i=200;i>0;i--)
{ }
}
/*******************************键盘扫描(用时408us)**********************************/
uchar kbscan(void)
{
uchar sccode,recode;
P2=0xf0; //p0.0---p0.3发全0,p0.4--p0.7输入
if((P2&0xf0)!=0xf0) //如果p0口高四位不全为1,有键按下
{ dlms(); //延时去抖动
if((P2&0xf0)!=0xf0) //重读输入值
{ sccode=0xfe; //最底位置0
while((sccode&0x10)!=0) //不到最后一行循环
{ P2=sccode; //p0口输出扫描码
if((P2&0xf0)!=0xf0) //如果p0.4--p0.7不全为1,该行有键按下
{ recode=P2&0xf0;
sccode=sccode&0x0f; //保留p0口高四位输入值,低四位变为全1,作为列值
return(sccode+recode);
}
else
sccode=(sccode<<1)|0x01; //如该行无键按下,查下一行,行扫描值左移一位
}
}
}
return(0xff);
}
/************************************LED开机检测**************************************/
void Ledcheck()
{
uchar j;
uchar i,k=0;
for(j=0;j<255;j++)
{
P3=0x00;
for(i=0;i<15;i++)
{
P0=0xff;
Delay1ms(1);
P3+=1;
}
}
}
/*****************************按键转化为相应的数字************************************/
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()
{
//Ledcheck(); /*开机后LED全亮3秒*/
ISendStr(PCF8563,WRADDR,td,0x09);
while(1)
{
IRcvStr(PCF8563,RDADDR,rd,0x07);
Change_Led();
Display(led); /*LED显示*/
if(kbscan()==0xe7) /*如果设置键按下就可以设置时间*/
{
Settime(); /*设置时间*/
Led_change(); /*重写td*/
ISendStr(PCF8563,WRADDR,td,0x09); /*写pcf8563*/
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -