基于AVR单片机的带密码显示的DS302仿真设计Word下载.docx
《基于AVR单片机的带密码显示的DS302仿真设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于AVR单片机的带密码显示的DS302仿真设计Word下载.docx(25页珍藏版)》请在冰点文库上搜索。
write_ds1302(0x80,miao);
write_ds1302(0x82,fen);
write_ds1302(0x84,si);
write_ds1302(0x86,ri);
write_ds1302(0x88,yue);
write_ds1302(0x8a,xq);
write_ds1302(0x8c,nian);
ucharchange(uchardat)//16-10
uchara,b;
a=dat/16;
a=10*a;
b=dat%16;
dat=a+b;
returndat;
ucharchange1(uchardat)//10-16
a=dat/10;
a=16*a;
b=dat%10;
voidshow_time()
//uchara,b;
miao=read_ds1302(0x81);
fen=read_ds1302(0x83);
si=read_ds1302(0x85);
ri=read_ds1302(0x87);
yue=read_ds1302(0x89);
xq=read_ds1302(0x8b);
nian=read_ds1302(0x8d);
miao=change(miao);
fen=change(fen);
si=change(si);
ri=change(ri);
yue=change(yue);
xq=change(xq);
nian=change(nian);
_1602dis_sfm(si,fen,miao);
_1602dis_nyrq(nian,yue,ri,xq);
voidmain()
DDRD&
=~BIT(PC0)&
~BIT(PC1)&
~BIT(PC2);
PORTD|=BIT(PC0)|BIT(PC1)|BIT(PC2);
DDRC=0XFF;
init1602();
delay1(20);
lcd_inputpassword();
while
(1)
{
password();
while(flag)
{
show_time();
keyboard();
}
/*********************1602_jp_sz.c**********************/
/******************************************/
//功能:
1602显示时钟
//管脚配置:
PB为数据,PD3=RS,PD6=RW,PD7=E;
//k1=PA0,K2=PA1,K3=PA2;
/*******************************************/
//#pragmainterrupt_handlers_f_m:
9
#pragmadata:
code
constuchartable1[]="
20--"
;
constuchartable2[]="
:
"
signedcharsi,fen,miao,nian,yue,ri,xq;
ucharup,down;
voiddelay(uintx)
/*************lcd1602************************/
voidwrite1602_cm(ucharcm)
DDRB=0XFF;
DDRD|=BIT(PD3)|BIT(PD6)|BIT(PD7);
PORTD&
=~BIT(PD3);
//RS=0;
=~BIT(PD6);
//RW=0;
=~BIT(PD7);
//E=0;
delay
(1);
PORTB=cm;
PORTD|=BIT(PD7);
//E=1;
PORTD|=BIT(PD3);
//RS=1;
voidwrite1602_dat(uchardat)
PORTB=dat;
void_1602dis_2line(ucharaddr,uchardat)
ucharsi,ge;
si=dat/10;
ge=dat%10;
write1602_cm(0x80+0x40+addr);
write1602_dat(0x30+si);
write1602_dat(0x30+ge);
void_1602dis_1line(ucharaddr,uchardat)
write1602_cm(0x80+addr);
void_1602dis_sfm(uchars,ucharf,ucharm)
_1602dis_2line(3,s);
_1602dis_2line(6,f);
_1602dis_2line(9,m);
void_1602dis_nyrq(ucharn,uchary,ucharr,ucharq)
_1602dis_1line(4,n);
_1602dis_1line(7,y);
_1602dis_1line(10,r);
_1602dis_1line(13,q);
voidinit1602()
/*TCCR1B=0X04;
//256分频
TCNT1H=(65535-31250)/256;
TCNT1L=(65535-31250)%256;
//1s
TIMSK|=BIT
(2);
SREG|=BIT(7);
*/
write1602_cm(0x38);
write1602_cm(0x0C);
write1602_cm(0x06);
write1602_cm(0x01);
//si=9;
fen=3;
miao=23;
voidlcd_time_init()
uchari;
write1602_cm(0x80);
for(i=0;
i<
15;
i++)
write1602_dat(table1[i]);
delay(5);
write1602_cm(0x80+0X40);
11;
write1602_dat(table2[i]);
/************************1302_sz.c******************************/
/*******************ds1302*****************/
读取1302时钟
//管脚分配:
PC1=SCKPC0=I/OPC2=CE
1302.h"
voiddelay2(uintx)
voidwrite_dat(uchardat)
uchari,temp;
temp=dat;
for(i=8;
if(temp&
0x01)
IO_H;
else
IO_L;
temp=temp>
>
1;
//10011101
sclk_H;
sclk_L;
ucharread_dat()
DDRC&
=~BIT(PC0);
PORTC|=BIT(PC0);
{
if(PINC&
{
temp=temp|0x80;
sclk_L;
returntemp;
voidwrite_ds1302(ucharadd,uchardat)
CE_L;
sclk_L;
CE_H;
write_dat(add);
write_dat(dat);
//sclk_L;
ucharread_ds1302(ucharadd)
uchartemp;
temp=read_dat();
/*****************************keyboard.c**************************/
/******************************************************************
//独立键盘k1=PDOk2=PD1k3=PD2
/*****************************************************************/
#definek1PIND&
0x01
#definek2PIND&
0X02
#definek3PIND&
0X04
ucharnum;
voidK1()
if(~k1)
num++;
voidkeyboard()
write1602_cm(0x80+0x40+10);
write1602_cm(0x0f);
}while(~k1);
while(num==1)///////miao+-
K1();
while(~k1);
if(~k2)
miao++;
if(miao==60){miao=0;
while(~k2);
_1602dis_2line(9,miao);
if(~k3)
miao--;
if(miao==0xff){miao=59;
while(~k3);
while(num==2)//fen+-
write1602_cm(0x80+0x40+7);
fen++;
if(fen==60){fen=0;
_1602dis_2line(6,fen);
fen--;
if(fen==0xff){fen=59;
while(num==3)//////si+-
write1602_cm(0x80+0x40+4);
si++;
if(si==24){si=0;
_1602dis_2line(3,si);
si--;
if(si==0xff){si=23;
while(num==4)///xq+-
write1602_cm(0x80+14);
xq++;
if(xq==8){xq=1;
_1602dis_1line(13,xq);
xq--;
if(fen==0){fen=7;
while(num==5)////ri+-
write1602_cm(0x80+11);
////输入与改月相对应的日期,上限为31天
ri++;
if(ri==32){ri=1;
_1602dis_1line(10,ri);
ri--;
if(ri==0){ri=31;
while(num==6)/////yue
write1602_cm(0x80+8);
yue++;
if(yue==13){yue=1;
_1602dis_1line(7,yue);
yue--;
if(yue==0){yue=12;
while(num==7)///nian
write1602_cm(0x80+5);
nian++;
if(nian==100){yue=1;
_1602dis_1line(4,nian);
nian--;
if(nian==0){yue=99;
if(num==8)////break;
{
write1602_cm(0x0c);
num=0;
write_time();
/*************************jzkeyboard.c***************************/
uchardat;
voidtime(uintz)
ucharx,y;
for(x=z;
x>
x--)
for(y=110;
y>
y--);
voidjzkeyboard()
ucharnum3,num1,num2;
/**/
DDRA|=0xf0;
PORTA&
=0x0f;
DDRA&
=0xf0;
PORTA|=0x0f;
num3=0x0f&
PINA;
/**/
//time(500);
if(num3!
=0x0f)
DDRA|=0x0f;
PORTA|=0xf0;
num1=0xf0&
num2=num1|num3;
switch(num2)
case0xee:
dat=0;
break;
case0xde:
dat=1;
case0xbe:
dat=2;
case0x7e:
dat=3;
case0xed:
dat=4;
case0xdd:
dat=5;
case0xbd:
dat=6;
case0x7d:
dat=7;
case0xeb:
dat=8;
case0xdb:
dat=9;
//return(dat);
}while(PINA!
=0xf0);
//松手检测
/***************************password.c***********************/
uchari,p1,p2,p3,p4,p5,p6,flag;
flashucharpa[]="
Inputpassword!
flashucharer[]="
Error!
voiddengdai(uintx)
for(j=50000;
voidlcd_inputpassword()
16;
write1602_dat(pa[i]);
write1602_cm(0x80+0x40+5);
voiderror()
uchari;
write1602_dat(er[i]);
voidpassword()
if(PINA!
=0xf0)
i++;
jzkeyboard();
//PORTC=dat;
if(i==1)
{p1=dat;
write1602_cm(0x80+0x40+5);
write1602_dat('
*'
);
if(i==2)
{p2=dat;
write1602_cm(0x80+0x40+6);
if(i==3)
{p3=dat;
write1602_cm(0x80+0x40+7);
if(i==4)
{p4=dat;
write1602_cm(0x80+0x40+8);
if(i==5)
{p5=dat;
write1602_cm(0x80+0x40+9);
if(i==6)
{p6=dat;
write1602_cm(0x80+0x40+10);
if((p1==1)&
&
(p2==2)&
(p3==3)&
(p4==4)&
(p5==5)&
(p6==6))//检测密码
lcd_time_init();
flag=1;
p1=0;
p2=0;
p3=0;
p4=0;
p5=0;
p6=0;
i=0;
error();
write1602_dat('
'
dengdai(60);