您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机PC键盘与AVR单片机连接的C语言源程序 正文
PC键盘与AVR单片机连接的C语言源程序

PC键盘与AVR单片机连接的C语言源程序

点击数:7883 次   录入时间:03-04 11:45:20   整理:http://www.55dianzi.com   AVR单片机

kb.c

/*****************************
** low level kexboard routines                VERSION 1.0
******************************/
#include "kb.h"
#include "sCANcodes.h"

#define BUFF_SIZE 64

unsigned char edge, bitcount;                // 0 = neg.  1 = pos.

unsigned char kb_buffer[BUFF_SIZE];
unsigned char *inpt, *outpt;
unsigned char buffcnt;


void InitKeyBoard(void)
{
    inpt =  kb_buffer;                        // Initialize buffer
    outpt = kb_buffer;
    buffcnt = 0;

    MCUCR = 2;                                // INT0 interrupt on falling edge
    edge = 0;                                // 0 = falling edge  1 = rising edge
    bitcount = 11;              
    #asm("sei")                              // interrupt enable
}

interrupt [EXT_INT0] void INT0_interrupt(void)
{
    statIC unsigned char data;                // Holds the received scan code

        if(bitcount < 11 && bitcount > 2)    // Bit 3 to 10 is data. Parity bit,
        {                                    // start and stop bits are ignored.
            data = (data >> 1);
            if(PIND & 8)
                data = data | 0x80;            // Store a '1'
        }

        if(--bitcount == 0)                    // All bits received
        {
            decode(data);
            bitcount = 11;
        }
 }


void decode(unsigned char sc)
{
    static unsigned char is_up=0, shift = 0, mode = 0;
    unsigned char i;
 
    if (!is_up)                // Last data received was the up-key identifier
    {
        switch (sc)
        {
          case 0xF0 :        // The up-key identifier
            is_up = 1;
            break;

          case 0x12 :        // Left SHIFT
            shift = 1;
            break;

          case 0x59 :        // Right SHIFT
            shift = 1;
            break;

          case 0x05 :        // F1
            if(mode == 0)
                mode = 1;    // Enter scan code mode
            if(mode == 2)
                mode = 3;    // Leave scan code mode
            break;

          default:
            if(mode == 0 || mode == 3)        // If ASCII mode
            {
                if(!shift)                    // If shift not pressed,
                {                            // do a table look-up
                    for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);
                    if (unshifted[i][0] == sc) {
                        put_kbbuff(unshifted[i][1]);
                    }
                } else {                    // If shift pressed
                    for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
                    if (shifted[i][0] == sc) {
                        put_kbbuff(shifted[i][1]);
                    }
                }
            } else{                            // Scan code mode

[1] [2] [3]  下一页


本文关键字:单片机  源程序  键盘  C语言  AVR单片机单片机-工控设备 - AVR单片机

《PC键盘与AVR单片机连接的C语言源程序》相关文章>>>