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

📄 dianziqing3.asm

📁 运用单片机汇编语言编写的液晶显示电子琴小程序
💻 ASM
字号:
RS BIT P3.5
RW BIT P3.4
E  BIT P3.3
BF BIT 07H
COUNTER EQU 26H
COUNTER2 EQU 22H
COUNTER3 EQU 23H
ADDRESS EQU 24H
NUM EQU 25H
/*--------------------------*/
ORG 0000H
AJMP START
ORG 000BH
AJMP TIMI
ORG 001BH
AJMP TIM2
ORG 0003H
AJMP DUAN
ORG 0100H
START:CLR TR0
      CLR TR1
      SETB EX0
      MOV SP,#60H
      MOV 30H,#00H
      MOV R0,#30H
MAIN:LCALL DELAY1
MOV R7,#01H
LCALL WRI
MOV R7,#30H
LCALL WRI
MOV R7,#02H
LCALL WRI
MOV R7,#04H
LCALL WRI
MOV R7,#0CH
LCALL WRI
MOV R7,#01H
LCALL WRI
/*--------------------------*/
PING5:
MOV ADDRESS,#80H
MOV DPTR,#HANG6
MOV NUM,#7
LCALL DISP
LCALL DELAY1
LCALL DELAY1
MOV R7,#01H
LCALL WRI
PING3:
MOV ADDRESS,#80H
MOV DPTR,#HANG3
MOV NUM,#7
LCALL DISP
MOV ADDRESS,#90H
MOV DPTR,#HANG5
MOV NUM,#7
LCALL DISP
LCALL DELAY1
LCALL DELAY1
KEY:  MOV  R5,#2
   D2:MOV  R4,#200
   D3:MOV  R3,#248
      DJNZ R3,$
      DJNZ R4,D3
      DJNZ R5,D2
      MOV R7,#0FFH
      LCALL WRI
      MOV R7,#00H                ;开始扫描键盘
      MOV A,#0FH
      MOV P2,A
      MOV A,P2
      ANL A,#0FH
      CJNE A,#0FH,KEYIN          ;A不等于0FH则有键按下
      AJMP KEY
          
KEYIN:MOV R3,#10                ;延时10ms防抖
   Y1:MOV R4,#248
      DJNZ R4,$
      DJNZ R3,Y1
      MOV A,#0EFH                ;扫描按下的键值
      MOV R1,A
      MOV P2,A
      MOV A,P2
   D0:MOV R2,#4                 
      SETB C                     ;将进位置1
   D1:RRC A
      JNC YOU                     ;c等于0则说明是该键值
      INC R7                     ;否则R7加1 
      DJNZ R2,D1
      
      MOV A,R1
      RLC A
      JNC KEY
      MOV R1,A
      MOV P2,A
      MOV A,P2
      AJMP D0
  YOU:MOV A,#0FH
      MOV P2,A
      MOV A,P2
      ANL A,#0FH
      CJNE A,#0FH,YOU
      MOV A,R7                   ;将键值送给A
      
      SUBB A,#12                ;当A等于0CH时,转SONG1
      CJNE A,#00H,ZHUAN0
      AJMP START1
   H1:AJMP SONG1
ZHUAN0:MOV A,R7
      SUBB A,#13                ;当A等于0DH时,转SONG2
      CJNE A,#00H,ZHUAN1
      AJMP START2
   H2:AJMP SONG2
ZHUAN1:MOV A,R7
      SUBB A,#14                ;当A等于0EH时,停止键入音符
      
      CJNE A,#00H,ZHUAN2
      CLR TR0

      AJMP HUICHE
ZHUAN2:MOV A,R7
      SUBB A,#15                ;当A等于0FH时,回放键入的音乐
      CJNE A,#00H,ZHUAN3
      CLR TR0
      LCALL DELAY1
MOV R7,#01H
LCALL WRI
MOV R7,#30H
LCALL WRI
MOV R7,#02H
LCALL WRI
MOV R7,#04H
LCALL WRI
MOV R7,#0CH
LCALL WRI
MOV R7,#01H
LCALL WRI
/*--------------------------*/
PING4:
MOV ADDRESS,#80H
MOV DPTR,#HANG4
MOV NUM,#7
LCALL DISP
LCALL DELAY1
LCALL DELAY1

      lJMP AGAIN
ZHUAN3:MOV A,R7
      INC A
      MOV @R0,A                  ;将键值存入内存
      INC R0
      DEC A

FAYIN:MOV TMOD,#01H          ;设置定时器工作状态,两个都是16位定时状态
      SETB ET0              ;开定时器0中断
      SETB EA                ;开中断                   
      MOV DPTR,#TABLE1        ;查表获得音频节拍编码
      RL A
      MOVC A,@A+DPTR
      MOV TH0,A              
      MOV 21H,A
      MOV A,R7
      RL A
      INC A
      MOVC A,@A+DPTR
      MOV TL0,A
      MOV 28H,A
      SETB TR0                ;启动定时器
      MOV  R5,#2
   N2:MOV  R4,#200
   N3:MOV  R3,#248
      DJNZ R3,$
      DJNZ R4,N3
      DJNZ R5,N2
      CLR TR0
     
      AJMP KEY       
TIMI: PUSH ACC
      PUSH PSW
      MOV TH0,21H
      MOV TL0,28H
      CPL P0.0
      POP PSW
      POP ACC
      RETI    

HUICHE:MOV A,#00H
      MOV @R0,A
      AJMP KEY
AGAIN:MOV R0,#30H           ;将存储内存地址送R0
  XUN:MOV A,@R0             ;取内存中存储的音频
      
      
      CJNE A,#00H,GONG
      AJMP MAIN
 GONG:
      
      MOV TMOD,#10H          ;设置定时器工作状态,两个都是16位定时状态
      SETB ET1              ;开定时器0中断
      SETB EA                ;开中断                   
      MOV DPTR,#TABLE1        ;查表获得音频节拍编码
      RL A
      MOVC A,@A+DPTR
      MOV TH1,A
      MOV 21H,A
      MOV A,@R0
      RL A
      INC A
      MOVC A,@A+DPTR
      MOV TL1,A
      MOV 28H,A
      SETB TR1
      MOV  R5,#5
   M2:MOV  R4,#09FH
   M3:MOV  R3,#0FFH
      DJNZ R3,$
      DJNZ R4,M3
      DJNZ R5,M2
      INC R0
      CLR TR1
      AJMP XUN
TIM2: PUSH ACC
      PUSH PSW
      MOV TH1,21H
      MOV TL1,28H
      CPL P0.0
      POP PSW
      POP ACC
      RETI 

START1:
CLR ET0
CLR ET1
CLR EA                                        ;初始化液晶
LCALL DELAY1
MOV R7,#01H
LCALL WRI
MOV R7,#30H
LCALL WRI
MOV R7,#02H
LCALL WRI
MOV R7,#04H
LCALL WRI
MOV R7,#0CH
LCALL WRI
MOV R7,#01H
LCALL WRI
/*--------------------------*/
PING1:
MOV ADDRESS,#80H
MOV DPTR,#HANG1
MOV NUM,#7
LCALL DISP



LCALL DELAY1
LCALL DELAY1
LCALL DELAY1

AJMP H1
/*--------------------------*/
START2:
CLR ET0
CLR ET1
CLR EA 
LCALL DELAY1
MOV R7,#01H
LCALL WRI
MOV R7,#30H
LCALL WRI
MOV R7,#02H
LCALL WRI
MOV R7,#04H
LCALL WRI
MOV R7,#0CH
LCALL WRI
MOV R7,#01H
LCALL WRI
/*--------------------------*/
PING2:
MOV ADDRESS,#80H
MOV DPTR,#HANG2
MOV NUM,#7
LCALL DISP


LCALL DELAY1
LCALL DELAY1
LCALL DELAY1

AJMP H2
/*--------------------------*/
/*--写指令 RS=0 RW=0 R7存指令--*/
WRI:
LCALL CXBF
CLR RS
CLR RS
CLR RW
CLR RW
MOV P1,R7
SETB E
SETB E
CLR E
CLR E
RET

/*--写数据 RS=1 RW=0 A存数据--*/
WRD:
LCALL CXBF
SETB RS
SETB RS
CLR  RW
CLR  RW
MOV P1,A
SETB E
SETB E
CLR E
CLR E
RET

/*-----查询BF RS=0 RW=1-------*/
CXBF:
CLR  RS
CLR  RS
SETB RW
SETB RW
SETB E
SETB E
LCALL DELAY
CXBF1:
MOV 20H,P1
JB  BF,CXBF1
CLR E
CLR E
RET

/*----------显示程序----------*/


DISP:
MOV R7,ADDRESS
LCALL WRI
CLR A
MOVC A,@A+DPTR
LCALL WRD
INC DPTR
CLR A
MOVC A,@A+DPTR
LCALL WRD
INC DPTR
INC ADDRESS
DJNZ NUM,DISP
RET
/*----------延时程序----------*/
/*-------------563us----------*/
DELAY:
MOV COUNTER,#10H
DELAY01:
MOV COUNTER2,#10H
DJNZ COUNTER2,$
DJNZ COUNTER,DELAY01
RET
/*-------------0.52s---------*/
DELAY1:
MOV COUNTER3,#4
DELAY12:
MOV COUNTER,#00H
DELAY11:
MOV COUNTER2,#00H
DJNZ COUNTER2,$
DJNZ COUNTER,DELAY11
DJNZ COUNTER3,DELAY12
RET

SONG1:    MOV  TMOD,#01H                
          SETB ET0                      ;允许中断
          SETB EA
MAIN1:    MOV 60H,#00H
NEXT1:    MOV DPTR,#TABLE2	  
          MOV A,60H
          MOVC A,@A+DPTR
          MOV  R1,A
          JZ   STOP1
          ANL  A,#0FH                    ;取A低4位,表示节拍
          MOV  R6,A                      ;控制节拍数存R6
          MOV  A,R1
          SWAP A
          ANL  A,#0FH                    ;交换再取地位,控制音调
          JNZ  SING1                      ;不为休止符转SING
          CLR  TR0                       ;清中断
          AJMP DT1
SING1:       
          DEC  A
          MOV  22H,A
          RL   A                         ;乘2
          MOV  DPTR,#TABLE1
          MOVC A,@A+DPTR                 ;查表
          MOV  TH0,A
          MOV  21H,A
          MOV  A,22H        
          RL   A
          INC  A                         ;加3
      	  MOVC A,@A+DPTR                 ;再查表
       	  MOV  TL0,A
          MOV  28H,A
          SETB TR0                            
DT1:      LCALL DELAY3
          INC  60H
          AJMP NEXT1
DELAY3:   MOV  R5,#2
   L2:    MOV  R4,#100
   L3:    MOV  R3,#248
          DJNZ R3,$
          DJNZ R4,L3
          DJNZ R5,L2
          DJNZ R6, DELAY3
          RET

SONG2:    MOV  TMOD,#01H                
          SETB ET0                      ;允许中断
          SETB EA
MAIN2:    MOV 60H,#00H
NEXT2:    MOV DPTR,#TABLE3        
          MOV A,60H
          MOVC A,@A+DPTR
          MOV  R1,A
          JZ   STOP1
          ANL  A,#0FH                    ;取A低4位,表示节拍
          MOV  R6,A                      ;控制节拍数存R6
          MOV  A,R1
          SWAP A
          ANL  A,#0FH                    ;交换再取地位,控制音调
          JNZ  SING2                      ;不为休止符转SING
          CLR  TR0                       ;清中断
          AJMP DT2
SING2:       
          DEC  A
          MOV  22H,A
          RL   A                         ;乘2
          MOV  DPTR,#TABLE1
          MOVC A,@A+DPTR                 ;查表
          MOV  TH0,A
          MOV  21H,A
          MOV  A,22H        
          RL   A
          INC  A                         ;加3
      	  MOVC A,@A+DPTR                 ;再查表
       	  MOV  TL0,A
          MOV  28H,A
          SETB TR0       

DT2:       LCALL DELAY3
          INC  60H
          AJMP NEXT2
          
STOP1:    CLR TR0
          CLR ET0
          CLR ET1
          CLR EA 
          LCALL DELAY1
          MOV R7,#01H
          LCALL WRI
          AJMP MAIN
DUAN:MOV A,#00H
          RETI
    


TABLE1:   DW 64260,64400,64524,64580       ;音频
          DW 64684,64777,64820,64898
          DW 64968,65030,65058,65110
          DW 65157,65178,65217

/*----------数据区-----------*/
/*两只老虎*/
HANG1:
DB 020H,020H,020H,020H
DB 0C1H,0BDH,0D6H,0BBH
DB 0C0H,0CFH,0BBH,0A2H
DB 020H,020H

/*----------数据区-----------*/
/*弯弯的月亮*/

HANG2:
DB 020H,020H,0CDH,0E4H
DB 0CDH,0E4H,0B5H,0C4H
DB 0D4H,0C2H,0C1H,0C1H
DB 020H,020H
HANG3:                                    ;郭慧敏
DB 020H,020H,0D7H,0F7H
DB 0D5H,0DFH,020H,03AH
DB 0B9H,0F9H,0BBH,0DBH
DB 0C3H,0F4H
HANG4:                      ;回放
DB 020H,020H,020H,020H
DB 020H,020H,0BBH,0D8H
DB 0B7H,0C5H,020H,020H
DB 020H,020H

HANG5:                                   ;老师:赵俊慧
DB 020H,020H,0C0H,0CFH
DB 0CAH,0A6H,03AH,020H
DB 0D5H,0D4H,0BFH,0A1H
DB 0BBH,0DBH 

HANG6:
DB 020H,020H,0B1H,0B1H
DB 0BEH,0A9H,0BDH,0BBH
DB 0CDH,0A8H,0B4H,0F3H
DB 0D1H,0A7H


TABLE2:   DB 44H,54H,64H,44H                ;两只老虎
          DB 44H,54H,64H,44H
          DB 64H,74H,88H
          DB 64H,74H,88H
          DB 82H,92H,82H,72H,64H,44H
          DB 82H,92H,82H,72H,64H,44H
          DB 54H,14H,48H
          DB 54H,14H,48H
          DB 00H


TABLE3:   DB 62H,82H,82H,62H,98H              ;弯弯的月亮
          DB 92H,0B2H,0B2H,82H,98H
          DB 62H,82H,82H,52H,68H
          DB 92H,0B2H,0B2H,82H,92H,92H,94H
          DB 92H,0B2H,0B2H,92H,84H,94H
          DB 0B8H,0B4H,04H
          DB 00H
END

⌨️ 快捷键说明

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