单片机,矩阵键盘扫描驱动

void Delay30ms()
{
   unsigned char i,j;
    for(i = 0;i < 100;i++)
      for(j = 0;j < 100;j++);
}

/************************************************
*        *函数名:Keyscan
*        *函数功能:键盘扫描函数
*        *全局变量:无
*        *调用函数:Delay30ms()
*        *传入参数:无
*************************************************/
uchar Keyscan()   
{
    uchar scode;               //定义行扫描变量
    uchar rcode ;               //定义返回编码变量
    uchar m;                //定义行首编码变量
    uchar k;                //定义列检测码
    uchar i,j;                //定义循环控制变量
    P1 = 0x0f;               //发全列为0扫描码,行线输入
    if((P1 & 0x0f) != 0x0f)            //若有键按下
    {
        Delay30ms();                     //延时消抖
        if((P1 & 0x0f) != 0x0f)        //若有键按下
        {
            m = 0x03;                 //行首编码变量赋初值
            scode = 0xfe;            //行扫描变量赋初值
            for(i = 0;i < 4;i++)
            {
                P1 = scode;         //输出列线吗
                k = 0x10;             //列检测码赋初值
                for(j = 0;j < 4;j++)
                {    
                    if((P1 & k) == 0)    //本列有键按下
                    {           
                        rcode = m + j;        //求键码
                        while((P1 & 0xf0) != 0xf0);    //等待按键释放
                        BELL = 0;
                        Delay30ms();
                        Delay30ms();
                        Delay30ms();
                        BELL = 1;
                        return (rcode);        //返回键码
                    }                        
                    else
                        k = k <<1 ;           //列检测码左移一位        
                }
                m = m + 4;                    //下一行行首编码        
                scode = scode << 1;            //行扫描变量左移一位
            }                                    
        }
    }
    return 0;            //若没键按下,返回0
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值