电子琴(改)
●利用4x4矩阵键盘的16个按键,实现2个8度的电子琴演奏;利用51单片机开发板的蜂鸣器输出相应的声音;
●在1602液晶屏上显示当前正在演奏的音符,要求不同8度的声音用方便理解的符号进行显示,LED指示;
●在上述功能基础上,利用51单片机开发板上的一个独立按键,与矩阵键盘配合,再扩展出2个8度(独立按键的作用类似于电脑键盘的上档键Shift)。
●设置一个独立按键,用于实现#音。
纯编程小白,请各位大佬们帮我看一下,我写的这个代码只能实现喇叭响,1602液晶屏显示第一行,按下按键不显示数字。另外第3、4个功能我没有任何着手点,而且我觉得我的代码很繁琐,能帮我提一下修改建议吗?
单片机源程序如下:
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- typedef unsigned int u16;
- typedef unsigned char u8;
- #define LCD1602_DATAPINS P0
- #define GPIO_KEY P1
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit EN=P2^2;
- u8 KeyValue,k=0,n=0,miss=1;
- u8 Disp[]="Yin Fu JianZhi:";
- u8 cmy[17]={'3','7','b','f','2','6','a','e','1','5','9','d','0','4','8','c'};
- u8 dp[17]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
- #define output P1
- #define input P1
- enum KEY{key0,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15};
- unsigned int code Freqtab[] = {
- 64021,64103,64260,64400,
- 64524,64580,64684,64777,
- 64820,64898,64968,65030,
- 65058,65110,65157,65178};
- uint FreqTemp;
- sbit SPEAK = P2^7;
- void delay(uint n)
- {
- uint a,b,c;
- for(c=n;c>0;c--)
- for(b=199;b>0;b--)
- for(a=1;a>0;a--);
- }
- void write_com(unsigned char com)
- {
- P0=com;
- RS=0;
- RW=0;
- EN=1;
- delay(200);
- EN=0;
- }
- void write_dat(unsigned char dat)
- {
- P0=dat;
- RS=1;
- RW=0;
- EN=1;
- delay(200);
- EN=0;
- }
- void init()
- {
- write_com(0x01);
- write_com(0x38);
- write_com(0x0f);
- write_com(0x06);
- }
- void KeyDown(void)
- {
- char a=0;
- GPIO_KEY=0x0f;
- if(GPIO_KEY!=0x0f)
- {
- delay(10);
- if(GPIO_KEY!=0x0f)
- { n=1;
-
- GPIO_KEY=0X0F;
- switch(GPIO_KEY)
- {
- case(0X07): KeyValue=0;break;
- case(0X0b): KeyValue=1;break;
- case(0X0d): KeyValue=2;break;
- case(0X0e): KeyValue=3;break;
- }
- //???
- GPIO_KEY=0XF0;
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue;break;
- case(0Xb0): KeyValue=KeyValue+4;break;
- case(0Xd0): KeyValue=KeyValue+8;break;
- case(0Xe0): KeyValue=KeyValue+12;break;
- }
- while((a<50)&&(GPIO_KEY!=0xf0))
- {
- delay(1);
- a++;
- }
- }
- }
- }
- uint key_input(void)
- {
- uchar temp1,temp2;
- uchar num = 16;
- output = 0x0f;
- temp1 = input;
- if(0x0f != temp1)
- {
- delay(5);
- temp1 = input;
- if(0x0f != temp1)
- {
- temp1 = temp1 & 0x0f;
- output = 0xf0;
- delay(1);
- temp2 = input;
- temp2 = temp2 & 0xf0;
- temp1 = temp1 | temp2;
- }
- }
- switch(temp1)
- {
- case 0xee:num=0;break;
- case 0xde:num=1;break;
- case 0xbe:num=2;break;
- case 0x7e:num=3;break;
- case 0xed:num=4;break;
- case 0xdd:num=5;break;
- case 0xbd:num=6;break;
- case 0x7d:num=7;break;
- case 0xeb:num=8;break;
- case 0xdb:num=9;break;
- case 0xbb:num=10;break;
- case 0x7b:num=11;break;
- case 0xe7:num=12;break;
- case 0xd7:num=13;break;
- case 0xb7:num=14;break;
- case 0x77:num=15;break;
- default:break;
- }
- return num;
- }
- void T0_INT(void) interrupt 1
- {
- TL0 = FreqTemp;
- TH0 = FreqTemp >> 8;
- SPEAK = ~SPEAK;
- }
- void bee(void)
- {
- TMOD = 0X01;
- EA = 1;
- ET0 = 1;
- TR0 = 0;
- while(1)
- {
- uint num,temp;
- num = key_input();
- temp = num;
- if(16 != num)
- {
- FreqTemp = Freqtab[num];
- TR0 = 1;
- while(0xf0 != output);
- TR0 = 0;
- SPEAK = 1;
- }
- }
- }
- int main()
- {
- u8 i,m;
- init();
- write_com(0x80);
- for(i=0;i<16;i++)
- {
- write_dat(Disp[i]);
- }
-
- while(miss)
- {
- write_com(0x80+0x40);
- KeyDown();
- if(n==1)
- {dp[k]=cmy[KeyValue];
- n=0;
- k++;
- }
- for(m=0;m<16;m++)
- {write_dat(dp[m]);
- bee();}
- write_com(0x0c);
-
- if(k==16)
- { for(m=0;m<16;m++)
- {dp[m]=' ';}
- delay(1000);
- write_com(0x01);
- delay(1000);
- k=0;
- for(i=0;i<16;i++)
- {
- write_dat(Disp[i]);
- }
-
- }
-
- }
- return 0;
- }
复制代码
|