新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 我的MIDI键盘程序

我的MIDI键盘程序

作者: 时间:2016-11-29 来源:网络 收藏
void initial_keyboard() //初始化键盘{v_74hc164WriteData_f(0x00);//关掉后排段选v_74hc164WriteData_f(0x00);//关掉前排段选}//keynumber[0]定义为第一排//keynumber[1]定义为第二排void scan_key(){uchar ts=0; //开始的时间uchar kb_cs; // 段选uchar i=0;uchar j=0; //循环变量uchar outa=0;uchar outb=0;uchar csp;uchar lkb,hkb;uchar atime;uchar temp;//临时kb_cs=0x01; //00000001 00000010while (i!=8){ts=kbtime;v_74hc164WriteData_f(0x00);//关掉前排段选v_74hc164WriteData_f(kb_cs);//输出后排段选//高在前,低在后//以下代码输出下排力度检测的信号io_74hc165_SH_HIGH //拉高并行置数outa=v_74hc165ReadData_f(); //读入输出io_74hc165_SH_LOW //拉低并行置数//结束,以下代码输出前排检测开关的信号initial_keyboard();//保险点v_74hc164WriteData_f(kb_cs); //输出前排段选v_74hc164WriteData_f(0x00); //关掉后排段选csp=0x01;//初始化指针io_74hc165_SH_HIGH //拉高并行置数outb=v_74hc165ReadData_f(); //读入输出io_74hc165_SH_LOW //拉低并行置数initial_keyboard();//全部关掉//与原来的键值进行比较~lkb=outb^keynumber[0][i]; //前排与原来的键值比较hkb=outa^keynumber[1][i]; //后排与原来的键值比较// 1&1=1 1&0=0 0&1=0 0&0=0// 1^1=0 1^0=0 0^1=0 0^0=0所以用来做比较。有变化的就输出1keynumber[0][i]=outb; //前排,记录下新的键值keynumber[1][i]=outa; //后排//原理:在琴键下面有两个开关,顺序为K1,K2。按照顺序接通。只能两个全导通/两个全关断,或者只有K1导通。在K1导通的时候lkb&csp发生变化并且在前排键上也发生变化//所以程序会在一个2维数组中记录闭合的时间,然后继续扫过去。等到第二次扫到这组键的话while(j!=8){if ((lkb&csp)!=0) // 前排触点是否有变化{ if ((outb&csp)!=0){//前排的按键按下了count_begin[i][j]=ts;}else{//前排键松开了就复原黑名单temp=0x01;temp=temp<blacklist_time){//超时了temp=0x01;temp=temp<blacklist_time){//超时了temp=0x1;temp=temp<

全部源码下载地址:http://www.51hei.com/f/mdid.rar
编译后约占用1K ROM。效率够高~
不过这个最后还要和主控ATmega8通信。
还是半成品。

本文引用地址:https://www.eepw.com.cn/article/201611/323461.htm

做键盘也是要技术的。做电子琴更要技术。哇哈哈哈! 本程序的正式版本请看:http://www.51hei.com/mcu/1636.html

89S52单片机的Flash ROM为8KByte.内存为256Byte.

PS:程序本来是分块设计的。为了发上网就用cpp处理了下。include 全部被替换掉了。


上一页 1 2 3 下一页

关键词: MIDI键盘程

评论


技术专区

关闭