微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > T0定时器中断延时,矩阵键盘扫描(线反转法)

T0定时器中断延时,矩阵键盘扫描(线反转法)

时间:10-02 整理:3721RD 点击:

/*********************************

功能描述:T0定时器中断法,矩阵键盘扫描(线反转法)。

返回值:key键值为1-16,出错码为0。

*********************************/

#include<reg52.h>       /*头文件*/

unsigned char keydelay;     /*keydelay按键持续ms数;    */

bit nkey,okey;      /*按键(新/旧)状态*/

void main()

{

    TMOD=0x01;      /*T0工作方式1*/

    TH0=0xfc;       /*T0装载初值,定时1ms*/

    TL0=0x18;

    EA=1;       /*开中断*/

    ET0=1;

    TR0=1;      /*启动T0*/

    while (1)

    {

        /*以下为键值计算核心*/

        if (nkey!=okey)     /*按键的新旧状态不相等?*/

        {

            okey=nkey;  /*把当前按键状态保存起来*/

            if (nkey&&(P3!=0x0f))       /*按键是否按下,没有松开?*/

            {

                unsigned char keyX,keyY,key;    /*keyX按键行坐标;keyY按键列坐标;key按键键值*/

                keyX=P3&0x0f;       /*开始用线反转法计算键值*/

                P3=0xf0;

                keyY=P3&0xf0;

                key=keyX|keyY;

                switch (key)

                {

                    case 0xee:  key=1;

                        break;

                    case 0xde:  key=2;

                        break;

                    case 0xbe:  key=3;

                        break;

                    case 0x7e:  key=4;

                        break;

                    case 0xed:  key=5;

                        break;

                    case 0xdd:  key=6;

                        break;

                    case 0xbd:  key=7;

                        break;

                    case 0x7d:  key=8;

                        break;

                    case 0xeb:  key=9;

                        break;

                    case 0xdb:  key=10;

                        break;

                    case 0xbb:  key=11;

                        break;

                    case 0x7b:  key=12;

                        break;

                    case 0xe7:  key=13;

                        break;

                    case 0xd7:  key=14;

                        break;

                    case 0xb7:  key=15;

                        break;

                    case 0x77:  key=16;

                        break;                        

                    default:  key=0;    /*出错码*/

                        break;

                }

                P1=key;     /*P1流水灯显示按键值*/

            }

        }

    }

}

void Time0 () interrupt 1       /*T0中断服务程序*/

{

    TH0=0xfc;   /*T0装初值定时1ms*/

    TL0=0x18;

/**************************中断法检测按键代码:开始**************************/

    P3=0x0f;    /*线反转法*/

    if (P3!=0x0f)       /*判断按键按下?*/

    {

        keydelay++;     /*按键按下持续时间++,单位ms*/

        if (keydelay>=15)   /*按键按下等于15ms,则认为按键按下*/

        {

            keydelay=0;     /*清零*/

            nkey=1;     /*按键已按下*/

        }

    }

    else

    {

        keydelay=0;

        nkey=0;

    }

/**************************中断法检测按键代码:结束**************************/

}

谢谢分享谢谢分享

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top