本实验通过STC8A8K64D4芯片控制点击矩阵按键静态数码管显示对应的数字0-F具体代码如下/************************************************************************************** 实验名称STC8A 矩阵按键控制共阳极静态数码管实验 实验现象下载程序后按下矩阵S1~S16数码管显示0~F 接线说明 STC8A单片机--数码管模块 P00~P07--数码管段选A~DP P20(LSA)、P21(LSB)、P22(LSC) -- 数码管38译码位选 P1 接4*4矩阵按键 注意事项USB连接线给开发板通电下载程序STC下载软件中内部IRC时钟选择11.0592MHZ ***************************************************************************************/ #include STC8.H #define MAIN_Fosc 11059200L #define uint16 unsigned int #define uint8 unsigned char typedef unsigned int u16; typedef unsigned char u8; #define SMG_A_DP_PORT P0 #define KEY_MATRIX_PORT P1 void delay_ms(uint16 x) { uint16 j,i; for(j0;jx;j) { for(i0;i1100;i); } } void delay_10us(u16 ten_us) { while(ten_us--); } //共阳极数码管0~F段码 uint8 gsmg_code[17]{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; u8 key_matrix_ranks_scan(void) { u8 key_value0; KEY_MATRIX_PORT0xf7;//第一列拉低 if(KEY_MATRIX_PORT!0xf7) { delay_10us(1000); switch(KEY_MATRIX_PORT) { case 0x77: key_value1;break; case 0xb7: key_value5;break; case 0xd7: key_value9;break; case 0xe7: key_value13;break; } } while(KEY_MATRIX_PORT!0xf7); KEY_MATRIX_PORT0xfb;//第二列拉低 if(KEY_MATRIX_PORT!0xfb) { delay_10us(1000); switch(KEY_MATRIX_PORT) { case 0x7b: key_value2;break; case 0xbb: key_value6;break; case 0xdb: key_value10;break; case 0xeb: key_value14;break; } } while(KEY_MATRIX_PORT!0xfb); KEY_MATRIX_PORT0xfd;//第三列拉低 if(KEY_MATRIX_PORT!0xfd) { delay_10us(1000); switch(KEY_MATRIX_PORT) { case 0x7d: key_value3;break; case 0xbd: key_value7;break; case 0xdd: key_value11;break; case 0xed: key_value15;break; } } while(KEY_MATRIX_PORT!0xfd); KEY_MATRIX_PORT0xfe;//第四列拉低 if(KEY_MATRIX_PORT!0xfe) { delay_10us(1000); switch(KEY_MATRIX_PORT) { case 0x7e: key_value4;break; case 0xbe: key_value8;break; case 0xde: key_value12;break; case 0xee: key_value16;break; } } while(KEY_MATRIX_PORT!0xfe); return key_value; } int main() { uint8 key_val0; uint8 disp0; //保存要显示的数字 //修复1IO口模式配置 P0M1 0x00; P0M0 0x00; //P0准双向段选 P1M1 0x00; P1M0 0x00; //P1准双向矩阵按键必须配 while(1) { key_val key_matrix_ranks_scan(); if(key_val ! 0) //检测到按键按下 { disp key_val - 1; //1~16转0~15下标 SMG_A_DP_PORT gsmg_code[disp]; } //短延时防止CPU空跑卡死不阻塞按键扫描 delay_ms(10); } }