单片机和PC键盘通讯的接口程序

来源:本站
导读:目前正在解读《单片机和PC键盘通讯的接口程序》的相关信息,《单片机和PC键盘通讯的接口程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《单片机和PC键盘通讯的接口程序》的详细说明。
简介:在这里给大家介绍一个单片机和PC键盘通讯的接口程序。

#include <pgmspace.h>#include "kb.h"#include "serial.h"#include "gpr.h"#include "scancodes.h"#define BUFF_SIZE 64unsigned char edge, bitcount;    // 0 =符号. 1 = 正号.unsigned char kb_buffer[BUFF_SIZE];unsigned char *inpt, *outpt;unsigned char buffcnt;void init_kb(void){inpt = kb_buffer;      // 初始化缓冲区outpt = kb_buffer;buffcnt = 0;MCUCR = 2;       // INT0 中断,下降沿触发edge = 0;       // 0 = 下降沿; 1 = 上升沿bitcount = 11;}interrupt [INT0_vect] void INT0_interrupt(void){static unsigned char data;     // 保持接受扫描码的状态if (!edge)       // 下降沿触发中断服务程序{if(bitcount < 11 && bitcount > 2)  // 3到10位是数据,{        // 忽略起始和停止位data = (data >> 1);if(PIND & 8)data = data | 0x80;    // 存储一个'1'}MCUCR = 3;      // 用上升沿引发中断edge = 1;}else{         // 上升沿触发中断服务程序MCUCR = 2;      // 用下降沿引发中断edge = 0;if(--bitcount == 0)     //  接受到所有的数据位{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)       // 最后一位数据接受{switch (sc){case 0xF0 :     // 确定完成键is_up = 1;break;case 0x12 :     // 左SHIFT按键shift = 1;break;case 0x59 :     // 右SHIFT按键shift = 1;break;case 0x05 :     // F1键if(mode == 0)mode = 1;     // 进入按键扫描码模式if(mode == 2)mode = 3;     // 离开按键扫描码模式break;default:if(mode == 0 || mode == 3)   // ASCII 模式{if(!shift)     //如果没有SHIFT键按下,{       // 查表for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);if (unshifted[i][0] == sc){put_kbbuff(unshifted[i][1]);}}else{      // 如果SHIFT键按下for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);if (shifted[i][0] == sc){put_kbbuff(shifted[i][1]);}}}else{        // 扫描键盘码模式print_hexbyte(sc);   // 显示模式put_kbbuff(' ');put_kbbuff(' ');}break;}}else{is_up = 0;     // 2个 0xF0在一列中是不允许的switch (sc){case 0x12 :    // 左 SHIFTshift = 0;break;case 0x59 :    // 右SHIFTshift = 0;break;case 0x05 :    // F1if(mode == 1)mode = 2;if(mode == 3)mode = 0;break;case 0x06 :    // F2clr();break;}}}void put_kbbuff(unsigned char c){if (buffcnt<BUFF_SIZE)    // 若缓冲区为空{*inpt = c;     // 在缓冲区中输入一个字符inpt++;       // 指针加1buffcnt++;if (inpt >= kb_buffer + BUFF_SIZE) // 指针判断inpt = kb_buffer;}}int getchar(void){int byte;while(buffcnt == 0);     // 等待数据byte = *outpt;      // 取数据outpt++;       // 指针加1if (outpt >= kb_buffer + BUFF_SIZE)  // 指针比较outpt = kb_buffer;buffcnt--;       // 缓冲区减去1return byte;}

提醒:《单片机和PC键盘通讯的接口程序》最后刷新时间 2024-03-14 01:07:38,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《单片机和PC键盘通讯的接口程序》该内容的真实性请自行鉴别。