📄 dianzi.c
字号:
DispBuf[4]= 10;
DispBuf[5]= 10;
desips7219();
key10=1;
Read_flash(0x8008, 6, cunmima);
do{
k = scan();
if(k == 10){goto exit;}
if(k==12)DispBuf[--i] = 10;
desips7219();
if( k >=0 && k<= 9)
{
DispBuf[i++]= k;
desips7219();
}
}while(i<6);
for( i = 0 ; i < 6 ; i++ )
{
if( cunmima[i] != DispBuf[i] )
{
if( Cnt++ > 2)
{Cnt=0; goto exit;}
goto setcode;
}
}
PassOk = 1;
break;
case 11: //设定时间
if( PassOk == 0)
goto exit ;
Cnt = 0;
settime:DispBuf[0]= 10;
DispBuf[1]= 10;
DispBuf[2]= 10;
DispBuf[3]= 10;
DispBuf[4]= 10;
DispBuf[5]= 10;
i = 0;
desips7219();
do{
k = scan();
if(k == 11){PassOk = 0 ;goto exit;}
if( k == 12 )
DispBuf[--i] = 10;
desips7219();
if( k >=0 && k<= 9)
{
DispBuf[i++]= k;
desips7219();
}
}while(i<6);
if( DispBuf[0]*10 + DispBuf[1] >23 ||
DispBuf[2]*10 + DispBuf[3] > 59||
DispBuf[4]*10 + DispBuf[5] > 59 )
{
if( Cnt++ >2 )
goto exit;
else
goto settime;
}
else
{ SetTime(DispBuf[0]*16+DispBuf[1],
DispBuf[2]*16+DispBuf[3],
DispBuf[4]*16+DispBuf[5]);
PassOk = 0 ;key10=0;
}break;
case 12:
case 13: //修改密码
if( PassOk == 0)
goto exit ;
Cnt = 0;
DispBuf[0]= 10;
DispBuf[1]= 10;
DispBuf[2]= 10;
DispBuf[3]= 10;
DispBuf[4]= 10;
DispBuf[5]= 10;
i = 0;
desips7219();
do{
k = scan();
if(k == 13){PassOk = 0 ;goto exit;}
if(k==12)DispBuf[--i] = 10;
desips7219();
if( k >=0 && k<= 9)
{
DispBuf[i++]= k;
desips7219();
}
}while(i<6);
for(i = 0;i < 6;i++)
{
cunmima[i]=DispBuf[i];
}
Write_flash(0x8008, 6, cunmima);
delay( 5 );
PassOk = 0 ;
break;
case 14://设置闹铃
time:
if( PassOk == 0)
goto exit ;
Cnt = 0;
DispBuf[0]= 10;
DispBuf[1]= 10;
DispBuf[2]= 10;
DispBuf[3]= 10;
DispBuf[4]= 10;
DispBuf[5]= 10;
i = 0;
desips7219();
do{
k = scan();
if(k ==14){PassOk = 0 ;goto exit;}
if(k==12)DispBuf[--i] = 10;
desips7219();
if( k >=0 && k<= 9)
{
DispBuf[i++]= k;
desips7219();
}
}while(i<4);keybuttflag=0;
for(i = 0;i < 4;i++)
{
naoling[nex][i]=DispBuf[i];
}
nex++;
if(nex==5)
{
nex = 0;
PassOk = 0 ;
}
else goto time;
break;
case 15:
default : break;
}
exit:;
}
/******************************************************
鬧鈴組
*******************************************************/
void naozhong()//闹钟
{
uchar nex;
if(keybuttflag ==0)
{
for(nex = 0;nex <5;nex++)
{
if( naoling[nex][0]==DispBuf[0]&&
naoling[nex][1]==DispBuf[1]&&
naoling[nex][2]==DispBuf[2]&&
naoling[nex][3]==DispBuf[3])
{
delay(5);
if(naoling[nex][0]==DispBuf[0]&&
naoling[nex][1]==DispBuf[1]&&
naoling[nex][2]==DispBuf[2]&&
naoling[nex][3]==DispBuf[3])
{
if(k==15){keybuttflag=1;P0= 0xff;}
else write1420(0X7E);
}
}
if( naoling[nex][0]==DispBuf[0]&&
naoling[nex][1]==DispBuf[1]&&
naoling[nex][2]==DispBuf[2]&&
naoling[nex][3]+2==DispBuf[3])
{
delay(5);
if(naoling[nex][0]==DispBuf[0]&&
naoling[nex][1]==DispBuf[1]&&
naoling[nex][2]==DispBuf[2]&&
naoling[nex][3]+2==DispBuf[3])
{
if(k==15){keybuttflag=~keybuttflag;}
else write1420(0X7E);
}
}
}
}
}
/*******************************************************
紅外接收
*******************************************************/
void wai0() interrupt 0////zhong duan jin ru jie shou dao de shu ju
{
unsigned char jihao,shu;
unsigned long a,b,wai,m;
wai = TH0;
wai=wai<<8;
wai = wai|TL0;
if( jihao==0)
{
if(1800< wai && wai <2200)//gao dian ping wei 2 ms;
{TH0=0; TL0=0; wai=0; jihao=1; }
else
{TH0=0; TL0=0; wai=0; jihao=0;}
}
else
{ shu++;
if(250<wai &&wai<700)
{m=m&0x7f; TH0=0; TL0=0;wai=0; }
if(800<wai && wai<1200)
{m=m | 0x80; TH0=0;TL0=0;wai=0; }
if(shu==8)
{
b= m&0x0f;
a=m&0xf0;
a >>=4;
if(a == (~b&0x0f))
{yuanma=(a & 0x0f); shu=0;wai=0;TH0=0;TL0=0;jihao=0;}
else
{shu=0;wai=0;TH0=0;TL0=0;jihao=0;}
}
else{ m >>= 1;}
}
}
void ISP_IAP_enable(void) //打开 ISP,IAP 功能
{
EA = 0; /* 关中断 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WAIT_TIME; //设置延时
ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */ //允许IAP/ISP功能
}
void ISP_IAP_disable(void) //关闭 ISP,IAP 功能
{
ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */ //禁止IAP/ISP功能
ISP_TRIG = 0x00;
EA = 1; /* 开中断 */
}
/* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据 */
/* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源 */
uchar Write_flash(uint begin_addr, uint counter, uchar array[])
{ uint i=0;
uint in_sector_begin_addr=0;
uint sector_addr =0;
uint byte_addr=0;
/* 判是否是有效范围,此函数不允许跨扇区操作 */
if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
return ERROR;
in_sector_begin_addr=begin_addr & 0x01ff; /* 0000,0001,1111,1111 */
/* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写 */
if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
return ERROR;
/* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
sector_addr = (begin_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
byte_addr = sector_addr; /* 扇区地址为扇区首字节地址 */
ISP_IAP_enable();
for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
{
ISP_ADDRH = (uchar)(byte_addr >> 8);
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 *///读FLASH
ISP_CMD = ISP_CMD | READ_Command; /* 0000,0001 */
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
protect_buffer[i] = ISP_DATA;
byte_addr++;
}
/* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
for(i = 0; i < counter; i++)
{
protect_buffer[in_sector_begin_addr] = array[i];
in_sector_begin_addr++;
}
/* 擦除 要修改/写入 的扇区 */
ISP_ADDRH = (uchar)(sector_addr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | ERASE_Command; /* 0000,0011 */
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
/* 将保护缓冲区的数据写入 Data Flash, EEPROM */
byte_addr = sector_addr; /* 扇区地址为扇区首字节地址 */
for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
{
/* 写一个字节 */
ISP_ADDRH = (uchar)(byte_addr >> 8);
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_DATA = protect_buffer[i];
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | PROGRAM_Command; /* 0000,0010 */
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
/* 读回来 */
ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | READ_Command; /* 0000,0001 */
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
/* 比较对错 */
if(ISP_DATA != protect_buffer[i])
{
ISP_IAP_disable();
return ERROR;
}
byte_addr++;
}
ISP_IAP_disable();
return OK;
}
uchar Read_flash(uint begin_addr, uint counter, uchar array[]) //读FLASH
{
uint i=0;
uint in_sector_begin_addr=0;
/* 判是否是有效范围,此函数不允许跨扇区操作 */
if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
return ERROR;
in_sector_begin_addr=begin_addr & 0x01ff; /* 0000,0001,1111,1111 */
/* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用*/
if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR ) //不允许跨扇区
return ERROR;
ISP_IAP_enable();
for(i = 0; i< counter; i++)
{
ISP_ADDRH = (uchar)(begin_addr >> 8);
ISP_ADDRL = (uchar)(begin_addr & 0x00ff); //传地址
ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | READ_Command; /* 0000,0001 */
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
array[i]=ISP_DATA; //读数据
begin_addr++;
}
ISP_IAP_disable();
return OK;
}
void ProcessPlay()
{
uchar Play_temp;
if( (DispBuf[0]*16 + DispBuf[1])<0x06 ) //零晨
{
temp[1] = 15;
} //零晨
else
{
if((DispBuf[0]*16 + DispBuf[1])<0x12) //上午
{
temp[1]=16; //上午
}
else
{
if((DispBuf[0]*16 + DispBuf[1])<0x18) //下午
temp[1]=18; //下午
else temp[1]=17; //晚上
}
}
Play_temp = 2;
if((DispBuf[0]*16 + DispBuf[1])<0x10)
{
temp[Play_temp++] = DispBuf[1];
}
else
{
if((DispBuf[0]*16 + DispBuf[1])==0x10)
{
temp[Play_temp++] = 10;
} //十
else
{
if((DispBuf[0]*16 + DispBuf[1])<0x20)
{
temp[Play_temp++] = 10; //十
temp[Play_temp++] = DispBuf[1]; //几点
}
else
{
if((DispBuf[0]*16 + DispBuf[1])==0x20)
{
temp[Play_temp++] = DispBuf[0]; //二
temp[Play_temp++] = 10; //十
}
else
{
temp[Play_temp++] = DispBuf[0]; //二
temp[Play_temp++] = 10; //十
temp[Play_temp++] = DispBuf[1]; //几点
}
}
}
}
temp[Play_temp++] = 11; //点
// if(flag_baoshi==1){goto exit;}
if((DispBuf[2]*16 + DispBuf[3])<0x10)
{
temp[Play_temp++] = DispBuf[2];
temp[Play_temp++] = DispBuf[3];
temp[Play_temp++] = 12; //分
}
else
{
if(DispBuf[3]==0)
{
if(DispBuf[2]==1)
{
temp[Play_temp++] = 10; //十
temp[Play_temp++] = 12; //分
}
else
{
temp[Play_temp++] = DispBuf[2]; //几十
temp[Play_temp++] = 10; //十
temp[Play_temp++] = 12; //分
}
}
else
{
if(DispBuf[2]==1)
{
temp[Play_temp++] = 10; //
temp[Play_temp++] = DispBuf[3];
temp[Play_temp++] = 12; //分
}
else
{
temp[Play_temp++] = DispBuf[2];
temp[Play_temp++] = 10;
temp[Play_temp++] = DispBuf[3];
temp[Play_temp++] = 12; //分
}
}
}
//exit:;
Play_num = Play_temp+1;
TR1 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -