本帖最后由 Yihan_H 于 2021-12-6 21:00 编辑
要求如下:使用矩阵4X4按键播放一首完整的音乐,按1~7数字键则模拟钢琴琴键,发出1、2、3、4、5、6、7的声音,使用定时器中断实现1~2、3、4、5、6、7频率的设定,同时在LCD1602上实时显示播放音乐的乐谱。
但是现在是在数码管上显示播放音乐的乐谱,大佬们,要怎么改才能在LCD1602上显示?
原理图如下以及后面是现在的代码:因为原理图太大了所以放在后面的附件里了
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define SOUND_SPACE 4/5
- extern uchar Break_Flag;
- unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表
- unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在频率表中的位置
- unsigned char code SignTab1[7] = {1,2,3,4,5,6,7};
- unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };
- unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存
- unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存
- #define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit beep=P2^3;
- uint a,b;
- uchar key,shu[20];
- /*说明**************************************************************************
- 曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important)
- 音高由三位数字组成:
- 个位是表示 1~7 这七个音符
- 十位是表示音符所在的音区:1-低音,2-中音,3-高音;
- 百位表示这个音符是否要升半音: 0-不升,1-升半音。
-
- 音长最多由三位数字组成:
- 个位表示音符的时值,其对应关系是:
- |数值(n): |0 |1 |2 |3 | 4 | 5 | 6
- |几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n
- 十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音
- 百位是符点位: 0-无符点,1-有符点
- 调用演奏子程序的格式
- Play(乐曲名,调号,升降八度,演奏速度);
- |乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;
- |调号(0-11) : 是指乐曲升多少个半音演奏;
- |升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
- |演奏速度(1-12000): 值越大速度越快;
- ***************************************************************************/
- unsigned char code Music_Xing[]={ 0x0D,0x02, 0x0F,0x02, 0x10,0x03, 0x15,0x02, 0x16,0x03,
- 0x10,0x03, 0x15,0x03, 0x0F,0x02, 0x19,0x02, 0x1F,0x03,
- 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x16,0x00,
- 0x16,0x02, 0x17,0x03, 0x11,0x02, 0x10,0x02, 0x0F,0x02,
- 0x10,0x03, 0x15,0x02, 0x16,0x02, 0x0D,0x02, 0x15,0x02,
- 0x10,0x03, 0x0F,0x03, 0x10,0x03, 0x15,0x03, 0x0F,0x00,
- 0x17,0x66, 0x19,0x03, 0x11,0x02, 0x16,0x02, 0x10,0x03,
- 0x15,0x03, 0x0F,0x00, 0x0D,0x03, 0x0F,0x04, 0x0D,0x02,
- 0x0F,0x67, 0x10,0x04, 0x11,0x03, 0x16,0x03, 0x10,0x00,
- 0x0F,0x03, 0x10,0x03, 0x15,0x66, 0x16,0x03, 0x19,0x02,
- 0x17,0x02, 0x16,0x02, 0x16,0x03, 0x17,0x03, 0x15,0x02,
- 0x10,0x03, 0x0F,0x03, 0x0D,0x01, 0x15,0x01, 0x10,0x67,
- 0x15,0x04, 0x10,0x03, 0x0F,0x03, 0x0D,0x03, 0x0F,0x03,
- 0x10,0x03, 0x15,0x03, 0x0F,0x00, 0x00,0x00};
- int i=-1;
- uint code Freqtab[] = {
- 64580,64684,64777,
- 64820,64898,64968,65030};
- uchar code table[]={
- 0x00,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- void delay(uint x)
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
复制代码
|