C51 COMPILER V7.06 DZ 12/31/2008 17:09:15 PAGE 1 C51 COMPILER V7.06, COMPILATION OF MODULE DZ OBJECT MODULE PLACED IN DZ.OBJ COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DZ.c BROWSE DEBUG OBJECTEXTEND stmt level source 1 #include 2 #include 3 4 unsigned char data dis_digit; 5 unsigned char key_s, key_v; 6 7 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 8 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 9 unsigned char data dis_buf[8]; 10 unsigned char data dis_index; 11 unsigned char hour,min,sec; 12 unsigned char sec100; 13 14 sbit K1 = P3^4; 15 sbit K2 = P3^5; 16 sbit dula=P2^6; 17 sbit wela=P2^7; 18 bit scan_key(); 19 void proc_key(); 20 void inc_sec(); 21 void inc_min(); 22 void inc_hour(); 23 //void display(); 24 void delay(unsigned char ms); 25 void display1(unsigned char a1,unsigned char a2,unsigned char a3,unsigned char a4,unsigned char a5,unsigne -d char a6); 26 void main(void) 27 { 28 1 P0 = 0xff; 29 1 P2 = 0xff; 30 1 TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式 31 1 TH1 = 0xdc; 32 1 TL1 = 0; 33 1 34 1 TH0 = 0xFC; 35 1 TL0 = 0x17; 36 1 37 1 hour = 12; 38 1 min = 00; 39 1 sec = 00; 40 1 41 1 sec100 = 0; 42 1 43 1 dis_buf[0] = hour / 10; // 时十位 44 1 dis_buf[1] = hour % 10; // 时个位 45 1 dis_buf[3] = min / 10; // 分十位 46 1 dis_buf[4] = min % 10; // 分个位 47 1 dis_buf[6] = sec / 10; // 秒十位 48 1 dis_buf[7] = sec % 10; // 秒个位 49 1 // dis_buf[2] = 0xbf; // 显示"-" 50 1 // dis_buf[5] = 0xbf; // 显示"-" 51 1 52 1 dis_digit = 0xfe; 53 1 dis_index = 0; 54 1 C51 COMPILER V7.06 DZ 12/31/2008 17:09:15 PAGE 2 55 1 TCON = 0x01; 56 1 IE = 0x8a; // 使能timer0,1 中断 57 1 TR1 = 1; 58 1 59 1 key_v = 0x03; 60 1 61 1 while(1) 62 1 { 63 2 if(scan_key()) 64 2 { 65 3 delay(10); 66 3 if(scan_key()) 67 3 { 68 4 key_v = key_s; 69 4 proc_key(); 70 4 } 71 3 } 72 2 display1(dis_buf[0],dis_buf[1],dis_buf[3],dis_buf[4],dis_buf[6],dis_buf[7]); 73 2 } 74 1 } 75 76 bit scan_key() 77 { 78 1 key_s = 0x00; 79 1 key_s |= K2; 80 1 key_s <<= 1; 81 1 key_s |= K1; 82 1 return(key_s ^ key_v); 83 1 } 84 85 void proc_key() 86 { 87 1 EA = 0; 88 1 if((key_v & 0x01) == 0) // K1 89 1 { 90 2 inc_hour(); 91 2 } 92 1 else if((key_v & 0x02) == 0) // K2 93 1 { 94 2 min++; 95 2 if(min > 59) 96 2 { 97 3 min = 0; 98 3 } 99 2 dis_buf[3] = min / 10; // 分十位 100 2 dis_buf[4] = min % 10; // 分个位 101 2 } 102 1 103 1 EA = 1; 104 1 } 105 /* 106 void timer0() interrupt 1 107 // 定时器0中断服务程序, 用于数码管的动态扫描 108 // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量 109 // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时, 110 // 选通P2.0口数码管 111 // dis_buf --- 显于缓冲区基地址 112 { 113 TH0 = 0xFC; 114 TL0 = 0x17; 115 116 P2 = 0xff; // 先关闭所有数码管 C51 COMPILER V7.06 DZ 12/31/2008 17:09:15 PAGE 3 117 P0 = dis_buf[dis_index]; // 显示代码传送到P0口 118 P2 = dis_digit; // 119 120 dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管 121 dis_index++; // 122 123 dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描 124 } 125 */ 126 void timer1() interrupt 3 127 { 128 1 TH1 = 0xdc; 129 1 130 1 sec100++; 131 1 132 1 if(sec100 >= 100) 133 1 { 134 2 sec100 = 0; 135 2 inc_sec(); 136 2 } 137 1 } 138 139 void inc_sec() 140 { 141 1 sec++; 142 1 if(sec > 59) 143 1 { 144 2 sec = 0; 145 2 inc_min(); 146 2 } 147 1 dis_buf[6] = sec / 10; // 秒十位 148 1 dis_buf[7] = sec % 10; // 秒个位 149 1 } 150 151 void inc_min() 152 { 153 1 min++; 154 1 if(min > 59) 155 1 { 156 2 min = 0; 157 2 inc_hour(); 158 2 } 159 1 dis_buf[3] = min / 10; // 分十位 160 1 dis_buf[4] = min % 10; // 分个位 161 1 } 162 163 void inc_hour() 164 { 165 1 hour++; 166 1 if(hour > 23) 167 1 { 168 2 hour = 0; 169 2 } 170 1 if(hour > 9) 171 1 dis_buf[0] = hour / 10; // 时十位 172 1 else 173 1 dis_buf[0] = 0x00; // 当小时的十位为0时不显示 174 1 dis_buf[1] = hour % 10; // 时个位 175 1 176 1 } 177 178 C51 COMPILER V7.06 DZ 12/31/2008 17:09:15 PAGE 4 179 void delay(unsigned char ms) 180 // 延时子程序 181 { 182 1 unsigned char i; 183 1 while(ms--) 184 1 { 185 2 for(i = 0; i < 120; i++); 186 2 } 187 1 } 188 189 void display1(unsigned char a1,unsigned char a2,unsigned char a3,unsigned char a4,unsigned char a5,unsigne -d char a6) //显示程序 190 { 191 1 dula=0; 192 1 P0=table[a1]; //显示百位 193 1 dula=1; 194 1 dula=0; 195 1 196 1 wela=0; 197 1 P0=0x7e; 198 1 wela=1; 199 1 wela=0; 200 1 delay(1); 201 1 202 1 dula=0; 203 1 P0=table[a2]; //显示十位 204 1 dula=1; 205 1 dula=0; 206 1 207 1 wela=0; 208 1 P0=0x7d; 209 1 wela=1; 210 1 wela=0; 211 1 delay(1); 212 1 213 1 P0=table[a3]; //显示个位 214 1 dula=1; 215 1 dula=0; 216 1 217 1 P0=0x7b; 218 1 wela=1; 219 1 wela=0; 220 1 delay(1); 221 1 222 1 P0=table[a4]; //显示个位 223 1 dula=1; 224 1 dula=0; 225 1 226 1 P0=0x77; 227 1 wela=1; 228 1 wela=0; 229 1 delay(1); 230 1 231 1 P0=table[a5]; //显示个位 232 1 dula=1; 233 1 dula=0; 234 1 235 1 P0=0xef; 236 1 wela=1; 237 1 wela=0; 238 1 delay(1); 239 1 C51 COMPILER V7.06 DZ 12/31/2008 17:09:15 PAGE 5 240 1 P0=table[a6]; //显示个位 241 1 dula=1; 242 1 dula=0; 243 1 244 1 P0=0xdf; 245 1 wela=1; 246 1 wela=0; 247 1 delay(1); 248 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 527 ---- CONSTANT SIZE = 16 ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 16 6 IDATA SIZE = ---- ---- BIT SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)