1 #include "8051.h" 2 typedef unsigned char u8; 3 typedef unsigned int u16; 4 u8 smgduan[]= { 5 /*0 1 2 3 4 5 6 7 */ 6 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 7 /*8 9 A B C D E F */ 8 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; 9 10 // P0口为数码管的位选的8位输入引脚 11 // P0 = 0x00; 12 13 14 void Delayms(u16 ms); 15 void shumaguan(u8 n); 16 void DigDisplay(); 17 void KeyTest(); 18 void smg(u8 n, u8 m); 19 void key_4x4(); 20 21 void main() 22 { 23 while(1) 24 { 25 key_4x4(); 26 } 27 } 28 29 // 不精确的延时函数 30 void Delayms(u16 ms) 31 { 32 unsigned int i, j; 33 for(i = ms; i > 0; i--) 34 for(j = 110; j > 0; j--); 35 return; 36 } 37 38 // 数码管根据74HC138译码器选择对应的段(选择哪个数码管显示) 39 void shumaguan(u8 n) 40 { 41 switch(n) 42 { 43 case 0: 44 LSA = 0;LSB = 0;LSC = 0;break; 45 case 1: 46 LSA = 1;LSB = 0;LSC = 0;break; 47 case 2: 48 LSA = 0;LSB = 1;LSC = 0;break; 49 case 3: 50 LSA = 1;LSB = 1;LSC = 0;break; 51 case 4: 52 LSA = 0;LSB = 0;LSC = 1;break; 53 case 5: 54 LSA = 1;LSB = 0;LSC = 1;break; 55 case 6: 56 LSA = 0;LSB = 1;LSC = 1;break; 57 case 7: 58 LSA = 1;LSB = 1;LSC = 1;break; 59 } 60 } 61 62 // 数码管显示数字,并以十进制递增 63 void DigDisplay() 64 { 65 u8 i1 = 0; 66 u8 i2 = 0; 67 u8 i3 = 0; 68 u8 i4 = 0; 69 u8 i5 = 0; 70 u8 i6 = 0; 71 u8 i7 = 0; 72 u8 i8 = 0; 73 74 75 76 77 for (i8 = 0; i8 < 10; i8++) 78 for (i7 = 0; i7 < 10; i7++) 79 for (i6 = 0; i6 < 10; i7++) 80 for (i5 = 0; i5 < 10; i5++) 81 for (i4 = 0; i4 < 10; i4++) 82 for (i3 = 0; i3 < 10; i3++) 83 for (i2 = 0; i2 < 10; i2++) 84 for (i1 = 0; i1 < 10; i1++) 85 { 86 u16 cnt = 10; 87 while (cnt--) 88 { 89 shumaguan(0); //选中第一个数码管 90 P0 = smgduan[i1]; //给他送一个数字 91 Delayms(1); //稍微延时一下下 92 shumaguan(1); //然后切换到第二个数码管。。。如此进行一直到最后一个数码管。。。最后再改变送入数码管的数值。。。再来一遍 93 P0 = smgduan[i2]; 94 Delayms(1); 95 shumaguan(2); 96 P0 = smgduan[i3]; 97 Delayms(1); 98 shumaguan(3); 99 P0 = smgduan[i4]; 100 Delayms(1); 101 shumaguan(4); 102 P0 = smgduan[i5]; 103 Delayms(1); 104 shumaguan(5); 105 P0 = smgduan[i6]; 106 Delayms(1); 107 shumaguan(6); 108 P0 = smgduan[i7]; 109 Delayms(1); 110 shumaguan(7); 111 P0 = smgduan[i8]; 112 Delayms(1); 113 P0 = 0x00; 114 } 115 } 116 } 117 118 // 测试独立按键功能 119 void KeyTest() 120 { 121 while (1) 122 { 123 /* 124 * 不推荐此做法 125 * 此做法占用内存高 126 */ 127 if (!K1) 128 { 129 // 软件延时消除抖动 130 Delayms(10); 131 if (!K1) 132 { 133 LED_1 = !LED_1; 134 } 135 // 确认按键已经按下 136 while(!K1); 137 } 138 if (!K2) 139 { 140 // 软件延时消除抖动 141 Delayms(10); 142 if (!K2) 143 { 144 LED_2 = !LED_2; 145 } 146 while(!K2); 147 } 148 if (!K3) 149 { 150 // 软件延时消除抖动 151 Delayms(10); 152 if (!K3) 153 { 154 LED_3 = !LED_3; 155 } 156 while(!K3); 157 } 158 if (!K4) 159 { 160 // 软件延时消除抖动 161 Delayms(10); 162 if (!K4) 163 { 164 LED_4 = !LED_4; 165 } 166 while(!K4); 167 } 168 } 169 } 170 171 // 给指定的数码管送入指定的数字 172 void smg(u8 n, u8 m) 173 { 174 if (1==n) 175 { 176 P0 = 0x00; 177 shumaguan(0); //选中第一个数码管 178 P0 = smgduan[m]; //给他送一个数字 179 Delayms(10); 180 } 181 if (2==n) 182 { 183 P0 = 0x00; 184 shumaguan(1); //选中第一个数码管 185 P0 = smgduan[m]; //给他送一个数字 186 Delayms(10); 187 } 188 if (3==n) 189 { 190 P0 = 0x00; 191 shumaguan(2); //选中第一个数码管 192 P0 = smgduan[m]; //给他送一个数字 193 Delayms(10); 194 } 195 if (4==n) 196 { 197 P0 = 0x00; 198 shumaguan(3); //选中第一个数码管 199 P0 = smgduan[m]; //给他送一个数字 200 Delayms(10); 201 } 202 if (5==n) 203 { 204 P0 = 0x00; 205 shumaguan(4); //选中第一个数码管 206 P0 = smgduan[m]; //给他送一个数字 207 Delayms(10); 208 } 209 if (6==n) 210 { 211 P0 = 0x00; 212 shumaguan(5); //选中第一个数码管 213 P0 = smgduan[m]; //给他送一个数字 214 Delayms(10); 215 } 216 if (7==n) 217 { 218 P0 = 0x00; 219 shumaguan(6); //选中第一个数码管 220 P0 = smgduan[m]; //给他送一个数字 221 Delayms(10); 222 } 223 if (8==n) 224 { 225 P0 = 0x00; 226 shumaguan(7); //选中第一个数码管 227 P0 = smgduan[m]; //给他送一个数字 228 Delayms(10); 229 } 230 } 231 232 // 可以定义按键按下的事件 233 void key_4x4() 234 { 235 // 每次选中其中一根地线的时候要消除其他地线的状态,不然会混乱 236 // 此处选定最上一列为低电平(使能) 237 P1_7 = 0; 238 P1_6 = 1; 239 P1_5 = 1; 240 P1_4 = 1; 241 if (!P1_3) 242 { 243 // 软件延时消除抖动 244 Delayms(10); 245 if (!P1_3) 246 { 247 smg(1,1); 248 } 249 // 确认按键已经按下 250 while(!P1_3); 251 } 252 if (!P1_2) 253 { 254 // 软件延时消除抖动 255 Delayms(10); 256 if (!P1_2) 257 { 258 smg(1,2); 259 } 260 // 确认按键已经按下 261 while(!P1_2); 262 } 263 if (!P1_1) 264 { 265 // 软件延时消除抖动 266 Delayms(10); 267 if (!P1_1) 268 { 269 smg(1,3); 270 } 271 // 确认按键已经按下 272 while(!P1_1); 273 } 274 if (!P1_0) 275 { 276 // 软件延时消除抖动 277 Delayms(10); 278 if (!P1_0) 279 { 280 ; 281 } 282 // 确认按键已经按下 283 while(!P1_0); 284 } 285 286 P1_7 = 1; 287 P1_6 = 0; 288 P1_5 = 1; 289 P1_4 = 1; 290 if (!P1_3) 291 { 292 // 软件延时消除抖动 293 Delayms(10); 294 if (!P1_3) 295 { 296 smg(1,4); 297 } 298 // 确认按键已经按下 299 while(!P1_3); 300 } 301 if (!P1_2) 302 { 303 // 软件延时消除抖动 304 Delayms(10); 305 if (!P1_2) 306 { 307 smg(1,5); 308 } 309 // 确认按键已经按下 310 while(!P1_2); 311 } 312 if (!P1_1) 313 { 314 // 软件延时消除抖动 315 Delayms(10); 316 if (!P1_1) 317 { 318 smg(1,6); 319 } 320 // 确认按键已经按下 321 while(!P1_1); 322 } 323 if (!P1_0) 324 { 325 // 软件延时消除抖动 326 Delayms(10); 327 if (!P1_0) 328 { 329 ; 330 } 331 // 确认按键已经按下 332 while(!P1_0); 333 } 334 P1_7 = 1; 335 P1_6 = 1; 336 P1_5 = 0; 337 P1_4 = 1; 338 if (!P1_3) 339 { 340 // 软件延时消除抖动 341 Delayms(10); 342 if (!P1_3) 343 { 344 smg(1,7); 345 } 346 // 确认按键已经按下 347 while(!P1_3); 348 } 349 if (!P1_2) 350 { 351 // 软件延时消除抖动 352 Delayms(10); 353 if (!P1_2) 354 { 355 smg(1,8); 356 } 357 // 确认按键已经按下 358 while(!P1_2); 359 } 360 if (!P1_1) 361 { 362 // 软件延时消除抖动 363 Delayms(10); 364 if (!P1_1) 365 { 366 smg(1,9); 367 } 368 // 确认按键已经按下 369 while(!P1_1); 370 } 371 if (!P1_0) 372 { 373 // 软件延时消除抖动 374 Delayms(10); 375 if (!P1_0) 376 { 377 ; 378 } 379 // 确认按键已经按下 380 while(!P1_0); 381 } 382 P1_7 = 1; 383 P1_6 = 1; 384 P1_5 = 1; 385 P1_4 = 0; 386 if (!P1_3) 387 { 388 // 软件延时消除抖动 389 Delayms(10); 390 if (!P1_3) 391 { 392 smg(1,1); 393 } 394 // 确认按键已经按下 395 while(!P1_3); 396 } 397 if (!P1_2) 398 { 399 // 软件延时消除抖动 400 Delayms(10); 401 if (!P1_2) 402 { 403 smg(1,2); 404 } 405 // 确认按键已经按下 406 while(!P1_2); 407 } 408 if (!P1_1) 409 { 410 // 软件延时消除抖动 411 Delayms(10); 412 if (!P1_1) 413 { 414 smg(1,3); 415 } 416 // 确认按键已经按下 417 while(!P1_1); 418 } 419 if (!P1_0) 420 { 421 // 软件延时消除抖动 422 Delayms(10); 423 if (!P1_0) 424 { 425 ; 426 } 427 // 确认按键已经按下 428 while(!P1_0); 429 } 430 }
转载于:https://www.cnblogs.com/hong567/p/10808071.html