久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1358|回復: 2
收起左側

單片機矩陣鍵盤電子琴并通過1602液晶屏顯示程序 求修改建議

[復制鏈接]
ID:1036890 發(fā)表于 2022-6-25 20:52 | 顯示全部樓層 |閱讀模式
電子琴(改)
●利用4x4矩陣鍵盤的16個按鍵,實現2個8度的電子琴演奏;利用51單片機開發(fā)板的蜂鳴器輸出相應的聲音;
●在1602液晶屏上顯示當前正在演奏的音符,要求不同8度的聲音用方便理解的符號進行顯示,LED指示;
●在上述功能基礎上,利用51單片機開發(fā)板上的一個獨立按鍵,與矩陣鍵盤配合,再擴展出2個8度(獨立按鍵的作用類似于電腦鍵盤的上檔鍵Shift)。
●設置一個獨立按鍵,用于實現#音。
純編程小白,請各位大佬們幫我看一下,我寫的這個代碼只能實現喇叭響,1602液晶屏顯示第一行,按下按鍵不顯示數字。另外第3、4個功能我沒有任何著手點,而且我覺得我的代碼很繁瑣,能幫我提一下修改建議嗎?
圖片1.png
單片機源程序如下:
  1. #include <reg51.h>

  2. #define uint unsigned int

  3. #define uchar unsigned char

  4.         typedef unsigned int u16;         

  5. typedef unsigned char u8;

  6. #define LCD1602_DATAPINS P0

  7. #define GPIO_KEY P1

  8. sbit RS=P2^0;

  9. sbit RW=P2^1;

  10. sbit EN=P2^2;

  11. u8 KeyValue,k=0,n=0,miss=1;

  12. u8 Disp[]="Yin Fu  JianZhi:";

  13. u8 cmy[17]={'3','7','b','f','2','6','a','e','1','5','9','d','0','4','8','c'};

  14. u8 dp[17]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};

  15. #define output P1

  16. #define input P1

  17. enum KEY{key0,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15};

  18. unsigned int code Freqtab[] = {        

  19.      64021,64103,64260,64400,     

  20.      64524,64580,64684,64777,      

  21.      64820,64898,64968,65030,      

  22.      65058,65110,65157,65178};     

  23. uint FreqTemp;

  24. sbit SPEAK = P2^7;

  25. void delay(uint n)   

  26. {

  27.     uint a,b,c;

  28.         for(c=n;c>0;c--)

  29.             for(b=199;b>0;b--)

  30.                 for(a=1;a>0;a--);

  31. }

  32. void write_com(unsigned char com)

  33. {

  34.         P0=com;

  35.         RS=0;

  36.         RW=0;

  37.         EN=1;

  38.         delay(200);

  39.         EN=0;

  40. }

  41. void write_dat(unsigned char dat)

  42. {

  43.         P0=dat;

  44.         RS=1;

  45.         RW=0;

  46.         EN=1;

  47.         delay(200);

  48.         EN=0;

  49. }

  50. void init()

  51. {

  52.         write_com(0x01);

  53.         write_com(0x38);

  54.         write_com(0x0f);

  55.         write_com(0x06);

  56. }

  57. void KeyDown(void)

  58. {

  59.         char a=0;

  60.         GPIO_KEY=0x0f;

  61.         if(GPIO_KEY!=0x0f)

  62.         {

  63.                 delay(10);

  64.                 if(GPIO_KEY!=0x0f)

  65.                 {        n=1;

  66.                        

  67.                         GPIO_KEY=0X0F;

  68.                         switch(GPIO_KEY)

  69.                         {

  70.                                 case(0X07):        KeyValue=0;break;

  71.                                 case(0X0b):        KeyValue=1;break;

  72.                                 case(0X0d):        KeyValue=2;break;

  73.                                 case(0X0e):        KeyValue=3;break;

  74.                         }

  75.                         //???

  76.                         GPIO_KEY=0XF0;

  77.                         switch(GPIO_KEY)

  78.                         {

  79.                                 case(0X70):        KeyValue=KeyValue;break;

  80.                                 case(0Xb0):        KeyValue=KeyValue+4;break;

  81.                                 case(0Xd0):        KeyValue=KeyValue+8;break;

  82.                                 case(0Xe0):        KeyValue=KeyValue+12;break;

  83.                         }

  84.                         while((a<50)&&(GPIO_KEY!=0xf0))         

  85.                         {

  86.                                 delay(1);

  87.                                 a++;

  88.                         }

  89.                 }

  90.         }

  91. }

  92. uint key_input(void)

  93. {

  94.         uchar temp1,temp2;                       

  95.         uchar num = 16;                          

  96.         output = 0x0f;               

  97.            temp1 = input;                       

  98.         if(0x0f != temp1)         

  99.         {                                          

  100.                 delay(5);               

  101.                 temp1 = input;                       

  102.                 if(0x0f != temp1)                       

  103.                 {

  104.                         temp1 = temp1 & 0x0f;      

  105.                         output = 0xf0;                       

  106.                         delay(1);                       

  107.                         temp2 = input;                       

  108.                         temp2 = temp2 & 0xf0;      

  109.                         temp1 = temp1 | temp2;      

  110.                 }

  111.         }

  112.         switch(temp1)

  113.         {

  114.                 case 0xee:num=0;break;  

  115.         case 0xde:num=1;break;  

  116.         case 0xbe:num=2;break;   

  117.         case 0x7e:num=3;break;

  118.                 case 0xed:num=4;break;               

  119.         case 0xdd:num=5;break;           

  120.         case 0xbd:num=6;break;            

  121.         case 0x7d:num=7;break;   

  122.                 case 0xeb:num=8;break;   

  123.         case 0xdb:num=9;break;   

  124.         case 0xbb:num=10;break;   

  125.         case 0x7b:num=11;break;   

  126.                 case 0xe7:num=12;break;   

  127.         case 0xd7:num=13;break;   

  128.         case 0xb7:num=14;break;   

  129.         case 0x77:num=15;break;      

  130.                 default:break;

  131.         }

  132.         return num;

  133. }

  134. void T0_INT(void) interrupt 1

  135. {

  136.      TL0 = FreqTemp;               

  137.      TH0 = FreqTemp >> 8;

  138.      SPEAK = ~SPEAK;                  

  139. }

  140. void bee(void)

  141. {        

  142. TMOD = 0X01;               

  143.         EA = 1;

  144.         ET0 = 1;

  145.         TR0 = 0;

  146.         while(1)

  147.         {

  148.                 uint num,temp;

  149.                 num = key_input();

  150.                 temp = num;

  151.         if(16 != num)

  152.                 {

  153.                         FreqTemp = Freqtab[num];

  154.                         TR0 = 1;

  155.                         while(0xf0 != output);      

  156.                         TR0 = 0;

  157.                         SPEAK = 1;      

  158.                 }               

  159.         }

  160.                         }

  161. int main()

  162. {

  163.         u8 i,m;

  164.         init();

  165.         write_com(0x80);

  166.         for(i=0;i<16;i++)

  167.         {        

  168.                 write_dat(Disp[i]);        

  169.         }

  170.                                        

  171.          while(miss)

  172.         {

  173.         write_com(0x80+0x40);

  174.                  KeyDown();         

  175.                   if(n==1)

  176.                 {dp[k]=cmy[KeyValue];

  177.                 n=0;

  178.                  k++;

  179.                  }

  180.                    for(m=0;m<16;m++)

  181.             {write_dat(dp[m]);

  182.                                                 bee();}

  183.                                                 write_com(0x0c);

  184.                                                 

  185.                   if(k==16)

  186.                 { for(m=0;m<16;m++)

  187.                       {dp[m]=' ';}



  188.                  delay(1000);

  189.                  write_com(0x01);

  190.                  delay(1000);

  191.                  k=0;

  192.                  for(i=0;i<16;i++)

  193.         {        

  194.                 write_dat(Disp[i]);        

  195.         }

  196.                                 

  197.              }

  198.                                                          

  199.         }           

  200.         return 0;

  201. }
復制代碼

回復

使用道具 舉報

ID:213173 發(fā)表于 2022-6-27 11:44 | 顯示全部樓層
無標題.jpg
仿真測試.rar (92.22 KB, 下載次數: 27)
回復

使用道具 舉報

ID:195496 發(fā)表于 2022-6-29 12:44 | 顯示全部樓層
很牛X,測試可以實現電子琴功能,
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九在线 | 国产精品毛片一区二区三区 | 成人av片在线观看 | 国产激情视频网址 | 欧美 日韩 在线播放 | 欧美精品1区2区3区 免费黄篇 | 国产高清在线精品一区二区三区 | 成人av一区 | 一区二区三区精品视频 | 日韩高清中文字幕 | 日日操视频 | 久久在线视频 | 日本免费在线观看视频 | a免费视频| 最新中文字幕在线 | 亚洲人人舔人人 | 国产精品美女久久久久 | 久久亚洲一区二区 | 日韩av免费在线观看 | 最新国产精品 | 国产精品69av | 免费不卡av| 成人一级毛片 | 日本精品视频在线观看 | 亚洲精品久久久久久久久久久 | 国产wwwcom | 91精品国产91久久久久久吃药 | 亚洲精品欧美 | 亚洲国产福利视频 | 亚洲精品字幕 | 亚洲精品一 | 午夜午夜精品一区二区三区文 | 久久久毛片 | 亚洲精品在线看 | 国产免费一区二区 | 国产成人av在线播放 | 日本精品一区二区三区在线观看视频 | 国产98色在线 | 日韩 | 99精品免费 | 久草免费在线视频 | 午夜精品|