這個程序還可以優(yōu)化很多,仿真測試OK。
- #include "reg51.h"
- #include "intrins.h"
- #define u8 unsigned char
- sbit P36 = P3 ^ 6;
- sbit P37 = P3 ^ 7;
- sbit STCP = P3 ^ 0;//定義74HC595移位寄存器
- sbit SHCP = P3 ^ 2;
- sbit DS = P3 ^ 1;
- u8 code table[16] = { //共陰數(shù)碼管段碼16進制
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
- };
- void delay(){
- u8 a,b;
- for(b=19;b>0;b--)
- for(a=130;a>0;a--);
- }
- void txd595(u8 d) {
- u8 i;
- for (i = 0; i < 8; i++) {
- DS = d & 0x80;
- SHCP = 0;
- d <<= 1;
- SHCP = 1;
- }
- STCP=0;_nop_();STCP=1;
- }
- void display(u8 d) {
- P37 = 0;
- txd595(table[d%10]);
- delay();
- P37 = 1;
- _nop_();
- P36 = 0;
- txd595(table[d/10]);
- delay();
- P36 = 1;
- }
- u8 b0(u8 dat) { //取一個字節(jié)中有多少個二進制0 返回0~8
- u8 i, j = 0;
- for (i = 0; i < 8; i++) {
- if (!(dat & (1 << i))) {
- j++;
- }
- }
- return j;
- }
- u8 key_scan() { //無按鍵返回0 有按鍵返回1~64 (禁止多個按鍵同時按下,出錯返回99)
- u8 i, j, k, l, m;
- P0 = 0xFF;
- _nop_();
- k = P0;
- if (k != 0xFF) {
- if (b0(k) != 1) return 99;
- for (i = 0; i < 8; i++) {
- if (!(k & (1 << i))) {
- return 57 + i;
- }
- }
- }
- for (i = 0; i < 8; i++) {
- j = ~(1 << i);
- P0 = j;
- _nop_();
- k= P0;
- if (k != j) {
- if (k & ~j || b0(k) != 2) return 99;
- m = 0;
- for (l = 0; l < 8; l++) {
- if (i == l) continue;
- m++;
- if (!(k & (1 << l))) {
- return i * 7 + m;
- }
- }
- }
- }
- return 0;
- }
- void main() {
- while (1) {
- display(key_scan());
- }
- }
復(fù)制代碼 |