電子琴(改)
●利用4x4矩陣鍵盤的16個按鍵,實現2個8度的電子琴演奏;利用51單片機開發(fā)板的蜂鳴器輸出相應的聲音;
●在1602液晶屏上顯示當前正在演奏的音符,要求不同8度的聲音用方便理解的符號進行顯示,LED指示;
●在上述功能基礎上,利用51單片機開發(fā)板上的一個獨立按鍵,與矩陣鍵盤配合,再擴展出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;
- }
復制代碼
|