矩阵键盘:实现数码管最右端按键不同显示不同数字0-F

代码:

#include "reg51.h"
// 数码管共阴极字符数组 0-f
unsigned char seg_code[16] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};


void delay(){  // 延时 n ms
    unsigned int i = 10000;
    while (i--);
}

void display(unsigned char n){
    switch(n){
        case 0xff - 0x11: P0 = seg_code[0]; break;
        case 0xff - 0x12: P0 = seg_code[1]; break;
        case 0xff - 0x14: P0 = seg_code[2]; break;
        case 0xff - 0x18: P0 = seg_code[3]; break;
        
        case 0xff - 0x21: P0 = seg_code[4]; break;
        case 0xff - 0x22: P0 = seg_code[5]; break;
        case 0xff - 0x24: P0 = seg_code[6]; break;
        case 0xff - 0x28: P0 = seg_code[7]; break;
    
        case 0xff - 0x41: P0 = seg_code[8]; break;
        case 0xff - 0x42: P0 = seg_code[9];break;
        case 0xff - 0x44: P0 = seg_code[10];break;
        case 0xff - 0x48: P0 = seg_code[11];break;
            
        
        case 0xff - 0x81: P0 = seg_code[12];break;
        case 0xff - 0x82: P0 = seg_code[13];break;
        case 0xff - 0x84: P0 = seg_code[14];break;
        case 0xff - 0x88: P0 = seg_code[15];break;
        default: break;
    }
}

// 按键延时实现 索引自增
void key_scan(){
    unsigned char tmp1, tmp2, tmp;    
    P2 = 0xf0;
    if (P2 != 0xf0){ // 检测按键是否变化
        delay();
        tmp1 = P2;
        P2 = 0x0f;
        if (P2 != 0x0f){
            tmp2 = P2;
        }
    }
    
    tmp = tmp1 + tmp2;
    display(tmp);
}

void main(){
    P0 = 0x00;
    P1 = 0x7f;
    while (1){
        key_scan();
    }
}

仿真图:

矩阵键盘:实现数码管最右端按键不同显示不同数字0-F_第1张图片

原理简介:

矩阵键盘:实现数码管最右端按键不同显示不同数字0-F_第2张图片

你可能感兴趣的:(51单片机,单片机,proteus)