⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 222.asm

📁 单片机控制的乒乓游戏的全部程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;击球音乐*
;*********
;*****************************************MusicInit2 Begin
MusicInit2:
       CLR  RS1                 ;使用第一套寄存器
       SETB RS0
       MOV  TH0 ,#0D8H
       MOV  TL0 ,#0EFH
       MOV  TMOD,#01H
       MOV  IE  ,#82H
MUSIC02:
       MOV  DPTR,#MusicTab3     ;表头地址送DPTR
       MOV  20H ,#00H           ;中断计数器清0
MUSIC12:
       NOP
       CLR  A
       MOVC A  ,@A+DPTR
       JZ   END02               ;是00H,则结束
       CJNE A  ,#0FFH,MUSIC52   ;如果是休止符,往下执行
       LJMP MUSIC32
MUSIC52:
       NOP
       MOV  R6  ,A              ;R6音符的频率
       INC  DPTR                ; DPTR++
       MOV  A   ,#0
       MOVC A  ,@A+DPTR         ;取节拍代码送R7
       MOV  R7  ,A              ;R7音符发音的时间
       SETB TR0                 ;启动计数
MUSIC22:
       NOP
       CPL  P3.3                ;P3.3是音乐输出引脚
       MOV  A   ,R6
       MOV  R3  ,A
       LCALL DEL2
       MOV  A   ,R7
       CJNE A  ,20H,MUSIC22     ;中断计数器(20H)=R7否?
                                ;不等,则继续循环
       MOV  20H ,#00H           ;等于,则取下一代码
       INC  DPTR
       LJMP MUSIC12
MUSIC32:
       NOP                      ;休止100毫秒
       CLR  TR0
       MOV  R2  ,#0DH           ;R2=13
MUSIC42:
       NOP
       MOV  R3  ,#0FFH          ;R3=255
       LCALL DEL2
       DJNZ R2 ,MUSIC42
       INC  DPTR
       LJMP MUSIC12
END02:
       CLR  RS0                 ;换回第0套寄存器
       CLR  RS1
       RET
DEL2:                           ;
       NOP
DEL32:
       MOV  R4  ,#02H
DEL42:
       NOP
       DJNZ R4 ,DEL42
       NOP
       DJNZ R3 ,DEL32
       RET
;*****************************************MusicInit2 End

;*************
;得分奖励音乐*
;*************
;*****************************************Musicsuccess Begin
Musicsuccess:
       CLR  RS1                        ;使用第一套寄存器
       SETB RS0
       MOV  TH0,#0D8H
       MOV  TL0,#0EFH
       MOV  TMOD,#01H
       MOV  IE ,#82H
MUSIC04:
       MOV  DPTR,#MusicTab4             ;表头地址送DPTR
       MOV  20H,#00H                   ;中断计数器清0
MUSIC14:
       NOP
       CLR  A
       MOVC A  ,@A+DPTR
       JZ   END04                        ;是00H,则结束
       CJNE A  ,#0FFH,MUSIC54            ;如果是休止符,往下执行
       LJMP MUSIC34
MUSIC54:
       NOP
       MOV  R6 ,A                       ;R6音符的频率
       INC  DPTR                       ; DPTR++
       MOV  A  ,#0
       MOVC A  ,@A+DPTR                 ;取节拍代码送R7
       MOV  R7 ,A                       ;R7音符发音的时间
       SETB TR0                       ;启动计数
MUSIC24:
       NOP
       CPL  P3.3                       ;P3.3是音乐输出引脚
       MOV  A  ,R6
       MOV  R3 ,A
       LCALL DEL5
       MOV  A  ,R7
       CJNE A  ,20H,MUSIC24              ;中断计数器(20H)=R7否?
                                      ;不等,则继续循环
       MOV  20H,#00H                   ;等于,则取下一代码
       INC  DPTR
       LJMP MUSIC14
MUSIC34:
       NOP                            ;休止100毫秒
       CLR  TR0
       MOV  R2 ,#0DH ;R2=13
MUSIC44:
       NOP
       MOV  R3 ,#0FFH ;R3=255
       LCALL DEL5
       DJNZ R2 ,MUSIC44
       INC  DPTR
       LJMP MUSIC14
END04:
       CLR  RS0                        ;换回第0套寄存器
       CLR  RS1
       RET
DEL5:                                  ;
       NOP
DEL34:
       MOV  R4 ,#02H
DEL44:
       NOP
       DJNZ R4 ,DEL44
       NOP
       DJNZ R3 ,DEL34
       RET
;*****************************************Musicsuccess End



;*****************************************MusicInit1  Begin
MusicInit1:
       CLR  RS1                  ;使用第一套寄存器
       SETB RS0
       MOV  TH0,#0D8H
       MOV  TL0,#0EFH
       MOV  TMOD,#01H
       MOV  IE ,#82H
MUSIC01:
       MOV  DPTR,#MusicTab2      ;表头地址送DPTR
       MOV  20H,#00H             ;中断计数器清0
MUSIC11:
       NOP
       CLR  A
       MOVC A  ,@A+DPTR
       JZ   END01                ;是00H,则结束
       CJNE A  ,#0FFH,MUSIC51      ;如果是休止符,往下执行
       LJMP MUSIC31
MUSIC51:
       NOP
       MOV  R6 ,A                 ;R6音符的频率
       INC  DPTR                 ; DPTR++
       MOV  A  ,#0
       MOVC A  ,@A+DPTR            ;取节拍代码送R7
       MOV  R7 ,A                 ;R7音符发音的时间
       SETB TR0                  ;启动计数
MUSIC21:
       NOP
       CPL  p3.3                 ;P3.3是音乐输出引脚
       MOV  A  ,R6
       MOV  R3 ,A
       LCALL DEL1
       MOV  A  ,R7
       CJNE A  ,20H,MUSIC21        ;中断计数器(20H)=R7否?
                                 ;不等,则继续循环
       MOV  20H,#00H             ;等于,则取下一代码
       INC  DPTR
       LJMP MUSIC11
MUSIC31:
       NOP                       ;休止100毫秒
       CLR  TR0
       MOV  R2 ,#0DH ;R2=13
MUSIC41:
       NOP
       MOV  R3 ,#0FFH ;R3=255
       LCALL DEL1
       DJNZ R2 ,MUSIC41
       INC  DPTR
       LJMP MUSIC11
END01:
       CLR  RS0                  ;换回第0套寄存器
       CLR  RS1
       RET
DEL1:                            ;
       NOP
DEL31:
       MOV R4 ,#02H
DEL41:
       NOP
       DJNZ R4,DEL41
       NOP
       DJNZ R3,DEL31
       RET
;*****************************************MusicInit1 End

;*******
;数据表*
;*******
;*****************************************Tables Begin
;.....................................;Table for Music
MUSICTAB:
       DB 18H, 30H, 1CH, 10H
       DB 20H, 40H, 1CH, 10H
       DB 18H, 10H, 20H, 10H
       DB 1CH, 10H, 18H, 40H
       DB 1CH, 20H, 20H, 20H
       DB 1CH, 20H, 18H, 20H
       DB 20H, 80H, 0FFH, 20H
       DB 30H, 1CH, 10H , 18H
       DB 20H, 15H, 20H , 1CH
       DB 20H, 20H, 20H , 26H
       DB 40H, 20H , 20H , 2BH
       DB 20H, 26H, 20H , 20H
       DB 20H, 30H , 80H , 0FFH
       DB 20H, 20H, 1CH , 10H
       DB 18H, 10H, 20H , 20H
       DB 26H, 20H , 2BH , 20H
       DB 30H, 20H ,00H
MusicTab2:
       DB 14H,10H,12H,10H,10H,10H,12H,04H,10H,10H,12H,04H,10H,10H,12H,10H
       DB 10H,10H,0DH,10H,0CH,10H,10H,10H,12H,04H,10H,10H,12H,04H,10H,10H
       DB 12H,10H,14H,10H,21H,10H,10H,10H,0CH,10H,10H,10H
       DB 12H,20H,14H,04H,12H,10H,10H,10H,12H,20H,14H,10H,12H,40H,0FFH
       DB 18H,10H,20H,04H,18H,10H,20H,04H,18H,10H,1BH,10H,18H,10H,14H,20H,12H,10H
       DB 10H,10H,12H,04H,10H,10H,12H,04H,10H,10H,12H,10H,10H,10H,1BH,10H,0FFH
       DB 18H,10H,1BH,10H,18H,10H,14H,10H,12H,10H,10H,10H,12H,10H
       DB 14H,10H,12H,60H,00H

MusicTab3:
         DB 14H,10H,12H,60H,00H
MusicTab4:
         DB 18H,10H,1BH,10H,18H,10H,14H,10H,12H,10H,10H,10H,12H,10H,00H
;*****************************************Tables End









;**********************
;MAX7219初始化及显示  *
;完成初始化后,LED全黑*
;**********************
;*****************************************LedInit Begin
;.................MAX7219初始化............begin
LedInit:CLR     P0.1       ;CLK=0
        CLR     P0.2       ;LOAD=0
        MOV     A,#0CH     ;关闭显示
        MOV     B,#00H
        LCALL   INPUT
        MOV     A,#09H     ;非译码模式
        MOV     B,#00H
        LCALL   INPUT
        MOV     A,#0BH     ;显示6*LED
        MOV     B,#05H
        LCALL   INPUT
        MOV     A,#0AH     ;亮度占空比31/32
        MOV     B,#0FH     ;显示测试寄存器为正常显示方式
        LCALL   INPUT
        MOV     A,#0FH     ;显示测试寄存器为正常显示方式
        MOV     B,#00H
        LCALL   INPUT
        MOV     A,#0CH     ;开始显示
        MOV     B,#01H
        LCALL   INPUT

;.................MAX7219显示.................
        MOV     R1,#06H    ;置循环次数
DISP:   MOV     A,R1       ;DIG5~DIG0地址
        MOV     B,#00H     ;SEG5~SEG0数据
        LCALL   INPUT      ;LED显示
        DJNZ    R1,DISP
        RET
INPUT:  LCALL   INPUTA     ;传送寄存器地址字节
        LCALL   INPUTB     ;传头寄存器数据字节
        SETB    P0.2       ;LOAD=1
        NOP
        NOP
        CLR     P0.2       ;LOAD=0
        RET
INPUTA: MOV     R0,#08H    ;每个地址或数据均为八为二进制数,按位分八次送入
INPUT1: RLC     A
        JNC     INLOW
        SETB    P0.0        ;DIN=1
        NOP
INPUT2: SETB    P0.1        ;CLK=1
        NOP
        NOP
        CLR     P0.1        ;CLK=0
        DJNZ    R0,INPUT1
        RET
INLOW:  CLR     P0.0        ;DIN=0
        SJMP    INPUT2
INPUTB: MOV     A,B
        SJMP    INPUTA

LedTab:DB 7EH,30H,6DH,79H,33H,5BH,5FH,70H,7FH,7BH,36H,77H,4EH,4FH,47H,37H,0EH,67H,00H,0B0H ;LED显示用字码表
         ; 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 11,  A,  C,  E,  F,  H,  L,  P,  黑,1.;

;.................MAX7219初始化...............end
;*****************************************LedInit End















;**********
;开机画面 *
;**********
;*****************************************ShowInit Begin
;.....初始化......;

ShowInit:MOV 20H,#00H          ;清标志,00H开始扫描标志,01H为1帧,扫描结束标志
        MOV  A  ,#0FFH	       ;端口初始化
        MOV  P1 ,A
        MOV  P2 ,A
        MOV  P3 ,A
        MOV  P0 ,A
        CLR  P1.6              ;串行寄存器输入打入输出控制位
        CLR  P1.3
        MOV  TMOD,#01H         ;使用T0作16位定时器,行扫描用
        MOV  TH0,#0F8H         ;定时器每次中断为1ms初值(24MHz)65536-1m*(24M/12)=63536
        MOV  TL0,#30H
        MOV  SCON,#00H         ;串行口控制字,0方式传送显示字节
        MOV  IE ,#82H          ;T0中断允许,总中断允许
        MOV  SP ,#70H
        MOV  DPTR,#ShowTab
        LCALL  MOVDISP         ;向上滚动显示“欢迎”“光临”
;
;******************;
;多字滚动显示子程序;
;******************;
;每次8个字,入口是定义好DPTR值;
;
MOVDISP:MOV  B  ,#00H          ;向上移动显示,查表偏址暂存(从00开始)
DISLOOP:MOV  R3 ,#0EH          ;移动速度,每一帧显示14次;R3越大,每幅画面停留的时间就越长
DISMOV: MOV  R2 ,#00H          ;第0行开始
        MOV  R1 ,B
        SETB TR0               ;开扫描(每次一帧)
WAITMOV:JBC  01H,DISMOV1       ;标志为1扫描一帧结束(8ms为1帧,每行1ms)
        AJMP WAITMOV
DISMOV1:DJNZ R3 ,DISMOV        ;一帧重复显示(控制每个字向上移动的速度,14帧*8ms/帧=0.112s上移一行)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -