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

📄 main.asm

📁 汇编语言实现的电子音乐发生器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
           ;变songend值直接读

read 
 movf addr,0;将地址变量送W
 movwf songend;经W送songend寄存器
 clrf addr;将地址变量清0,从曲目开头读起
;*************** e2prom read1 子程序 *******************
;入口参数;把 即将读取的单元地址addr预先放入了W中
;出口参数:是把读出的数据保存在W 中
;********************************************************
read1
      bcf status,rp0
      bsf status,rp1
      movf addr,w ;取地址
      movwf eeadr ;送地址寄存器
      bsf status,rp0 ;bank3
      bcf eecon1,eepgd ;选定e2prom 为访问对象
      bsf eecon1,rd  ;启动读操作
      bcf status,rp0 ;bank2
      movf eedata,w ;取数据,即键值
      bcf status,rp1;体0为当前体
      movwf portc;;送显LED
      movwf yinfu;;保存在定义的寄存器中
      call checkyinch;;查表得对应音长
      movwf count;;通过W传给参数COUNT
      movf yinfu,0;;将翻译键值送到W
      call checkyingao;;查表得对应音调
      movwf temp0;;通过W传给参数TEMP0
      call fangbo;;调用FANGBO子程序
      call delay64
      incf addr,f;;地址变量递增
      movf addr,w;;送到W
      xorwf songend,0;;与songend寄存器内容比较:songend曲目终点
      btfss status,z
      goto read1;;没读完!回read1继续读
      clrf addr;;读完!将地址变量清0
      goto write;;回到大循环起点
      return
;************** eeprom end ************
;*******************************************

;************* lcd 初始化 *****************
;*********************************************
lcdinitiate
   movlw  00h;
   bsf    status,rp0;转到体1

   movwf  trisd;设置端口d,e为输出
   movwf  trise;
   movlw  7h
   movwf  option_reg;设置定时器tmr0分频比为1:256
   bcf    status,rp0;恢复体0
  
   ;call   delay10
    
   movlw  b'00110000'
   call   lcddownwrite
   nop

   movlw  b'00110000'
   call   lcddownwrite
   nop

   movlw  b'00110000'
   call   lcddownwrite
   nop

   movlw  b'00111000';功能设置,8bit操作,2行显示,5x7点阵
   call   lcddownwrite;

   movlw  b'00001000';关显示
   call   lcddownwrite;

   movlw  b'00000001';清屏
   call   lcddownwrite;下降触发并写入
 
   movlw  b'00000110';设置输入方式 增量方式显示,无位移
   call   lcddownwrite;
 
   movlw  b'00001110';显示开,光标开,字符闪烁关
   call   lcddownwrite;

   ;bsf    status,rp0;转到体1
   ;movlw 0ffh;将端口D设置为输入
   ;movwf trisd;
   ;bcf    status,rp0;恢复体0
   
   return
;*****************************************************

   
;****************下降沿触发并设置*************
lcddownwrite

   bsf     porte,enable  ;enable端设置触发
   bcf     porte,rs  ;RS寄存器选择 数据寄存器
   movwf   portd;
   nop
   nop
   nop
   bcf     porte,enable  ;下降沿产生
   call    delay10   ;延时,便于观察
   ;call delay64
   ;call delay64
   return


;****************delay64ms子程序*******************
delay64
   bcf     intcon,2  ;清除tmr0溢出标志位
   movlw   6     ;tmr0赋初值
   movwf   tmr0      ;并重新启动定时计数
loop1
   btfss   intcon,2  ;检查tmr0溢出标志位
   goto    loop1     ;没有溢出,循环检测
   return             
;***************************************************

;**************  delay10ms  *******************
delay10
   bcf     intcon,2
   movlw   d'216'
   movwf   tmr0
loop2
   btfss   intcon,2
   goto    loop2
   return

;*******************   enableport 产生下降沿  **********
enableport
   
   bsf   porte,rs  ;指令符10xxxxxxxx
   bsf  porte,enable
   movwf portd
   nop
   nop
   nop
   bcf  porte,enable;产生一个下降沿
   call delay10
   ;call delay64
   ;call delay64
   ;call delay64

   return
;********* 功能选择提示********
functlist
   movlw b'01010111'
   call  enableport
   movlw b'01000101'
   call  enableport
   movlw b'01001100'
   call  enableport
   movlw b'01000011'
   call  enableport
   movlw b'01001111'
   call  enableport
   movlw b'01001101'
   call  enableport
   movlw b'01000101'
   call  enableport
   movlw b'00100001'
   call  enableport ;welcome!
   movlw b'11000000'
   call  lcddownwrite ;改变显示位置到第2行第1位

   movlw b'01000011'
   call  enableport
   movlw b'00111010'
   call  enableport
   movlw b'01000101'
   call  enableport
   movlw b'01001100'
   call  enableport
   movlw b'01000101'
   call  enableport
   movlw b'01000011'
   call  enableport
   movlw b'01010100'
   call  enableport
   movlw b'01010010'
   call  enableport
   movlw b'01001111';o
   call  enableport
   movlw b'01001110';n
   call  enableport
   movlw b'01001001'
   call  enableport
   movlw b'01000011';c
   call  enableport
   movlw b'10000000';
   call  enableport
   movlw b'01001111'
   call  enableport
   movlw b'01010010';r
   call  enableport
   movlw b'01000111'
   call  enableport

   movlw b'00000111'
   call  lcddownwrite;设置AC为增量方式,显示移位

   movlw b'01000001';a
   call  enableport
   movlw b'01001110'
   call  enableport
 
   movlw b'10000000'
   call  enableport
 
   movlw b'01000100';d,save
   call  enableport
   movlw b'00111010'
   call  enableport
   movlw b'01010011'
   call  enableport
   movlw b'01000001'
   call  enableport
   movlw b'01010110'
   call  enableport
   movlw b'01000101'
   call  enableport

   movlw b'10000000'
   call  enableport 

   movlw b'01000101';e,play
   call  enableport
   movlw b'00111010'
   call  enableport
   movlw b'01010000'
   call  enableport
   movlw b'01001100'
   call  enableport
   movlw b'01000001'
   call  enableport
   movlw b'01011001'
   call  enableport


   movlw b'10000000'
   call  enableport 

   movlw b'01000110';f,wish
   call  enableport
   movlw b'00111010'
   call  enableport
   movlw b'01010111'
   call  enableport
   movlw b'01001001'
   call  enableport
   movlw b'01010011'
   call  enableport
   movlw b'01001000'
   call  enableport

   movlw b'10000000'
   call  enableport 

   movlw h'10'
   movwf lcdr

circle
 decfsz h'10',1
 goto   loop3
 return
;-------------------------
loop3
  movlw b'00011100'
  call  lcddownwrite
  call delay64
  call delay64
  call delay64
  call delay64
  goto  circle
;***************************************************
;***************** lcd end ****************
;*****************************************************
;****************song*************
song 
  incf special,1
  call check
  movlw 77h
  subwf value,w
  btfsc status,z
  call song1
  movlw 7bh
  subwf value,w
  btfsc status,z
  call song2
  goto loopmain
;***********************************
song1

        movlw   .189;          3
        movwf   count
        movlw   .132
        movwf   temp0
        call fangbo

       movlw   .189;          3
        movwf   count
        movlw   .132
        movwf   temp0
        call fangbo
       movlw   .168;           2
        movwf   count
        movlw   .117
        movwf   temp0
        call fangbo


         movlw   .252;          3
        movwf   count
        movlw   .132
        movwf   temp0
        call fangbo

          movlw   .189;          3
        movwf   count
        movlw   .132
        movwf   temp0
        call fangbo
       movlw   .225;          5
        movwf   count
        movlw   .152
        movwf   temp0
        call fangbo


         movlw   .189;          3
        movwf   count
        movlw   .132
        movwf   temp0
        call fangbo
      movlw   .168;           2
        movwf   count
        movlw   .117
        movwf   temp0
        call fangbo


     movlw   .252;          3
        movwf   count
        movlw   .132
        movwf   temp0
        call fangbo


        movlw   .150;           1
        movwf   count
        movlw   .100
        movwf   temp0
        call fangbo


        movlw   .150;           1
        movwf   count
        movlw   .100
        movwf   temp0
        call fangbo

        movlw   .168;           2
        movwf   count
        movlw   .117
        movwf   temp0
        call fangbo

     movlw   .189;           3
        movwf   count
        movlw   .132
        movwf   temp0
        call fangbo



            movlw   .225;          5
        movwf   count
        movlw   .152
        movwf   temp0
        call fangbo

     movlw   .189;           3
        movwf   count
        movlw   .132
        movwf   temp0
        call fangbo


        movlw   .168;           2
        movwf   count
        movlw   .117
        movwf   temp0
        call fangbo


        movlw   .168;           2
        movwf   count
        movlw   .117
        movwf   temp0
        call fangbo


        movlw   .150;           1
        movwf   count
        movlw   .100
        movwf   temp0
        call fangbo


      movlw   .224;           2
        movwf   count
        movlw   .117
        movwf   temp0
        call fangbo
        return


song2
      


      
        movlw   .150;           1
        movwf   count
        movlw   .100
        movwf   temp0
        call fangbo

        movlw   .168;           2
        movwf   count
        movlw   .117
        movwf   temp0
        call fangbo

     movlw   .189;           3
        movwf   count
        movlw   .132
        movwf   temp0
        call fangbo

    
        movlw   .134;          4
        movwf   count
        movlw   .139
        movwf   temp0
        call fangbo

        movlw   .150;          5
        movwf   count
        movlw   .152
        movwf   temp0
        call fangbo

        
        movlw   .168;          6
        movwf   count
        movlw   .163
        movwf   temp0
        call fangbo

        
        movlw   .189;          7
        movwf   count
        movlw   .173
        movwf   temp0
        call fangbo

       
        movlw   .200;          6
        movwf   count
        movlw   .178
        movwf   temp0
        call fangbo



  return
;*********************************************

;************delaytemp******************
delaytemp
lp0  movlw n2
     movwf data2
lp1  decfsz data2,1
     goto lp1
     decfsz data1,1
     goto lp0
     return 
 end

⌨️ 快捷键说明

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