#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键盘通讯的接口程序》的相关信息,《单片机和PC键盘通讯的接口程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《单片机和PC键盘通讯的接口程序》的详细说明。
简介:在这里给大家介绍一个单片机和PC键盘通讯的接口程序。
提醒:《单片机和PC键盘通讯的接口程序》最后刷新时间 2024-03-14 01:07:38,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《单片机和PC键盘通讯的接口程序》该内容的真实性请自行鉴别。