2797|1

87

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机驱动标准pc机键盘的C51程序 [复制链接]

单片机驱动标准pc机键盘的C51程序


网上流行的这个程充很垃圾,

在我的单片机上无论如何都调试不成功.

正确的程序见http://home.hn8868.com/tary/download.html

该程序由AVR程序移植过来...

C语言写的,风格棒极了.

在P1口显示ASCII吗,也有使用LCD1602显示的,需要的请连系我.

以下是主要的代码KB.C

#include
#include "Pindefs.h"
#include "kb.h"
#include "gpr.h"
#include "Disp1602.h"
#include "Scancodes.h"


#define BUFF_SIZE 32

unsigned char edge, bitcount;    // 0 = neg. 1 = pos.
unsigned char kb_buffer[BUFF_SIZE];
unsigned char *inpt, *outpt;
unsigned char buffcnt;


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

    // INT0 interrupt on falling edge

    edge = 0;        // 0 = falling edge 1 = rising edge
    bitcount = 11;
}


void INT0_interrupt(void) interrupt 0 using 2
{
    static unsigned char cdata;    // Holds the received scan code

    EA = 0;

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

        /*MCUCR = 3; */    // Set interrupt on rising edge
        edge = 1;

    }
    if (edge) {         // Routine entered at rising edge
        /*MCUCR = 2; */    // Set interrupt on falling edge
        edge = 0;

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


void decode(unsigned char sc)
{
    //extern void clr(void);
    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[0]!=sc && unshifted[0]; i++);
                    if (unshifted[0] == sc) {
                        put_kbbuff(unshifted[1]);
                    }
                } else {        // If shift pressed
                    for(i = 0; shifted[0]!=sc && shifted[0]; i++);
                    if (shifted[0] == sc) {
                        put_kbbuff(shifted[1]);
                    }
                }
            } else{             // Scan code mode
                print_hexbyte(sc);    // Print scan code
                put_kbbuff(' ');
                put_kbbuff(' ');
            }
            break;
        }
    } else {
        is_up = 0;        // Two 0xF0 in a row not allowed
        switch (sc)
        {
        case 0x12 :        // Left SHIFT
            shift = 0;
            break;
        case 0x59 :        // Right SHIFT
            shift = 0;
            break;
        case 0x05 :        // F1
            if(mode == 1)
                mode = 2;
            if(mode == 3)
                mode = 0;
            break;
        case 0x06 :        // F2
            clr();
            break;
        }
    }
}


void put_kbbuff(unsigned char c)
{
    if (buffcnt < BUFF_SIZE)    // If buffer not full
    {
        *inpt = c;        // Put character into buffer
        inpt++;         // Increment pointer

        buffcnt++;

        if (inpt >= kb_buffer + BUFF_SIZE)    // Pointer wrapping
            inpt = kb_buffer;
    }
}


int getchar(void)
{
    int byte;

    while(buffcnt == 0);    // Wait for data
    byte = *outpt;        // Get byte

    outpt++;        // Increment pointer
    if (outpt >= kb_buffer + BUFF_SIZE)    // Pointer wrapping
        outpt = kb_buffer;

    buffcnt--;        // Decrement buffer count
    return byte;
}

最新回复

给我一份吧 谢谢 wgnstar@163.com  详情 回复 发表于 2007-3-13 12:42
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
给我一份吧 谢谢 wgnstar@163.com
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表