笔记 15-3 : 彭老师课本第 7 章, 中断,键盘 key 编程与轮询 :具体的代码实现

📅 2026/6/23 22:14:24
笔记 15-3 : 彭老师课本第 7 章, 中断,键盘 key 编程与轮询 :具体的代码实现
114配置该按键的初始化以及中断逻辑 接着看下与讯为板的差异 115接着学习按键的轮询逻辑。116老师布置了作业可以把蜂鸣声改为音乐《大海》代码如下 #includeexynos_4412.hvoiddelay_ms(unsignedintnum){inti,j;for(inum;i0;i--)for(j1000;j0;j--);}voidpwm_init(void){GPD0.CONGPD0.CON(~(0xf))|0x2;GPD0.PUDGPD0.PUD(~(0xf))|0x3;PWM.TCFG0PWM.TCFG0(~(0xff))|0xff;PWM.TCFG1PWM.TCFG1(~(0xf))|0x2;PWM.TCMPB050;PWM.TCNTB0100;PWM.TCONPWM.TCON(~(0xff))|(10)|(11);}voidbeep_on(void){PWM.TCONPWM.TCON(~(0xff))|(10)|(13);}voidbeep_off(void){PWM.TCONPWM.TCON(~(10));}#defineSYS_SET_FREQUENCE25000voidbeep_set_frequence(unsignedintfre){//若蜂鸣器的发声频率为0则返回if(0fre)return;PWM.TCMPB0SYS_SET_FREQUENCE/(frefre);//根据设定频率重新设定计数器比较的值PWM.TCNTB0SYS_SET_FREQUENCE/fre;//根据频率重新调整计数值}constunsignedchardahai[]{0x13,0x15,0x16,0x16,0x16,0x16,0x21,0x16,0x15,0x15,0x16,0x15,//哀愁0x13,0x12,0x11,0x11,0x11,0x11,0x12,0x13,0x13,0x12,0x11,0x11,0x11,0x11,0x21,0x16,0x15,0x15,0x16,0x15,0x13,0x15,0x16,0x21,0x21,0x16,0x15,0x15,//飘远};/* * 大海的简谱, 控制每一个音的时间 1为长时间 4为短时间 */constunsignedchartime[]{4,4,4,2,4,2,4,4,4,2,4,2,//哀愁4,4,4,2,4,2,2,1,4,4,4,2,4,2,4,4,4,2,4,2,4,4,2,4,2,4,4,1//飘远};constunsignedintyinyue[3][7]{262,294,330,370,415,266,294,//低音523,578,659,698,784,880,988,//中音1046,1174,1318,1396,1567,1700,1975//高音};voidled_init(void){GPK1.CON(GPK1.CON(~(0xf4)))|(0x14);GPX3.CON(GPX3.CON(~(0xf4)))|(0x14);}voidled_on(){GPK1.DATGPK1.DAT|(0x11);GPX3.DATGPX3.DAT|(0x11);}voidled_off(){GPK1.DATGPK1.DAT(~(0x011));GPX3.DATGPX3.DAT(~(0x011));}/* * 裸机代码不同于LINUX 应用层 一定加循环控制 */intmain(void){unsignedintloop0;//循环控制变量unsignedinta0;//计算高中低音使用的变量unsignedintb0;//计算do re mi ....使用的变量unsignedintdelay0;//计算每一个音延时使用的变量led_init();pwm_init();GPX1.CONGPX1.CON(~(0xf4))|0x04;//按键初始化while(1){if(!(GPX1.DAT(0x11)))// 返回为真按键按下{delay_ms(10);if(!(GPX1.DAT(0x11)))//二次检测去抖{led_on();delay_ms(500);led_off();for(loop0;// 在播放每个音节的时候也检查按键是否被压下即可loopsizeof(dahai)/(sizeof(unsignedchar))!(GPX1.DAT(0x11));loop){//查大海的简谱表adahai[loop]4;//计算出高低音b(dahai[loop]0x0f)-1;//计算出DO RE MI FA SO LA XIdelay0x1500/time[loop];beep_set_frequence(yinyue[a][b]);//重新设定频率beep_on();//发出一个音delay_ms(delay);beep_off();//关闭蜂鸣器 每个音播放完成后有间隔感// delay_ms(0x10); //关闭蜂鸣器delay_ms(100);}}}}return0;}117谢谢