#include <io.h>
#include "system.h"
int buf[17]={0};
void write(int data)
{
while(!(IORD(SPI_0_BASE,2)&0x40));
IOWR(SPI_0_BASE,1,data);
}
void spi_led(int data_1,int data_2,int data_3)
{
IOWR(SPI_0_BASE,1,0x800+(data_1&0x0f));
IOWR(SPI_0_BASE,1,0x900+((data_1&0xf0)>>4));
IOWR(SPI_0_BASE,1,0x0a00+(data_2&0x0f)+data_3);
IOWR(SPI_0_BASE,1,0x0b00+((data_2&0xf0)>>4));
}
int main(void)
{
IOWR(SPI_0_BASE,1,0x201);
write(0x413);
write(0x5c0);
int year1=0x06,year2=0x20,mon=0x12,day=0x30,hou=0x23,min=0x59,sec=0x35,hse=0,flg=14,flg1=14,flg2=30,k,i=3,j;
int led[16]={0xfc0,0xfe0,0xfd0,0xff0,0xfc4,0xfe4,0xfd4,0xff4,0xfc2,0xfe2,0xfd2,0xff2,0xfc6,0xfe6,0xfd6,0xff6};
IOWR(TIMER_0_BASE,1,6);
while(1)
{
if(IORD(TIMER_0_BASE,0)&1)
{
if(++hse==2)
{ hse=0;++sec; }
if((sec&0xf)==0xa)
sec+=6;
if(sec>=0x60)
{ sec=0;++min; }
if((min&0xf)==0xa)
min+=6;
if(min>=0x60)
{ min=0;++hou; }
if((hou&0xf)==0xa)
hou+=6;
if(hou>=0x24)
{ hou=0;++day; }
if((day&0xf)==0xa)
day+=6;
if(day>=0x31)
{ day=1;++mon; }
if((mon&0xf)==0xa)
mon+=6;
if(mon>=0x13)
{ mon=1;++year1; }
if((year1&0xf)==0xa)
year1+=6;
if(year1>=0x0a0)
{ year1=0;++year2; }
if((year2&0xf)==0xa)
year2+=6;
if(year2>=0x0a0)
{ year2=0; }
IOWR(TIMER_0_BASE,0,0); // 清除时间到标志
}
IOWR(SPI_0_BASE,1,0x000);
k=IORD(SPI_0_BASE,0);
if(!IORD(SPI_0_BASE,0))
{
IOWR(SPI_0_BASE,1,0x700);
IOWR(SPI_0_BASE,1,0x000);
k=IORD(SPI_0_BASE,0);
}
while(!IORD(SPI_0_BASE,2)&0x40);
for(j=0;j<16;j++)
{
if(!(k-led[j]))
{flg=j;j=17;}
}
if(flg>=0 && flg<=9)
{flg1=9;}
else
{flg1=flg;}
if(flg1>=12 && flg1<=15)
flg2=flg;
switch(flg1)
{
case 9: //0...9
{
if((!(k-led[flg]))&&(i<=16))
{
buf[i]=flg;
write(0x000);
i++;
write(0x800+buf[i-1]);
write(0x900+buf[i-2]);
write(0x0a00+buf[i-3]);
write(0x0b00+buf[i-4]);
} break;
}
case 10: //A删除
{
if(i>3)
{
i--;
write(0x800+buf[i-1]);
write(0x900+buf[i-2]);
write(0x0a00+buf[i-3]);
write(0x0b00+buf[i-4]);
flg=14;
}
flg=flg2;
break;
}
case 11: //B确认
{
if(i==17)
{
year1=(buf[5]<<4)+buf[6];
year2=buf[4]+(buf[3]<<4);
mon=buf[8]+(buf[7]<<4);
day=buf[10]+(buf[9]<<4);
hou=buf[12]+(buf[11]<<4);
min=buf[14]+(buf[13]<<4);
sec=buf[16]+(buf[15]<<4);
i=3;flg=14;
}flg=flg2; break;
}
case 12: //C 年
{
if(i==3)
{
IOWR(SPI_0_BASE,1,(0x800+(year1&0x0f)));
IOWR(SPI_0_BASE,1,(0x900+((year1&0x0f0)>>4)));
IOWR(SPI_0_BASE,1,(0x0a00+(year2&0x0f)));
IOWR(SPI_0_BASE,1,(0x0b00+((year2&0x0f0)>>4)));
}
break;
}
case 13: //D 月日
{
if(i==3)
spi_led(day,mon,0x80);
break;
}
case 14: //E 时分
{
if(i==3)
spi_led(min,hou,(hse<<7));
break;
}
case 15: //F 分秒
{
if(i==3)
spi_led(sec,min,0x80);
break;
}
}
}
}