在菜单式MP3点播器的设计中,除了显示器件不可或缺外,键控处理也是必不可少的,它与显示器件的配合才能完成功能和歌曲的选择。为了简化操作并有效缩减按键的数量,故只设置3个按键,分别是K1、K2和K3键。伴随操作进程的不同,它们被赋予的作用也不同。 根据的功能需要,按键主要分为两类操作,一类是歌曲的选择,另一类则是音量的控制等。为此,功能符号的作用如下: ∧ 选择上一首 ∨ 选择下一首 < 减小音量 > 加大音量 = 暂停/继续 其中,“选择上一首”和“选择下一首”用于播放前;而“减小音量”、“加大音量”、“暂停/继续”则用于播放过程中。 添加键控环节后的整体结构如图1所示。 图1 添加键控环节后的构成 在上电后,首先显示主界面,如图2所示。随后,进入键控处理。为了便于歌曲的显示与下载,分别将每首歌的名称设计成一个函数,以便使用时调用。 图2 主界面 测试的菜单函数如下: - void jmz(void)
- {
- // 主界面
- LCD_clear();
- LCD_write_english_string(0,0," MP3",0);
- LCD_write_hanzi(38,0,3);
- LCD_write_hanzi(50,0,4);
- LCD_write_hanzi(62,0,5);
- LCD_write_english_string(10,3,"JINGLIXIXI",0);
- }
- void jma(void)
- {
- // 莫斯科郊外的晚上
- LCD_write_english_string(0,0," MP3",0);
- LCD_write_hanzi(38,0,3);
- LCD_write_hanzi(50,0,4);
- LCD_write_hanzi(62,0,5);
-
- LCD_write_hanzi(2,2,6);
- LCD_write_hanzi(14,2,7);
- LCD_write_hanzi(26,2,8);
- LCD_write_hanzi(38,2,9);
- LCD_write_hanzi(50,2,10);
- LCD_write_hanzi(62,2,11);
- LCD_write_hanzi(2,4,12);
- LCD_write_hanzi(14,4,13);
- }
- void jmb(void)
- {
- // 等待
- LCD_write_english_string(0,0," MP3",0);
- LCD_write_hanzi(38,0,3);
- LCD_write_hanzi(50,0,4);
- LCD_write_hanzi(62,0,5);
- LCD_write_hanzi(2,2,14);
- LCD_write_hanzi(14,2,15);
- }
- void jmc(void)
- {
- // 鸿雁
- LCD_write_english_string(0,0," MP3",0);
- LCD_write_hanzi(38,0,3);
- LCD_write_hanzi(50,0,4);
- LCD_write_hanzi(62,0,5);
- LCD_write_hanzi(2,2,16);
- LCD_write_hanzi(14,2,17);
- }
- void jmg(void)
- {
- // 功能符号显示
- LCD_write_hanzi(2,4,23);
- LCD_write_hanzi(14,4,24);
- LCD_write_hanzi(26,4,21);
- LCD_write_hanzi(38,4,22);
- }
复制代码实现键控处理的程序如下: - int main (void)
- {
- unsigned char zt=0,jc=0,n=0,m=15;
- SystemCoreClockUpdate();
- SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
- | SIM_SCGC5_PORTB_MASK
- | SIM_SCGC5_PORTC_MASK
- | SIM_SCGC5_PORTD_MASK
- | SIM_SCGC5_PORTE_MASK );
- PORT_ENABLE_CLK(MKL_PORTB);
- PORT_ENABLE_CLK(MKL_PORTD);
-
- IO_FUN_SEL(MKL_PORTB,18,1);
- IO_FUN_SEL(MKL_PORTB,19,1);
- IO_FUN_SEL(MKL_PORTD,1,1);
- IO_FUN_SEL(MKL_PORTD,2,1);
- IO_FUN_SEL(MKL_PORTD,3,1);
- IO_FUN_SEL(MKL_PORTD,5,1);
-
- GPIO_DDR_OUTPUT(MKL_PORTB,18);
- GPIO_DDR_OUTPUT(MKL_PORTB,19);
- GPIO_DDR_OUTPUT(MKL_PORTD,1);
- GPIO_DDR_INPUT(MKL_PORTD,2);
- GPIO_DDR_INPUT(MKL_PORTD,3);
- GPIO_DDR_INPUT(MKL_PORTD,5);
-
- GPIO_SET(MKL_PORTB,18);
- GPIO_SET(MKL_PORTB,19);
- GPIO_SET(MKL_PORTD,1);
- SPI_CONFIG();
- LCD_init();
- jmz();
- myDelay(2000);
- while(1)
- {
- if(jc==0)
- {
- if(n==0) jma();
- if(n==1) jmb();
- if(n==2) jmc();
- if(GPIO_GET_VALUE(MKL_PORTD,2)==0)
- {
- n++;
- if(n>2) n=0;
- myDelay(500);
- LCD_clearp();
- }
- if(GPIO_GET_VALUE(MKL_PORTD,3)==0)
- {
- if(n>0) n--;
- else n=2;
- myDelay(500);
- LCD_clearp();
- }
- if(GPIO_GET_VALUE(MKL_PORTD,5)==0)
- {
- jmg();
- myDelay(500);
- jc=1;
- }
- }
- else
- {
- if(GPIO_GET_VALUE(MKL_PORTD,2)==0)
- {
- m++;
- if(m>29) m=30;
- myDelay(100);
- // 加大音量并显示m
- }
- if(GPIO_GET_VALUE(MKL_PORTD,3)==0)
- {
- if(m>0) m--;
- myDelay(100);
- // 减小音量并显示m
- }
- if(GPIO_GET_VALUE(MKL_PORTD,5)==0)
- {
- myDelay(100);
- if(zt==0) // 暂停播放
- else // 继续播放
- }
- }
- myDelay(100);
- // 更新zt
- }
- }
复制代码
|