C51中4X4键盘扫描(非反转法)

来源:互联网 发布:什么软件可以写软文 编辑:程序博客网 时间:2024/05/02 01:08
#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar KEYIN;void DelayMs(uint ms);                 //延时函数声明;uchar KeyPress(void);                  //按键按下检测函数声明;uchar KeyScan(void);                   //键值扫描函数声明;void main(void){    while (1)    {        if (KeyPress())        {            P0 = KeyScan();            while (KeyPress());        }    }}void DelayMs(uint ms)               //11.0592MHZ 约为1.007MS; {    uint x,y;    for(x=ms;x>0;x--)                            {        for(y=113;y>0;y--);    }}uchar KeyPress(void){    uchar keypress;    P1 = 0xF0;                                         keypress = P1;    if (keypress == 0xF0)    {        return 0;    }    else     {        KEYIN = keypress;        return 1;    }}uchar KeyScan(void){    uchar keyout,index,keycode,keyvalue;    DelayMs(20);    P1 = 0xF7;    index = 0;    if (KeyPress())    {        while (1)        {            P1 = (0xF7 >> index) | 0xF0; //I/O端口不能做为中间变量,如temp = (P1 >> index) 单片机随时读取IO的变化,会导致程序有瞬间错误产生;            index++;            index = index & 0x03;            keyout = P1 & 0x0F;            if ((P1 & 0xF0) != 0xF0)            {                keycode = KEYIN + keyout;                break;              }        }        switch (keycode)        {            case 0x77 : keyvalue = 0xC0;     break;            case 0x7B : keyvalue = 0xF9;     break;            case 0x7D : keyvalue = 0xA4;     break;            case 0x7E : keyvalue = 0xB0;     break;            case 0xB7 : keyvalue = 0x99;     break;            case 0xBB : keyvalue = 0x92;     break;            case 0xBD : keyvalue = 0x82;     break;            case 0xBE : keyvalue = 0xF8;     break;            case 0xD7 : keyvalue = 0x80;     break;            case 0xDB : keyvalue = 0x90;     break;            case 0xDD : keyvalue = 0x88;     break;            case 0xDE : keyvalue = 0x83;     break;            case 0xE7 : keyvalue = 0xC6;     break;            case 0xEB : keyvalue = 0xA1;     break;            case 0xED : keyvalue = 0x86;     break;            case 0xEE : keyvalue = 0x8E;     break;            default : keyvalue = 0xFF;        }    }    else    {        keyvalue = 0xFF;    }    return keyvalue;}
1 0