矩阵键盘实验

  • 实验目的及其要求

通过proteus仿真软件将原理图连接成教材所用tx-1c实验板的矩阵键盘分布并实现如下功能:

1共计16个矩阵键盘,其中前10个按键依次实现按下后在前三位数码管动态显示000至009的数字

2第十一个按键实现按下后加1的功能

3第十二个按键实现按下后减1的功能

4第十三个按键实现清零的功能

5第十四个按键按下后开启定时器T1并实现每1s钟使数码管加1显示的功能,显示范围为000至255之间

6第十五个按键按下后定时器暂停工作

7第十六个按键不设置功能

  • 实验原理图

  • 实验代码

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar numt0,key,n;

uchar code table[]={
   0x3f,0x06,0x5b,0x4f,
   0x66,0x6d,0x7d,0x07,
   0x7f,0x6f,0x77,0x7c,
   0x39,0x5e,0x79,0x71
};
void delayms(uint xms){
   uint i,j;
   for(i=xms;i>0;i--){
      for(j=110;j>0;j--);
   }
}

void display(uchar numdis){
   
   uchar bai,shi,ge;
   bai=numdis/100;
   shi=numdis%100/10;
   ge=numdis%10;
   
   P0=0x00;
   dula=1;
   P0=table[bai];
   dula=0;
   P0=0xff;
   wela=1;
   P0=0xfe;       //位选数据
   wela=0;
   delayms(5);
   
   P0=0x00;
   dula=1;
   P0=table[shi];
   dula=0;
   P0=0xff;
   wela=1;
   P0=0xfd;
   wela=0;
   delayms(5);
   
   P0=0x00;
   dula=1;
   P0=table[ge];
   dula=0;
   P0=0xff;
   wela=1;
   P0=0xfb;
   wela=0;
   delayms(5);
}


void init(){
   TMOD=0x11;     //设置定时器1为工作方式1(0000 0001)
   TH1=(65536-45872)/256;
   TL1=(65536-45872)%256;
   EA=1;             //开总中断
   ET1=1;        //开启定时器0中断
   TR1=0;
}



void matrixkeyscan(){
   uchar temp;
   P3=0xfe;       // 1111 1110     P3.0  按行检测
   temp=P3;
   temp=temp&0xf0;   // 1111 0000
   if(temp!=0xf0){
      
      delayms(10);
      temp=P3;
      temp=temp&0xf0;
      if(temp!=0xf0){
         temp=P3;
         switch(temp){
            case 0xee:    //1110 1110
               key=0;
            break;
            case 0xde:     //1101 1110
               key=1;
            break;
            
            case 0xbe:     //1011 1110
               key=2;
            break;
            case 0x7e:     //0111 1110
               key=3;
            break;      
         }
         
         while(temp!=0xf0){ 
            temp=P3;
            temp=temp&0xf0;
         }
         display(key);
      }      
   }
   
   
   /*第二行检测S4 S5 S6 S7   开始*/
    P3=0xfd;       // 1111 1101     P3.0  按行检测
   temp=P3;
   temp=temp&0xf0;   // 1111 0000
   if(temp!=0xf0){
      
      delayms(10);
      temp=P3;
      temp=temp&0xf0;
      if(temp!=0xf0){
         temp=P3;
         switch(temp){
            
            case 0xed:    //1110 1101
               key=4;
            break;
            
            case 0xdd:     //1101 1101
               key=5;
            break;
            
            case 0xbd:     //1011 1101
               key=6;
            break;
            
            case 0x7d:     //0111 1101
               key=7;
            break;
            
         }
         
         while(temp!=0xf0){
         
            temp=P3;
            temp=temp&0xf0;
         }
         display(key);
      }      
   }
     /*第二行检测S4 S5 S6 S7   结束*/
   
      /*第三行检测S8 S9 S10 S11  开始*/
    P3=0xfb;       // 1111 1011     P3.0  按行检测
   temp=P3;
   temp=temp&0xf0;   // 1111 0000
   if(temp!=0xf0){
      
      delayms(10);
      temp=P3;
      temp=temp&0xf0;
      if(temp!=0xf0){
         temp=P3;
         switch(temp){
            
            case 0xeb:    //1110 1011
               key=8;
            break;
            
            case 0xdb:     //1101 1011
               key=9;
            break;
            
            case 0xbb:     //1011 1011
               key++;
            break;
            
            case 0x7b:     //0111 1011
               key--;
            break;
            
         }
         
         while(temp!=0xf0){
         
            temp=P3;
            temp=temp&0xf0;
         }
         display(key);
      }      
   }
     /*第三行检测S8 S9 S10 S11   结束*/
   
      /*第四行检测S12 S13 S14 S15   开始*/
    P3=0xf7;       // 1111 0111     P3.0  按行检测
   temp=P3;
   temp=temp&0xf0;   // 1111 0000
   if(temp!=0xf0){
      
      delayms(10);
      temp=P3;
      temp=temp&0xf0;
      if(temp!=0xf0){
         temp=P3;
         switch(temp){
            
            case 0xe7:    //1110 0111
               key=0;
            break;
            
            case 0xd7:     //1101 0111
               if(!TR1){
                  TR1=~TR1;
               }
              
            break;
            
            case 0xb7:     //1011 0111
               if(TR1){
                  TR1=~TR1;
               }
            
            break;
            
            case 0x77:     //0111 0111
               key=15;
            break;
            
         }
         
         while(temp!=0xf0){
         
            temp=P3;
            temp=temp&0xf0;
         }
         display(key);
      }      
   }
     /*第四行检测S12 S13 S14 S15   结束*/
   
}


void main(){
   init();
 
   while(1){
   
      matrixkeyscan();        //调用键盘矩阵函数
      display(key);
   }
}

void T0_time() interrupt 3{
   
   TH1=(65536-45872)/256;
   TL1=(65536-45872)%256;
   numt0++;
   if(numt0==20){
      numt0=0;
      key++;
      if(key==256){
         key=0;
      }
   }
}
  • 验截图

(依次按第3、10、11、12、13、14、15按键得到的截图)

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OOQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值