P0=com; rs=0; rw=0; E=1;
delay_ms(1); E=0; }
void write_date (uchar date)//LCD1602的写数据 {
P0=date; rs=1; rw=0; E=0;
delay_ms(1); E=1;
delay_ms(1); E=0; }
void init()//LCD1602初始化 {
uchar i;
EA=1; //首先开启总中断 EX1=1; //开启外部中断 1 IT1=1;
write_com(0x38); delay_ms(2);
write_com(0x0c); delay_ms(2);
write_com(0x06); delay_ms(2);
write_com(0x80); delay_ms(1);
for(i=0;i<16;i++) {
write_date(table1[i]); // table1[]= }
write_com(0xc0); delay_ms(1);
for(i=0;i<16;i++) {
write_date (table2[i]); // table2[]= } }
void write_sfm_10(uchar add,uchar date)//在LCD1602写小时、分、秒
13
{
uchar ten,ge; ten=date/10; ge=date;
write_com(0xc0+add); write_date(0x30+ten); write_date(0x30+ge); }
void write_nyr_10(uchar add,uchar
write_date(weektable[i]); } }
if(ge==4) {
for(i=12;i<16;i++) { date)//写年、月、日 {
uchar ten,ge; ten=date/10; ge=date;
write_com(0x80+add); write_date(0x30+ten); write_date(0x30+ge); } void write_week(uchar add,uchar week)//写星期 {
uchar ge,i; ge=week&0x0f;
write_com(0x80+add); if(ge==1) {
for(i=0;i<4;i++) {
write_date(weektable[i]); } }
if(ge==2) {
for(i=4;i<8;i++) {
write_date(weektable[i]); } }
if(ge==3) {
for(i=8;i<12;i++) {
write_date(weektable[i]); } }
if(ge==5) {
for(i=16;i<20;i++) {
write_date(weektable[i]); } }
if(ge==6) {
for(i=20;i<24;i++) {
write_date(weektable[i]); } }
if(ge==7) {
for(i=24;i<28;i++) {
write_date(weektable[i]); } } }
void delay(void) //空5个指令 {
14
uchar i=13; while(i) i--; }
delay_ms(10); if(s2==0) {
while(!s2); flaga=0; } } }
if(s0==0) {
delay_ms(10); if(s0==0) {
buzzer=0;
while(!s0); s0num++;
buzzer=1; if(s0num==1) { flag=1;
write_com(0xc0+8); write_com(0x0f);
shi=read_ds1302(0x85); fen=read_ds1302(0x83); miao=read_ds1302(0x81); day=read_ds1302(0x87);
month=read_ds1302(0x89); year=read_ds1302(0x8d); week=read_ds1302(0x8b);
miao=(miao/16)*10+miao; fen=(fen/16)*10+fen; shi=(shi/16)*10+shi; day=(day/16)*10+day; month=(month/16)*10+month; year=(year/16)*10+year; }
if(s0num==2)
{
write_com(0xc0+5); }
if(s0num==3) {
write_com(0xc0+2); }
if(s0num==4) {
write_com(0x80+12); }
if(s0num==5) {
write_com(0x80+10); }
if(s0num==6) {
write_com(0x80+7); }
if(s0num==7) {
write_com(0x80+4); }
if(s0num==8) {
s0num=0;
write_com(0x0c);
miao=(miao/10)*16+miao;//10进制转16进制
fen=(fen/10)*16+fen; shi=(shi/10)*16+shi;
day=(day/10)*16+day; month=(month/10)*16+month; year=(year/10)*16+year;
write_ds1302(0x80,miao); write_ds1302(0x82,fen); write_ds1302(0x84,shi); write_ds1302(0x8a,week); write_ds1302(0x86,day); write_ds1302(0x88,month); write_ds1302(0x8c,year); flag=0; }
15
} }
/***********************主函数 ************************/ void main () {
init ();
write_ds1302(0x8e,0x00);//打开写保护
write_ds1302(0x90,0xa7); while(1) {
scan_key();//键盘扫描 if (flag==0) {
shi=read_ds1302(0x85);//从DS1302读取时间和日期
fen=read_ds1302(0x83); miao=read_ds1302(0x81); day=read_ds1302(0x87); month=read_ds1302(0x89); year=read_ds1302(0x8d);
week=read_ds1302(0x8b);
miao=(miao/16)*10+miao;//把16进制转化成10进制
fen=(fen/16)*10+fen; shi=(shi/16)*10+shi; day=(day/16)*10+day;
month=(month/16)*10+month;
year=(year/16)*10+year; write_sfm_10(7,miao);//显示时间日期
write_sfm_10(4,fen); write_sfm_10(1,shi); write_nyr_10(9,day); write_nyr_10(6,month); write_nyr_10(3,year); write_week(12,week); } }