找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 907|回复: 2
收起左侧

单片机矩阵键盘电子琴并通过1602液晶屏显示程序 求修改建议

[复制链接]
ID:1036890 发表于 2022-6-25 20:52 | 显示全部楼层 |阅读模式
电子琴(改)
●利用4x4矩阵键盘的16个按键,实现2个8度的电子琴演奏;利用51单片机开发板的蜂鸣器输出相应的声音;
●在1602液晶屏上显示当前正在演奏的音符,要求不同8度的声音用方便理解的符号进行显示,LED指示;
●在上述功能基础上,利用51单片机开发板上的一个独立按键,与矩阵键盘配合,再扩展出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 发表于 2022-6-27 11:44 | 显示全部楼层
无标题.jpg
仿真测试.rar (92.22 KB, 下载次数: 25)
回复

使用道具 举报

ID:195496 发表于 2022-6-29 12:44 | 显示全部楼层
很牛X,测试可以实现电子琴功能,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表