单片机的高手进!高分悬赏改程序,在线等

源程序和接线方式如下,现在想要在此基础上,把电子琴改成运行后,按住一个键子不动超过4秒会自动演奏相映键子的音乐,高手帮帮忙了!功能:电子琴实验——连续型查询式键盘Puls... 源程序和接线方式如下,现在想要在此基础上,把电子琴改成运行后,按住一个键子不动超过4秒会自动演奏相映键子的音乐,高手帮帮忙了!
功能: 电子琴实验——连续型 查询式键盘
Pulse equ 10h ;脉冲
PulseCNT equ 50h ;脉冲计数
ToneHigh equ 40h ;高音调
ToneLow equ 41h ;低音调
Tone equ 42h ;音调
KeyBuf equ 54h

Speaker BIT P3.2

ORG 0000H
ljmp Start
org 000bh
LJMP Timer0Int
org 0100h

Start:

mov sp, #70h
mov TMOD, #01 ; Timer
mov IE, #82h ; EA=1, IT0 = 1
mov Tone,#0
MLoop:
call TestKey
jz MLoop
call GetKey
mov b, a
jz MLoop ; = 0, < 1

dec b
mov a, b
rl a ; a = a*2
mov b, a
mov dptr, #ToneTable
movc a, @a+dptr
mov ToneHigh, a
mov TH0, a
mov a, b
inc a
movc a, @a+dptr
mov ToneLow, a
mov TL0, a
SETB TR0
MOV P1,#0FFH
WAIT:
MOV A,P1

CJNE A,#0FFH, WAIT
MOV R6,#10
ACALL DELAY
CLR TR0
LJMP MLOOP

Timer0Int: ;定时中断
push PSW
clr TR0
mov TH0, ToneHigh
mov TL0, ToneLow
setb TR0
mov C, Pulse
MOV Speaker,C

CPL Pulse
pop PSW
reti

ToneTable:

DW 64578,64686,64778,64821
DW 64898,64968,65029,65068

TestKey:
MOV P1, #0FFH
MOV A, P1
CPL A ; 读入键状态

ret

KeyTable:DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH ; 键码定义

GETKEY:
MOV R6,#10
ACALL DELAY
MOV A,P1
CJNE A,#0FFH,K01 ;确有键按下
LJMP MLOOP
K01: MOV R3,#8 ;8个键
MOV R2,#0 ;键码
MOV B,A ;暂存键值
MOV DPTR,#KeyTable
K02: MOV A,R2
MOVC A,@A+DPTR ;从键值表中取键值
CJNE A,B,K04 ;键值比较
MOV A,R2 ;得键码
INC A
RET
K04: INC R2 ;不相等,到继续访问键值表
DJNZ R3,K02
MOV A,#0FFH ;键值不在键值中,即多键同时按下
LJMP MLOOP

Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, Delay
ret

END
接线: 8279键盘与显示模块的S11E、S12E开关的22路开关全部置位下方。
; 用8位数据线对应连接CPU模块的JD8(P1口)到8279模块的JD3E;
; JD4E接到八位逻辑电平输出模块的JD1E,
; 八位逻辑电平输出模块的K2位置位上方,其它位均置位下方。
; CPU模块的P32口接语音接口模块的VOICE口。
现在不是按键能发音么?就是想改成一直按住一个发音的按钮不动,能演奏音乐!其实主要是想增加演奏音乐的功能,怎么演奏你也可以自己改一下!但是一定要让我会! 如果做出来的话,会加分!只要尽快做出来就行!高手们~拜托了!!!我要的不是修改程序!而是帮我在原有的基础上,进行改进!!!!!!! 现在的只能是按一个键子发一个音节!1,2,3,4,5,6,7,高音1。我想要的是按住一个键子之后会发出一段音乐,再按任何键子音乐就停止!如果谁能帮我打出来绝对高分!!!
展开
 我来答
意法半导体(中国)投资有限公司 2023-06-12
展开全部
MAIN: MOV SP,#50H MOV DPTR,#TAB;读入字模指针 MOV 30H,DPL; 存起来 ;堆栈低8位 MOV 31H,DPH ;堆栈高8位 MOV 32H,30H;再记录指针,留作移动了多少位的判断 用。 MOV 3H,31H ;3H记录字模数据的高位地址 INC 3H;3H高位地址+5,表示数据有5X256列之多。 ROL: MOV R2,#01H;设扫描次数 INI1: MOV DPL,30H;这段是扫描一次32列 MOV DPH,31H MOV R4,#32 MOV R3,#0 LOP1 P1,R3 CLR A MOVC A,@A+DPTR MOV P0,A INC DPTR CLR A MOVC A,@A+DPTR MOV P2,A INC DPTR CAL DELAY INC R3 DJNZ R4,LOP1 DJNZ R2,INI1;这条预留扫描次数用可以调整速度 MOV DPL,3…
音乐飘渺迷人
推荐于2016-02-18 · TA获得超过3262个赞
知道大有可为答主
回答量:1719
采纳率:0%
帮助的人:1739万
展开全部
改了,不知行不行:
Pulse equ 10h ;脉冲
PulseCNT equ 50h ;脉冲计数
ToneHigh equ 40h ;高音调
ToneLow equ 41h ;低音调
Tone equ 42h ;音调
KeyBuf equ 54h

Speaker BIT P3.2

ORG 0000H
ljmp Start
org 000bh
LJMP Timer0Int
org 0100h

Start:

mov sp, #70h
mov TMOD, #01 ; Timer
mov IE, #82h ; EA=1, IT0 = 1
mov Tone,#0
MLoop:
call TestKey
jz MLoop
call GetKey

mov b, a
jz MLoop ; = 0, < 1

dec b
mov a, b
rl a ; a = a*2
mov b, a
mov dptr, #ToneTable
movc a, @a+dptr
mov ToneHigh, a
mov TH0, a
mov a, b
inc a
movc a, @a+dptr
mov ToneLow, a
mov TL0, a
SETB TR0

WAIT: MOV P1,#0FFH
MOV A,P1
;++++++++++++++++++++++++++++++++++++++++++++++++++++
DJNZ R5,waitk ;此处加入按键压下4秒的时间检测,调用延时
DJNZ R4,waitk ;调r3,r4值 达到4秒
DJNZ R3,waitk
LCALL MUSIC ;4秒到了,调音乐播放程序
LJMP MLOOP
;++++++++++++++++++++++++++++++++++++++++++++++++++++
waitk: CJNE A,#0FFH, WAIT;等松开
MOV R6,#10
ACALL DELAY
CLR TR0
LJMP MLOOP

Timer0Int: ;定时中断
push PSW
clr TR0
mov TH0, ToneHigh
mov TL0, ToneLow
setb TR0
mov C, Pulse
MOV Speaker,C

CPL Pulse
pop PSW
reti

ToneTable:

DW 64578,64686,64778,64821
DW 64898,64968,65029,65068

TestKey:
MOV P1, #0FFH
MOV A, P1
CPL A ; 读入键状态

ret

KeyTable:DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH ; 键码定义

GETKEY:
MOV R6,#10
ACALL DELAY
MOV A,P1
CJNE A,#0FFH,K01 ;确有键按下
;++++++++++++++++++++++++++++++++++++++++++++++++++++
CPL A
ret ;这句:LJMP MLOOP换成CPL A和RET
;++++++++++++++++++++++++++++++++++++++++++++++++++++
K01: MOV R3,#8 ;8个键
MOV R2,#0 ;键码
MOV B,A ;暂存键值
MOV DPTR,#KeyTable
K02: MOV A,R2
MOVC A,@A+DPTR ;从键值表中取键值
CJNE A,B,K04 ;键值比较
MOV A,R2 ;得键码
INC A
RET
K04: INC R2 ;不相等,到继续访问键值表
DJNZ R3,K02
MOV A,#0FFH ;键值不在键值中,即多键同时按下
;++++++++++++++++++++++++++++++++++++++++++++++++++++
CPL A
ret ;这句:LJMP MLOOP换成CPL A和RET
;++++++++++++++++++++++++++++++++++++++++++++++++++++

Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, Delay
ret
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;音乐播放程序
MUSIC:

mov a,#0
mov dptr, #xxx ;小星星
movc a, @a+dptr
jz waitk3 ;播完返回
inc dptr
mov ToneHigh, a
mov TH0, a
mov a, #0
movc a, @a+dptr
inc dptr
mov ToneLow, a
mov TL0, a

mov a, #0
movc a, @a+dptr
inc dptr
mov r3,a
mov a, #0
movc a, @a+dptr
inc dptr
mov r4,a

SETB TR0

WAIT2: MOV P1,#0FFH
MOV A,P1
DJNZ R5,waitk2 ;此处延时为音长
DJNZ R4,waitk2 ;调r3,r4值为发音持续时间
DJNZ R3,waitk2
LCALL MUSIC ;发音持续时间结束,调音乐播放程序
sjmp waitk3

waitk2: CJNE A,#0FFH, WAIT2;等松开
waitk3: CLR TR0
MOV R6,#10
ACALL DELAY
ret

RET
xxx: ;小星星
;DW 64578,64686,64778,64821;1 2 3 4
;DW 64898,64968,65029,65068;5 6 7 1
;DW格式:音符,时长,
DW 64578,60000,64578,60000,64898,60000,64898,60000;1 1 5 5
DW 64968,60000,64968,60000,64898,60000 ;6 6 5
DW 64821,60000,64821,60000,64778,60000,64778,60000;4 4 3 3
DW 64686,60000,64686,60000,64578,60000,0,0,0,0 ;2 2 1
;++++++++++++++++++++++++++++++++++++++++++++++++++++

END
意法半导体(中国)投资有限公司
2020-01-15 广告
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
新起点009
2010-06-10 · 超过17用户采纳过TA的回答
知道答主
回答量:70
采纳率:0%
帮助的人:0
展开全部
GETKEY子程序有语法错误
下面这句:
CJNE A,#0FFH,K01 ;确有键按下
LJMP MLOOP ----------------------这里不能limp,要用ret
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式