任务描述:单片机连接8位共阳极数码管和4*4矩阵键盘,
对16个按键进行编号0~f,按下不同,显示相应数字。
每个独立按键显示不同编号
画出电路图:
对开关标号:
void key1(); //等待按键按下,无限查询
void key2(); //扫描按键位置,行列扫描
void key3(); //处理按键请求,显示编号
/************************* 项目名称:项目三简易计算器 任务名称:任务3-2按键编号显示 任务描述:单片机连接8位共阳极数码管和4*4矩阵键盘, 对16个按键进行编号0~f,按下不同,显示相应数字。 *************************/ #include<reg51.h> //51单片机寄存器定义头文件 sbit row0=P1^0; sbit row1=P1^1; sbit row2=P1^2; sbit row3=P1^3; sbit col0=P1^4; sbit col1=P1^5; sbit col2=P1^6; sbit col3=P1^7; int n;//存放按键编号 int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//定义0~9共阳极七段码,与a,b,c,d,e,f void key1();//等待按键按下,无限查询 void key2();//扫描按键位置,行列扫描 void key3();//处理按键请求,显示编号 /**********************************************/ void main() { while(1) { key1(); key2(); key3(); } } /**********************************************/ void key1() { while(1) { P1=0x0f; if(P1!=0x0f)//有变化,一定是有按键按下,导致某行某列短路 break;//退出查询 } } /**********************************************/ void key2() { P1=0xff;//行列都写1 col0=0;//清零0列 if(row0==0) n=0; if(row1==0) n=1; if(row2==0) n=2; if(row3==0) n=3; P1=0xff;//行列都写1 col1=0;//清零1列 if(row0==0) n=4; if(row1==0) n=5; if(row2==0) n=6; if(row3==0) n=7; P1=0xff;//行列都写1 col2=0;//清零2列 if(row0==0) n=8; if(row1==0) n=9; if(row2==0) n=10; if(row3==0) n=11; P1=0xff;//行列都写1 col3=0;//清零3列 if(row0==0) n=12; if(row1==0) n=13; if(row2==0) n=14; if(row3==0) n=15; } /**********************************************/ void key3() { P2=0xfe;//1111 1110 P0=seg[n]; }效果: