📄 subprogram.h
字号:
#define uint unsigned int
#define uchar unsigned char
void start();
void stop();
unsigned char shin();
bit shout(unsigned char write_data);
unsigned char read_random(unsigned char random_addr);
void write_byte( unsigned char addr, unsigned char write_data);
void fill_byte(unsigned char fill_data);
void delay_n_ms( unsigned int n_milisecond) ;
void Rest() ;
//uchar Send(uchar N);
void dyms(unsigned char a) //微秒延时程序
{
while(--a);
}
void delay(void) //延迟程序
{
int i,j;
for(i=50;i--;i>0)
for(j=10000;j--;j>0)
;
}
void DelayMs(uchar CNT) //fosc=12HzM
{
uchar i;
while(CNT-- !=0)
for(i=0;i<100;i++);
}
void clr_wdt() //软件看门狗
{
WDTRST = 0x1E; // 清除看门狗指令
WDTRST = 0xE1; //
}
void MCU_Init()
{
uchar i,j;
TMOD=0x11; //波特率发生器T1工作在模式2上
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
TR0=1;
TR1=0;
ET0=1;
ET1=1;
PT1=1; //T1 中断优先级设定
EA=1;
P3=0xff;
BEEP=0;
doorNumflag=0;
psCHINf=0;
Keyenableflag=1;
AUXR = 0xff; // 初始化看门狗相关寄存器
for(j=0;j<20;j++)
{
for(i=0;i<6;i++) //读密码
{
ps[i]=read_random(i);
}
}
}
void DealNum()
{
if(keycount<6)
{
if(doorNumflag==1)
{
if(keycount<3) dispbuf[5+keycount]=key;
else {keycount=2; errorflag=1; rightflag=0; }
// 输入三位门号后,继续输入数字键错误提示
}
else psCH0flag=1;
if(psCH0flag==1){ getps[keycount]=key; dispbuf[7-keycount]=19;}
if(psCH1flag==1 ) {psbuf1[keycount]=key; dispbuf[7-keycount]=19;}
if(psCH2flag==1 ) {psbuf2[keycount]=key; dispbuf[7-keycount]=19;}
}
keycount++;
if(keycount==6) keycount=6;
else if(keycount>6) //输入6位密码后,再输入数字错误提示
{ keycount=6; errorflag=1; rightflag=0; }
}
void DealDel() //取消键的处理
{ uchar i;
if(keycount>0)
{
if(psCH0flag==1) for(i=keycount;i>0;i--)getps[i]=0;
if(psCH1flag==1 ) for(i=keycount;i>0;i--)psbuf1[i]=0;
if(psCH2flag==1 ) for(i=keycount;i>0;i--)psbuf2[i]=0;
for(i=keycount;i>0;i--) dispbuf[8-i]=16;
}
else //没有输入密码,按取消键错误报警提示
{ errorflag=1; rightflag=0;}
keycount=0;
}
void Doorbell(void )
{
unsigned char flagsing=0;
//TR0=0;
while(1)
{
switch(music_tab[i])
{
case 0x00:
i=0;delay();flagsing=1 ;break; // 曲终停顿一定时间
case 0xff:
i=i+1;dyms(100);break; //遇到休止符停顿一定时间100微秒,再取下一个频率
default:
m=music_tab[i++];
n=music_tab[i++];//取频率到m,取节拍到n
TR1=1;
while(n!=0)
{
BEEP=!BEEP;
dyms(4*m);//调整产生的频率,可以通过在m前的值来修正音调的高
}
TR1=0;
}
if(flagsing==1) goto outmusic ;
}
/*uchar i,nom;
unsigned char m; //m为频率常数
//unsigned char n=0; //n为节拍常数
//Keyenableflag=0; //禁止案件输入
TR0=0;
TR1=0; //禁止TR0中断
i=0;
for(nom=0;nom<191;nom++)
{
if(music_tab[i])
{
if(music_tab[i]==0xff)
dyms(100); //遇到休止符停顿一定时间100微秒,再取下一个频率
else
{ m=music_tab[i++];
n=music_tab[i++];//取频率到m,取节拍到n
TR1=1;
while(n!=0)
{
BEEP=!BEEP;
dyms(4*m); //调整产生的频率,可以通过在m前的值来修正音调的高
}
}
TR1=0;
}
}*/
outmusic:
// Keyenableflag=1; //禁止案件输入
Rest();
}
void Dealpschange() //密码修改键的处理
{
uchar i;
if(keycount!=pslen) //密码不足6位,错误报警提示。且显示清空
{
if(keycount==3 && doorNumflag==1)
{doorNumflag=0; dispbuf[0]=17; psCHINf=1; goto b; }
//输入门号后按确定,显示P开始输入门号
errorflag=1;
rightflag=0;
}
else
{
for(i=0;i<keycount;i++)
{
if(getps[i]!=ps[i]) //输入的6位密码不正确,错误报警提示
{
i=keycount;
errorflag=1;
rightflag=0;
second3=0;
goto b;
}
}
dispbuf[0]=17;
psCHINf=1;
if( psCHINf==1 ) //修改密码时旧密码输入正确,
{ //提示输入新密码,显示H1
psCH0flag=0;
psCH1flag=1;
dispbuf[1]=1;
}
}
b:second3=0;
keycount=0;
for(k=2;k<8;k++)
{dispbuf[k]=16;}
}
void DealENl() //确定键的处理
{
uchar i,j;
if(keycount!=pslen) //密码不足6位,错误报警提示。且显示清空
{
if(keycount==3 && doorNumflag==1)
{doorNumflag=0; dispbuf[0]=18; goto a; }
//输入门号后按确定,显示P开始输入门号
errorflag=1;
rightflag=0;
second3=0;
keycount=0;
for(k=2;k<8;k++)
{dispbuf[k]=16;}
}
else
{
if(psCH2flag==1)
{
for(i=0;i<keycount;i++)
{
if(psbuf1[i]!=psbuf2[i]) //两次输入的新密码不相同,错误报警提示
{
i=keycount;
errorflag=1;
rightflag=0;
second3=0;
goto a;
}
}
for(i=0;i<keycount;i++)
{ //两次输入相同,修改密码
ps[i]=psbuf1[i];
}
for(j=0;j<20;j++)
for(i=0;i<keycount;i++)
{ //两次输入相同,修改密码
write_byte(i, ps[i]);
}
errorflag=0;
rightflag=1;
psrightflag=1 ;
psCH2flag==0;
}
if(psCH1flag==1) {psCH1flag=0; psCH0flag=0;psCH2flag=1;dispbuf[1]=2;}
if(psCH0flag==1) //密码输入正确与否的处理
{
for(i=0;i<keycount;i++)
{
if(getps[i]!=ps[i]) //输入的6位密码不正确,错误报警提示
{
i=keycount;
errorflag=1;
rightflag=0;
second3=0;
goto a;
}
}
if( psCHINf==1 ) //修改密码时旧密码输入正确,
{ //提示输入新密码,显示H1
psCH0flag=0;
psCH1flag=1;
dispbuf[1]=1;
}
else
{
errorflag=0; //输入密码正确,提示并显示清空
rightflag=1;
psrightflag=1 ; //输入密码正确标志
}
} //end if(psCH0flag==1)
a: i=keycount;
keycount=0;
for(k=2;k<8;k++)
{dispbuf[k]=16;}
}
}
void ReleaseKey() //等待键释放
{
temp=temp & 0x0f;
while(temp!=0x0f)
{ temp=P1; temp=temp & 0x0f; }
}
void KeyDelay() //按键延时去抖
{
uchar i,j;
for(i=10;i>0;i--)
for(j=248;j>0;j--);
temp=P1;
temp=temp & 0x0f;
}
void efficiencyKey() // 按键有效提示
{
temp=P1; //按键有效标志,
P3_2=0; //指示灯闪
BEEP=1; //声音提示
DelayMs(50) ;
P3_2=1;
BEEP=0;
}
void Rest() //复位件键复位
{
doorNumflag=0;
keycount=0;
psrightflag=0;
psCHINf=0;
psCH0flag=0;
psCH1flag=0;
psCH2flag=0;
for(k=0;k<8;k++) { dispbuf[k]=16; }
for(k=0;k<6;k++) {psbuf1[k]=0;psbuf2[k]=0;getps[k]=0;}
}
void delay_n_ms( unsigned int n_milisecond) /* n mS delay */
{
unsigned char i;
while(n_milisecond--)
{
i=37;
while(i--);
}
}
void start()
// 开始位
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
void stop()
// 停止位
{
SDA = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
unsigned char shin()
// 从AT24Cxx移入数据到MCU
{
unsigned char i,read_data;
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1;
read_data |= (unsigned char)SDA;
SCL = 0;
}
return(read_data);
}
bit shout(unsigned char write_data)
// 从MCU移出数据到AT24Cxx
{
unsigned char i;
bit ack_bit;
for(i = 0; i < 8; i++) // 循环移入8个位
{
SDA = (bit)(write_data & 0x80);
_nop_();
SCL = 1;
_nop_();
_nop_();
SCL = 0;
write_data <<= 1;
}
SDA = 1; // 读取应答
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ack_bit = SDA;
SCL = 0;
return ack_bit; // 返回AT24Cxx应答位
}
void write_byte(unsigned char addr, unsigned char write_data)
// 在指定地址addr处写入数据write_data
{
start();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delay_n_ms(10); // 写入周期
}
void fill_byte(unsigned char fill_data)
// 填充数据fill_data到EEPROM内
{
unsigned char i;
for(i = 0; i < MAX_ADDR; i++)
{
write_byte(i, fill_data);
}
}
unsigned char read_current()
// 在当前地址读取
{
unsigned char read_data;
start();
shout(OP_READ);
read_data = shin();
stop();
return read_data;
}
unsigned char read_random(unsigned char random_addr)
// 在指定地址读取
{
start();
shout(OP_WRITE);
shout(random_addr);
return(read_current());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -