《模拟电子琴C语言》由会员分享,可在线阅读,更多相关《模拟电子琴C语言(6页珍藏版)》请在金锄头文库上搜索。
1、#include MusInstru.h/* 键消抖延时函数 */void delay(void)uchar i;for (i=300;i0;i-);/* 键扫描函数 */uchar getkey(void)uchar scancode,tmpcode;if (P1&0xf0)=0xf0)return(0);scancode = 0xfe;while(scancode&0x10)!=0) / 逐行扫描P1 = scancode; / 输出行扫描码if (P1&0xf0)!=0xf0) / 本行有键按下tmpcode = (P1/* 返回特征字节码,为 1 的位即对应于行和列 */return(
2、scancode)+(tmpcode);else scancode = (scancode1)|0x01; / 行扫描码左移一位/* 定时器 0 中断服务子程序 */void time0_int(void) interrupt 1 using 0/* 设置计数初值 */TH0 = STH0;TL0 = STL0; P36=P36; / 反相,产生输出脉冲/* 主程序 */void main()uchar key,k;TMOD = 0x01; / T0,工作方式 1ET0 = 1;EA = 1;while(1)P1 = 0xf0; / 发全 0 行扫描码if (P1&0xf0)!=0xf0) /
3、 若有键按下delay(); / 延时去抖动if (P1&0xf0)!=0xf0) / 延时后再判断一次,去除抖动影响key = getkey(); / 调用键盘扫描函数/ 根据获取的按键位置得到 k 值switch(key)case 0x11: / 1 行 1 列k = 0;break;case 0x21:/ 1 行 2 列k = 1;break;case 0x41:/ 1 行 3 列k = 2;break;case 0x81: / 1 行 4 列k = 3;break;case 0x12:/ 2 行 1 列k = 4;break;case 0x22:/ 2 行 2 列k = 5;break
4、;case 0x42:/ 2 行 3 列k = 6;break;case 0x82:/ 2 行 4 列k = 7;break;case 0x14:/ 3 行 1 列k = 8;break;case 0x24:/ 3 行 2 列k = 9;break;case 0x44:/ 3 行 3 列k = 10;break;case 0x84:/ 3 行 4 列k = 11;break;case 0x18:/ 3 行 4 列k = 12;break;case 0x28:/ 3 行 4 列k = 13;break;case 0x48:/ 3 行 4 列k = 14;break;case 0x88:/ 3 行 4 列k = 15;break;default:break;P36 = P36; / 反相/* 根据所得的 k 值设定计数器 1 的计数初值 */STH0 = tabk/256;STL0 = tabk%256; TR0 = 1; / 开始计数 P1 = 0xf0; / 发全 0 行扫描码while (P1&0xf0)!=0xf0) / 若没有松开按键P1 = 0xf0;TR1 = 0;/ 若按键松开,则停止计数,不产生脉冲输出