单片机实验五、矩阵键盘驱动设计

要求:

(1)创建KeilC工程,编写代码捕捉开发板上矩阵键盘的按键动作,可准确分辨同行或同列中不同的键值;

(2)编写代码,准确分辨4行4列中不同的键值; 

(3)编写代码,在捕捉键值的基础上添加防抖动处理以及屏蔽多键按下等误操作;

(4)发挥创意,使键盘配合定时器驱动蜂鸣器,实现简易音乐弹奏功能。

#include <REGX52.H>

sbit Buzzer=P2^5;

void Delay(unsigned int xms)
{
    unsigned char i, j;
    while(xms--)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
    }
}

void de(unsigned short p)
{
    while(p--);
}

unsigned char MatrixKey()
{
    unsigned char KeyNumber=0;
    
    P1=0xFF;
    P1_3=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
    
    P1=0xFF;
    P1_2=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
    
    P1=0xFF;
    P1_1=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
    
    P1=0xFF;
    P1_0=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
    
    return KeyNumber;
}

unsigned char Keyn()
{
    unsigned char Ke=0;
    
    if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);Ke=1;}
    if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);Ke=2;}
    if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);Ke=3;}
    if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);Ke=4;}
    
    return Ke;
}


unsigned char KeyNum,key,k;
unsigned char tone[10]={0,0,0,0,0,0,0,0,0,0};

void sound()
{
    unsigned short i=220;
    unsigned short t;
    if(KeyNum==1)
    {
        KeyNum=0;
        tone[t]=191;
        t++;
        while(i--)
        {
            Buzzer=~Buzzer;
            de(191);
        }
    }
    
        if(KeyNum==2)
    {
        KeyNum=0;
        tone[t]=170;
        t++;
        while(i--)
        {
            Buzzer=~Buzzer;
            de(170);
        }
    }
    
    if(KeyNum==3)
    {
        KeyNum=0;
        tone[t]=152;
        t++;
        while(i--)
        {
            Buzzer=~Buzzer;
            de(152);
        }
    }
    
    if(KeyNum==4)
    {
        KeyNum=0;
        tone[t]=143;
        t++;
        while(i--)
        {
            Buzzer=~Buzzer;
            de(143);
        }
    }
    
    if(KeyNum==5)
    {
        KeyNum=0;
        tone[t]=128;
        t++;
        while(i--)
        {
            Buzzer=~Buzzer;
            de(128);
        }
    }
    
    if(KeyNum==6)
    {
        KeyNum=0;
        tone[t]=114;
        t++;
        while(i--)
        {
            Buzzer=~Buzzer;
            de(114);
        }
    }
    
    if(KeyNum==7)
    {
        KeyNum=0;
        tone[t]=101;
        t++;
        while(i--)
        {
            Buzzer=~Buzzer;
            de(101);
        }
    }
    
            
    if(key==1)
    {
          
        for (k=0;k<10;k++)
        {
            while(i--)
            {    
              Buzzer=~Buzzer;
              de(tone[k]);
            }
            i=220;
            Delay(100);
        }
    }
    
    if(key==3)
    {  
        t=0;
    }
    
    
}

void main()
{
      unsigned short i=220;
      TMOD &= 0xF0;        //设置定时器模式
      TMOD |= 0x01;        //设置定时器模式
      TL0 = 0x18;        //设置定时初值
      TH0 = 0xFC;        //设置定时初值
      TF0 = 0;        //清除TF0标志
      TR0 = 1;        //定时器0开始计时
      ET0=1;      
      EA=1;
      PT0=0; 
    while(1)
    {
          if(key==2) 
        {    
                while(i--)
                {
                    Buzzer=~Buzzer;
                    de(191);
                }    
        }
    }
}

void Timer0_Routine() interrupt 1
{
    KeyNum=MatrixKey();
  key=Keyn();
    /*取对应频率值的重装载值到定时器*/
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    sound();
    
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值