附 录 _asm(\
rjia_key(Write_day,Read_day,8,1); _asm(\} }
if (ID3==0) //日的减 { delay(4); if(ID3==0) { while(!ID3); _asm(\
rjia_key(Write_day,Read_day,8,0); _asm(\} }
break;
case 5: if(ID2==0) //月的加 {
delay(4); if(ID2==0)
{ while(!ID2); _asm(\
yjia_key(Write_month ,Read_month,5,1); _asm(\} }
if(ID3==0) //月的减 {
delay(4); if(ID3==0) { while(!ID3); _asm(\
yjia_key(Write_month ,Read_month,5,0); _asm(\} }
break;
case 6:if(ID2==0) //年的加 { delay(4); if(ID2==0)
{ while(!ID2); _asm(\
njia_key(Write_year,Read_year,2,1); _asm(\}
18
附 录 }
if(ID3==0) //年的减 {
delay(4); if(ID3==0) { while(!ID3); _asm(\
njia_key(Write_year,Read_year,2,0); _asm(\} } break; } }
while(lshi==1); _asm(\return(n); return(n); }
void Write_ds1302(uchar addr,uchar dat) {
uchar i ;
PC_DDR |=0xFF; PC_CR1 |=0xFF; PC_CR2 |=0X00;
ce = 0; //先复位
sclk = 0; //清零,保持io口的低电平,以待数据的写入 ce = 1; //置1,开始写数据 //发送地址
for(i =0;i<8;i++) {
dio= addr&0x01; //将一位bcd码的数据送给io口 addr=addr >>1; //右移一位
sclk =1; //产生上升沿,发送数据 sclk =0; }
//发送数据
for(i=0;i<8;i++) {
dio= dat&0x01; //将一位bcd码的地址数据送给io口 dat =dat>>1;
sclk=1; //产生上升沿,发送数据 delay(1); sclk=0;}
19
附 录 ce = 0; }
//读操作//
Read_ds1302(uchar addr) {
uchar i; uchar k; uchar dat; da_od=0; da_CR1=0; da_CR2=0; ce=0; sclk=0; ce=1;
//发送地址
for(i=0;i<8;i++) {
sclk=0; delay(10); if(addr&0x01) {dio=1; }
else dio=0; addr>>=1; sclk=1; delay(2); }
da_od=0; da_CR1=0; da_CR2=0; //读取数据//
for(k=0;k<8;k++) { dat>>=1; sclk=1; delay(2); sclk=0; delay(2); if(id==0) {
dat&=0x7f; }
else dat |= 0x80 ; }
sclk=1;
20
附 录 ce=0;
return(dat); }
//IO口的初始化// void GPIO_Init(void) {
PC_DDR |=0X0F; PC_CR1 |=0X0F; PC_CR2 |=0X00; PG_DDR |=0X00; PG_CR1 |=0X03; PG_CR2 |=0X00; PD_DDR |=0X1C; PD_CR1 |=0X0F; EXTI_CR1|=0X00; ITC_SPR2|=0X30; PD_CR2 |=0X40; PA_DDR |=0XFF; PA_CR1 |=0XFF; PA_CR2 |=0X00; PB_DDR |=0XFF; PB_CR1 |=0XFF; PB_CR2 |=0X00; }
//延时函数// void delay(uint n) {
uint x,y;
for(x=n;x>0;x--) for(y=110;y>0;y--); }
//1602写命令函//
void lcd_wcom(uchar com) {
rs=0; //选择指令寄存器 rw=0; //选择写
PB=com; //把命令字送入PB
delay(5); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,命令送入1602的8位数据口 en=0; }
//1602写数据函数 //
void lcd_wdat(uchar dat) {
21
附 录
rs=1; //选择数据寄存器 rw=0; //选择写
PB=dat; //把要显示的数据送入P2
delay(5); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,数据送入1602的8位数据? en=0; }
//1602初始化函数// void lcd_init(void) {
uchar a,k;
delay(15); //等待电源稳定
lcd_wcom(0x38); //8位数据,双列,5*7字形 lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06); //显示地址递增,即写一个数据后显示位置右移一位 lcd_wcom(0x01); //清屏 /////////显示第一行///////// lcd_wcom(0x80); for(a=0;a<15;a++) {
lcd_wdat(table[a]); delay(5); }
/////////显示第二行///////// lcd_wcom(0x80+0x40); for(k=0;k<8;k++)
{ lcd_wdat(table1[k]); delay(5); } }
///年月日时分秒输入的子函数// //秒分的加减子函数//输入//
void jia_key(uchar rd,uchar wd,uchar fd,uchar fen) {u1=Read_ds1302(wd); _asm(\
u1=((u1&0x70)>>4)*10+(u1&0x0F); if(fen==1) { u1++; if(u1==60) { u1=0; } } else { u1--;
22