/******************************************************************************************/ #include //STC头文件 /******************************************************************************************/ //"程序开发调试设置项" #define DY_LI 9 //设置LED显示的亮度(值域:1~9) #define DY_DELAY 12 //设置每一个点显示的时间长度(1~20) /******************************************************************************************/ sbit DY_LED1_H1 =P3 ^ 5; //设置LED点阵屏连接的I/O口 sbit DY_LED1_H2 =P3 ^ 4; //设置LED点阵屏连接的I/O口 sbit DY_LED1_H3 =P3 ^ 3; //设置LED点阵屏连接的I/O口 sbit DY_LED1_H4 =P3 ^ 2; //设置LED点阵屏连接的I/O口 sbit DY_LED1_L1 =P1 ^ 1; //设置LED点阵屏连接的I/O口 sbit DY_LED1_L2 =P1 ^ 4; //设置LED点阵屏连接的I/O口 sbit DY_LED1_L3 =P1 ^ 6; //设置LED点阵屏连接的I/O口 sbit DY_LED1_L4 =P1 ^ 5; //设置LED点阵屏连接的I/O口 sbit DY_LED1_L5 =P1 ^ 0; //设置LED点阵屏连接的I/O口 sbit DY_LED1_L6 =P1 ^ 2; //设置LED点阵屏连接的I/O口 sbit DY_LED1_L7 =P1 ^ 3; //设置LED点阵屏连接的I/O口 sbit DY_LED1_L8 =P1 ^ 7; //设置LED点阵屏连接的I/O口 冒号 sbit key1 = P3^1; sbit key2 = P3^7; data unsigned char key_v = 0; // 存储键值 data unsigned char key_t = 0; // 按键扫描中临时存储键值 data unsigned char MENU = 0; //sbit DY_BEEP =P2 ^ 2; //扬声器 //sbit DY_KEY1 =P0 ^ 2; //按键1(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作) //sbit DY_KEY2 =P3 ^ 0; //按键2(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作) //sbit DY_KEY3 =P3 ^ 6; //按键3(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作) #define DY_P1M0SET 0x00 //设置I/O口工作方式//00000000(左到右,高到低位) #define DY_P1M1SET 0x00 //设置I/O口工作方式//00101000 #define DY_P3M0SET 0x00 //设置I/O口工作方式//00000000 #define DY_P3M1SET 0x3c //设置I/O口工作方式//10010100 0111 1101 data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS,ty;//设置日、月、年、周、时、分、秒和温度存放区 data unsigned char cou = 0; // 软计数器,对10ms时基信号累加到1s data unsigned char bn;//扫描映射全局变量 data unsigned char KEY_BIT = 0;//按键值 data unsigned char DY_PWM;//显示亮度 data unsigned char DY_PWM2;//显示暂存 unsigned char code disdata[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9) }; //0x3f 00111111 0x06 00000110 0x56 01011011 0x4f 01001111 0x66 01100110 0x6d 01101101 //0x7d 01111101 0x07 00000111 0x7f 01111111 0x6f 01101111 /******************************************************************************************/ void delay (unsigned int a){ // 用于点扫描的延时 unsigned int i; while( --a != 0){ for(i = 0; i < DY_DELAY; i++); // DY_DELAY值为12 } } /******************************************************************************************/ void delay1ms (unsigned int a){ // 1ms延时程序(12MHz 10倍于51单片机速度时) unsigned int i; while( --a != 0){ for(i = 0; i < 600; i++); } } /******************************************************************************************/ void dis_off (void){ DY_LED1_L1 =1; //灭灯 DY_LED1_L2 =1; // DY_LED1_L3 =1; // DY_LED1_L4 =1; // DY_LED1_L5 =1; // DY_LED1_L6 =1; // DY_LED1_L7 =1; // DY_LED1_H1 =0; // DY_LED1_H2 =0; // DY_LED1_H3 =0; DY_LED1_H4 =0; // P1 = ~DY_P1M1SET; //关所有显示 // P3 = ~DY_P3M1SET; delay(10-DY_PWM); } /******************************************************************************************/ void displayHH1 (unsigned char d){ //第1列横向显示程序 unsigned char i; i = d & 0x01; //按位与 0x01-0000 0001 if(i == 0x01){ DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off(); i = d & 0x02; //0x02-0000 0010 if(i == 0x02){ DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off(); i = d & 0x04; //0x04-0000 0100 if(i == 0x04){ DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off(); i = d & 0x08; //0x08-0000 1000 if(i == 0x08){ DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off(); i = d & 0x10; //0x10-0001 0000 if(i == 0x10){ DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off(); i = d & 0x20; //0x20-0010 0000 if(i == 0x20){ DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off(); i = d & 0x40; //0x40-0100 0000 if(i == 0x40){ DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off(); } /******************************************************************************************/ void displayHH2 (unsigned char d){ //第2列横向显示程序 unsigned char i; i = d & 0x01; if(i == 0x01){ DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off(); i = d & 0x02; if(i == 0x02){ DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off(); i = d & 0x04; if(i == 0x04){ DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off(); i = d & 0x08; if(i == 0x08){ DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off(); i = d & 0x10; if(i == 0x10){ DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off(); i = d & 0x20; if(i == 0x20){ DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off(); i = d & 0x40; if(i == 0x40){ DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off(); } /******************************************************************************************/ void displayHH3 (unsigned char d){ //第3列横向显示程序 unsigned char i; i = d & 0x01; if(i == 0x01){ DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off(); i = d & 0x02; if(i == 0x02){ DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off(); i = d & 0x04; if(i == 0x04){ DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off(); i = d & 0x08; if(i == 0x08){ DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off(); i = d & 0x10; if(i == 0x10){ DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off(); i = d & 0x20; if(i == 0x20){ DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off(); i = d & 0x40; if(i == 0x40){ DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off(); } /******************************************************************************************/ void displayHH4 (unsigned char d){ //第4列横向显示程序 unsigned char i; i = d & 0x01; if(i == 0x01){ DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off(); i = d & 0x02; if(i == 0x02){ DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off(); i = d & 0x04; if(i == 0x04){ DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off(); i = d & 0x08; if(i == 0x08){ DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off(); i = d & 0x10; if(i == 0x10){ DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off(); i = d & 0x20; if(i == 0x20){ DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off(); i = d & 0x40; if(i == 0x40){ DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off(); } /******************************************************************************************/ /******************************************************************************************/ void diplay_data (unsigned char l,unsigned char d){ switch (l){//显示的列位置 case 1:// displayHH1(d); //将显示数据送入 break;// case 2:// displayHH2(d); //将显示数据送入 break;// case 3:// displayHH3(d); //将显示数据送入 break;// case 4:// displayHH4(d); //将显示数据送入 break;// } } /******************************************************************************************/ void init (void){ //上电初始化 P1M0 = DY_P1M0SET; P1M1 = DY_P1M1SET; P3M0 = DY_P3M0SET; //1100 0011 P3M1 = 0xff;//DY_P3M1SET; //// dis_off(); DY_PWM = DY_LI; //// TMOD = 0x11; // 定时/计数器0,1工作于方式1 TH0 = 0x3c; // 预置产生50ms时基信号 TL0 = 0xb0; EA = 1; // 开总中断 ET0 = 1; // 定时/计数器0允许中断 TR0 = 1; // 开闭定时/计数器0 //// //TIME_DD = 18; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值 //TIME_MO = 5; //初始时间:2009年5月18日周一,20时13分40秒 //TIME_YY = 9; //TIME_WW = 1; //TIME_HH = 22; //TIME_MM = 13; //TIME_SS = 40; } /******************************************************************************************/ /******************************************************************************************/ void main (void){ //主程序 init(); while (1){ unsigned char a,b; if(MENU == 0){ diplay_data (4,disdata[TIME_HH/10]); if(key1 == 0 && key2 == 1){ delay1ms (100);//去抖 if(key1 == 0 && key2 == 1){ MENU = 1; } } if(key2 == 0&& key1 == 1){ delay1ms (100);//去抖 if(key2 == 0&& key1 == 1){ a = TIME_HH/10; b = TIME_HH%10; a++; if(a > 2){ a = 0; } TIME_HH = a*10 + b; } } while(key1 == 0 || key2 == 0){ } } if(MENU == 1){ diplay_data (3,disdata[TIME_HH%10]); if(key1 == 0 && key2 == 1){ delay1ms (100);//去抖 if(key1 == 0 && key2 == 1){ MENU= 2; } } if(key2 == 0&& key1 == 1){ delay1ms (100);//去抖 if(key2 == 0&& key1 == 1){ a = TIME_HH/10; b = TIME_HH%10; b++; if(b > 9){ b = 0; } if(a > 1){ if(b > 3){ b = 0; } } TIME_HH = a*10 + b; } } while(key1 == 0 || key2 == 0){ } } if(MENU == 2){ diplay_data (2,disdata[TIME_MM/10]+0x80); if(key1 == 0 && key2 == 1){ delay1ms (100);//去抖 if(key1 == 0 && key2 == 1){ MENU = 3; } } if(key2 == 0&& key1 == 1){ delay1ms (100);//去抖 if(key2 == 0&& key1 == 1){ a = TIME_MM/10; b = TIME_MM%10; a++; if(a > 5){ a = 0; } TIME_MM = a*10 + b; } } while(key2 == 0 || key1 == 0){ } } if(MENU == 3){ diplay_data (1,disdata[TIME_MM%10]+0x80); if(key1 == 0 && key2 == 1){ delay1ms (100);//去抖 if(key1 == 0 && key2 == 1){ MENU = 4; } } if(key2 == 0&& key1 == 1){ delay1ms (100);//去抖 if(key2 == 0&& key1 == 1){ a = TIME_MM/10; b = TIME_MM%10; b++; if(b > 9){ b = 0; } TIME_MM = a*10 + b; TIME_SS = 0;//调时完成后把秒清0 } } while(key1 == 0 || key2 == 0){ } } if(MENU == 4){ while (1){ diplay_data (4,disdata[TIME_HH/10]); diplay_data (3,disdata[TIME_HH%10]); diplay_data (2,disdata[TIME_MM/10]+0x80); diplay_data (1,disdata[TIME_MM%10]+0x80); if(TIME_SS%2 == 0){ DY_LED1_L8 = 0;delay(10);DY_LED1_L8 = 1; } // } } } } /******************************************************************************************/ void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生50ms时基信号) cou++; // 软计数器加1 if(cou > 19){ // 计数值到100(1s) cou = 0; // 软计数器清零 TIME_SS++; // 秒计数器加1(进位10ms*100=1s) if(TIME_SS > 59){ // 秒计数值到60 TIME_SS = 0; // 秒计数器清零 TIME_MM++; // 分计数器加1(进位60s=1m) if(TIME_MM > 59){ // 分计数到60 TIME_MM = 0; // 分计数器清零 TIME_HH++; // 时计数器加1(进位60m=1h) if(TIME_HH > 23){ // 时计数到23 TIME_HH = 0; // 时计数器清零 } } } } TH0 = 0x3c; // 重置定时常数 TL0 = 0xb0; } /************************************************************* PxM0 PxM1 0 0 双向标准 1 0 推挽输出 0 1 高阻态输出 1 1 开漏 按位与 & 1 1 1 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0和任何数按位与&的结果都为0 e.g. 假设d为0 即 0x3f-0011 1111 i== d & 0x80 & 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 If ( I == 0x80){ 按位与之后 结果符合则扫描 结果不符合则不扫描,退出 /*************************************************************/