第三章 系统软件的设计
sbit KEY4 = P1^3;
unsigned char dispMode = 0; //显示模式 unsigned char modify = 0; //修改模式
unsigned char count = 0; //修改模式下闪烁计数 unsigned char DIS[6];
unsigned char code C_DAT[]={ 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/ 0xBF,/*-*/ };
unsigned char code C_BIT[]={0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
void Delay(unsigned int t) {
unsigned int a,b; for (a=0; a 22 22 第三章 系统软件的设计 void DS12887_Write(unsigned char addres,unsigned char dat) { DS_AS = 1; DS_DS = 1; DS_RW = 1; DS_CS = 0; DS_DAT = addres; DS_AS = 0; //add will be write when AS full down DS_RW = 0; DS_DAT = dat; DS_RW = 1; DS_AS = 1; DS_CS = 1; } unsigned char DS12887_Read(unsigned char addres) { unsigned char d; DS_AS = 1; DS_DS = 1; DS_RW = 1; DS_CS = 0; DS_DAT = addres; DS_AS = 0; DS_DS = 0; DS_DAT = 0xFF; d = DS_DAT; DS_DS = 1; DS_AS = 1; DS_CS = 1; 23 23 第三章 系统软件的设计 return d; } void DS12887_Init(void) { if (DS12887_Read(DS_Y_S) == 0) { DS12887_Write(DS_Y_S, 0x20); DS12887_Write(DS_HOR, 0x12); DS12887_Write(DS_R_A, 0x20); DS12887_Write(DS_R_B, 0x02); //BCD } } void Display(void) { unsigned char i; if (dispMode == 0) //显示模式0,时分秒 { i = DS12887_Read(DS_HOR) & 0x7F; DIS[0] = C_DAT[i >> 4]; DIS[1] = C_DAT[i & 0x0F] & 0x7F; i = DS12887_Read(DS_MIN); DIS[2] = C_DAT[i >> 4]; DIS[3] = C_DAT[i & 0x0F] & 0x7F; i = DS12887_Read(DS_SEC); DIS[4] = C_DAT[i >> 4]; DIS[5] = C_DAT[i & 0x0F] & 0x7F; if (modify != 0 && count > CNT_M) //修改模式123下闪烁 24 24 第三章 系统软件的设计 25 { DIS[2 * (modify - 1)] = 0xFF; DIS[2 * (modify - 1) + 1] = 0xFF; } } else if (dispMode == 1) //显示模式1,年 { DIS[0] = 0xFF; i = DS12887_Read(DS_Y_S); 0x0E DIS[1] = C_DAT[i >> 4]; DIS[2] = C_DAT[i & 0x0F]; i = DS12887_Read(DS_YER); DIS[3] = C_DAT[i >> 4]; DIS[4] = C_DAT[i & 0x0F]; DIS[5] = 0xFF; if (modify != 0 && count > CNT_M) { DIS[2 * (modify - 4) + 1] = 0xFF; DIS[2 * (modify - 4) + 2] = 0xFF; } } else if (dispMode == 2) { i = DS12887_Read(DS_MON); if (i < 10) DIS[0] = 0xFF; else DIS[0] = C_DAT[i >> 4]; DIS[1] = C_DAT[i & 0x0F] & 0x7F; i = DS12887_Read(DS_DAY); DIS[2] = C_DAT[i >> 4]; //年高两位,在RAM里 //年低两位 //修改模式45下闪烁 //显示模式2,月日 星期 //月 //显示小数点 //日 2 5 26 第三章 系统软件的设计 DIS[3] = C_DAT[i & 0x0F]; i = DS12887_Read(DS_WEK); //星期 DIS[4] = C_DAT[10]; //用'-'隔开 DIS[5] = C_DAT[(i - 1) & 0x0F]; //1~7,第一天是星期天 if (modify != 0 && count > CNT_M) //修改模式789下闪烁 { if (modify != 9) //星期修改时,烁 DIS[2 * (modify - 7)] = 0xFF; DIS[2 * (modify - 7) + 1] = 0xFF; } } for (i=0; i<6; i++) { SEG_DAT = DIS[i]; SEG_BIT = C_BIT[i]; Delay(1); SEG_BIT = 0xFF; } count++; //用于修改模式下闪烁 if (count > 2 * CNT_M) count = 0; } /*计算当月的天数*/ unsigned char getDay(void) { unsigned char tYear,tMonth; -’不闪2 6 ‘