⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.c

📁 Philips 900系列单片机键盘中断源程序
💻 C
字号:
/*******************************************************
* LPC932 Keyboard Interrupt demo program
* Sends the pressed key via UART at 19200kbps.
* Internal RC oscillator is used (7.3728MHz).
*******************************************************/
#include <reg932.h>
#include <intrins.h>

#define nop    _nop_()
extern void ua_outchar(char c);
extern void UART_Init(void);
extern void PrintString(char *s);
char key_tbl[2][8] = {
{'1' ,'A' ,'6' ,'9' ,'7' ,'8' ,'4' ,'5' }, // row 0
{'2' ,'0' ,'E' ,'D' ,'B' ,'C' ,'3' ,'F' } // row 1
};
char startup[] = "LPC9xx Keyboard application\n\r";
char press[] = " pressed\n\r";
char release[] = " released\n\r";
static unsigned char key,col,row,byte_read;
static bit flag = 0;
static bit rel = 0;
static bit valid_key = 0;
sbit rol1=P2^2;
sbit rol2=P2^3;
static void KEYB_Init(void)
{
    // P0 (keypad columns) setting
    P0M1 = 0x00; // P0 is bidirectional
    P0 = 0xFF;
    // P2 (keypad rows) setting
    P2M1 &= 0xF3; // P2_2 and P2_3 are push pull
    P2M2 |= 0x0C;
    rol1=1;
    rol2=1;
    KBMASK = 0xFF; // to generate an interrupt, P0
    KBPATN = 0xFF; // should be NOT equal to the
    // value from KBPATN(0xFF)
    EKBI = 1; // enable keyboard interrupt
    TL1 = 0; // Timer1 used to generate a de
    // bounce delay of 17.7ms
    TH1 = 0;
    TMOD = 0x10; // Timer 1 mode 1, 16 bit timer
    ET1 = 1; // enable Timer 1 interrupt
}
static void DefineColumn(void)
{
    valid_key = 1;
    switch (byte_read)
    {
        case 0xFE: col = 0; break;
        case 0xFD: col = 1; break;
        case 0xFB: col = 2; break;
        case 0xF7: col = 3; break;
        case 0xEF: col = 4; break;
        case 0xDF: col = 5; break;
        case 0xBF: col = 6; break;
        case 0x7F: col = 7; break;
        default: valid_key = 0; break;
    }
}
static void DefineRow(void)
{
    rol2 = 1;
    if (P0 != 0xFF)
    {
        rol2 = 0;
        row = 0;
    }
    else
    {
        rol2 = 0;
        row = 1;
    }
}
void Timer1_interrupt(void) interrupt 3
{
    TR1 = 0; // stop timer
    byte_read = P0; // save value of port 0
    if (byte_read != 0xFF) // If P0 |= FF, means
    { // that a key was pressed
        // if not, key release
        KBCON |= 2; // PATN_SEL = 1, next KB
        // int on P0 = 0xFF
        DefineRow();
        DefineColumn();
        if (valid_key)
        {
            key = key_tbl[row][col];
            flag = 1;
        }
    }
    else
    {
        if (valid_key)
        {
            rel = 1;
            flag = 1;
        }
        KBCON &= 0xFD; // PATN_SEL = 0, next inter
// rupt if P0 != 0xFF
    }
    KBCON &= 0xFE; // reset keyb interrupt flag
    EKBI = 1;
}
void Keyboard_Interrupt(void) interrupt 7
{
    EKBI = 0; // disable int.
    TR1 = 1; // start timer1
}
void main(void)
{
    TRIM = 0x30;
    KEYB_Init(); // initialise keyboard hardware
    UART_Init(); // initialise on-chip UART
    EA = 1; // enable interrupts
    PrintString(startup);
    rol1 = 0; // row 0 low
    rol2 = 0; // row 1 low
    PCON |= 2; // get into power down mode
    nop;
    nop;
    while(1) // endless loop
    {
        if (flag)
        {
            if (!rel)
            {
                ua_outchar(key);
                PrintString(press);
            }
            else
            {
                rel = 0;
                ua_outchar(key);
                PrintString(release);
            }
            flag = 0;
            PCON |= 2; // go into power down mode
            nop;
            nop;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -