51的4*4键盘中断扫描程序

    技术2022-06-12  38

    在网上找了好多,却没发现自己想要的,不是太麻烦就是不合用,于是自己写了一个,其中参考了好多其他的程序,就不列出了。

    键盘扫描只用了一个循环,但是键值处理并不是很好,用了一个switch,感觉比较麻烦,但是想不出别的办法了……

    键盘接法:

    程序:

    #include <REGX52.H>

    #define LED_BIT P0 #define LED_COM P1 #define KEYBOARD P2

    void display(unsigned char x); unsigned char scan(); unsigned char skey(unsigned char orign); void delayms(unsigned int t); void Int1(); void Ini();

    unsigned char answer; unsigned char code LedTable[]={    //显示键值转换,其实可以直接放到键值转换的函数里         0xC0,/*0*/         0xF9,/*1*/         0xA4,/*2*/         0xB0,/*3*/         0x99,/*4*/         0x92,/*5*/         0x82,/*6*/         0xF8,/*7*/         0x80,/*8*/         0x90,/*9*/         0x88,/*A*/         0x83,/*b*/         0xC6,/*C*/         0xA1,/*d*/         0x86,/*E*/         0x8E,/*F*/    0x00,/*??%*/ };

    void main()        //主函数 { Ini(); while(1); }

     

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

    void display(unsigned char x)   //显示函数,没有位扫描,只显示一位 { LED_BIT=LedTable[x]; }

     

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

    void delayms(unsigned int t) //延时函数 { unsigned char i; for(;t>1;t--) {    for(i=0;i<123;i++); } }

     

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

    unsigned char scan()    //键盘扫描 { unsigned char i,ANS; delayms(10); /*消抖*/ for(i=1;i<=4;i++) {    KEYBOARD=0xf0|(0xef/*11101111*/>>i);/* i=2,端口变为了111111011*/    ANS=(KEYBOARD&0xf0);    if(ANS!=0xf0)/*当某键被按下时,会有高四位的某位被拉低,11011011&11110000=11010000*/    {     ANS=~KEYBOARD;/*(ANS8421) */     while((KEYBOARD&0xf0)!=0XF0);/*等待按键被松开*/     delayms(10); /*消抖*/     return(ANS);    }   } }

     

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

    unsigned char skey(unsigned char orign)   //键值转换 { switch(orign)  {    case 0x11:return 9;    case 0x12:return 8;    case 0x14:return 7;    case 0x18:return 10;    case 0x21:return 6;    case 0x22:return 5;    case 0x24:return 4;    case 0x28:return 11;    case 0x41:return 3;    case 0x42:return 2;    case 0x44:return 1;    case 0x48:return 12;    case 0x81:return 13;    case 0x82:return 0;    case 0x84:return 14;    case 0x88:return 15;    default:return 16 ; } }

     

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

    void Int1() interrupt 2    //中断函数 { EX1=0; answer=skey(scan()); KEYBOARD=0x0f; display(answer); EX1=1;

    }

     

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

    void Ini ()    //初始化 { ///* 中断扫描 KEYBOARD=0x0f; LED_COM=0X01; EA=1; EX1=1; IT1=1;    display(answer); }

     


    最新回复(0)