(编写程序要从小的程序一步一步做起!)

//程序:矩阵键盘
//功能:验证矩阵键盘——按下不弄的键盘在数码管上显示不同的数字
#include<reg51.h>  //头文件
#define uchar unsigned char    //类型定义
#define uint unsigned int    //类型定义
#define KEY P1    //定义端口
//子函数声明
void SCANkey();  //扫描键盘函数
bit hitkey();  //判断是否有键盘按下,有则返回1,没有返回0
uchar scan_key();//扫描键盘,返回键盘值
void delay(uint N);//延迟函数
void key_manage(uchar keycode);//键值处理函数
void display(uchar n);//数码管显示函数
//数码管显示码表
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

//主函数
 void main()
 {
   EA=0;   //关中断
   while(1)  //无限循环
   {
    SCANkey();//进行键盘扫描
   }
 }
//函数名:SCANkey
//函数功能:扫描键盘程序,有键按下完成按键处理,无按键按下时直接返回
//形式参数:无
//返回值:无
 void SCANkey()
 {
 uchar key_code;
 if(hitkey())  //判断是否有按键按下
 {
 delay(2);  //延时20ms,消除按键抖动干扰
 if(hitkey()) //再次判断是否是有效按键
 {
 key_code=scan_key();
 while(hitkey()); //等待按键释放
 key_manage(key_code); //键盘扫描、键值处理跳转、按键处理
 }
 }
 }
//函数名:hitkey
//函数功能:判断是否有键按下
//形式参数:无
//返回值:1表示有按键按下,0表示无按键按下
bit hitkey()
 {
 uchar scancode,keycode;
 scancode=0x0f;  //P1.4~P1.7输出全0
 KEY=scancode;   //扫描按键,换回键值
 keycode=KEY;  //读P1.0~P1.3的状态
 if((keycode&0x0f)==0x0f)  //屏蔽高4位
 return(0);   //全1则无按键闭合,换回0
 else
 return(1);     //全0则有按键闭合,换回1
 }
//函数名:delay
//函数功能:延时效果,实现(N*10ms)的延时。系统采用12MHZ的时钟时,延时满足要求,其他情况需要改动。
//形式参数:N
//返回值:无
 void delay(uint N)
 {
 int i,j,k;
 for(i=0;i<N;i++)
 for(j=0;j<10;j++)
 for(k=0;k<120;k++);
 }
//函数名:sacn_key
//函数功能:扫描按键,换回键值。高4位代表行,低4位代表列
//形式参数:无
//返回值:keycode,相应的按键按下扫描出一个按键扫描码,送到key_manage函数提取扫描码
 uchar scan_key()
 {
 uchar scancode,keycode,keycodeh,keycodel;
 scancode=0xef;     //扫描键盘,采用逐行扫描法,P1.4=0,扫描第一行
 while(scancode!=0xff)
 {
 KEY=scancode;      //输入扫描码,扫描P1.4对应的行
 keycode=KEY;      //读出数据,看是否在此行的某列键盘被按下
 if((keycode&0x0f)!=0x0f)break; //扫描到按下十位键,怎退出
 scancode=(keycode<<1)|0x0f; //否则,左移,更新扫描码继续扫描
 }
 keycode=~keycode;     //键盘扫描码变反,返回
 keycodeh=keycode<<4;
 keycodel=keycode>>4;
 keycode=keycodeh|keycodel;
 return(keycode);
 }
//函数名:key_manage
//函数功能:键值处理跳转,根据keycode而对应display参数
//形式参数:keycode扫描键盘返回的值。高4位代表行,低4位代表列
//返回值:display(?)函数
 void key_manage(uchar keycode)
 {
    switch(keycode)
   {
   case 0x11:display(0);break;
   case 0x12:display(1);break;
   case 0x14:display(2);break;
   case 0x18:display(3);break;
   case 0x21:display(4);break;
   case 0x22:display(5);break;
   case 0x24:display(6);break;
   case 0x28:display(7);break;
   case 0x41:display(8);break;
   case 0x42:display(9);break;
   case 0x44:display(10);break;
   case 0x48:display(11);break;
   case 0x81:display(12);break;
   case 0x82:display(13);break;
   case 0x84:display(14);break;
   case 0x88:display(15);break;
   }
 }
//函数名:display
//函数功能:让数码管显示相应正确的值
//形式参数:n  key_manage函数根据扫描码返回的不同的值
//返回值:无
 void display(uchar n)
 {
 P0=table[n];
 }

 

c51 proteus仿真编写矩阵键盘(练习自己编写程序的规范)