📄 实验24.asm
字号:
;------------------------------------------------------------------------------------------
;脉冲信号发生器实验参考程序(实验24.asm)
;------------------------------------------------------------------------------------------
LIST P=16F877 ;COUNTER、TEMP、COUNT变量已头文件中定义
INCLUDE"P16F877.INC" ;S1L、S1H、R1L、R1H变量已定义
;------------------------------------------------------------------------------------------
S1Z EQU 30H ;定义源数据中8位
COUNT1 EQU 31H
ORG 0000H ;系统复位地址
NOP ;MPLAB需要
GOTO ST ;转到主程序
;------------------------------------------------------------------------------------------
;中断服务程序
;------------------------------------------------------------------------------------------
ORG 0004H ;中断入口地址
BCF INTCON,RBIF
CALL JPSM ;键盘扫描
CLRF PORTC
GOTO POT
RETFIE ;中断返回
;------------------------------------------------------------------------------------------
;主程序
;------------------------------------------------------------------------------------------
ST BSF STATUS,RP0 ;选择数据存储器体1
CLRF TRISD ;定义端口
MOVLW 0F0H
MOVWF TRISB ;定义端口
MOVLW B'11010111' ;定义RC3/SCK、RC5/SDO输出、RC4/SDI输入
MOVWF TRISC
CLRF SSPSTAT ;清除SMP、CKE位
BCF STATUS,RP0 ;选择数据存储器体0
BCF STATUS,RP0 ;选择体0
MOVLW B'00110010' ;设置SSP控制方式:取FOSC/64、SPI主控、CKP=1
MOVWF SSPCON
CLRF COUNT ;清0
CLRF PORTC
CALL JKZT ;使数码管全暗
CALL XSHI ;调用显示子程序
POT BCF T1CON,TMR1ON
MOVLW B'10001000' ;使RB端口高4位产生电平变化中断(用于键盘)
MOVWF INTCON
HUI MOVF COUNT,W ;取出送W
SUBLW 0FH ;查表保护措施
BTFSS STATUS,C ;是否有进位
GOTO HUI
MOVF COUNT,W ;取出送W
ADDWF PCL,F ;调用偏移量
GOTO XSH0 ;进入按键'0'功能程序
GOTO XSH1 ;进入按键'1'功能程序
GOTO XSH2 ;进入按键'2'功能程序
GOTO XSH3 ;进入按键'3'功能程序
GOTO XSH4 ;进入按键'4'功能程序
GOTO XSH5 ;进入按键'5'功能程序
GOTO XSH6 ;进入按键'6'功能程序
GOTO XSH7 ;进入按键'7'功能程序
GOTO XSH8 ;进入按键'8'功能程序
GOTO XSH9 ;进入按键'9'功能程序
GOTO XSHA ;进入按键'A'功能程序
GOTO XSHB ;进入按键'B'功能程序
GOTO XSHC ;进入按键'C'功能程序
GOTO XSHD ;进入按键'D'功能程序
GOTO XSHE ;进入按键'E'功能程序
GOTO XSHF ;进入按键'F'功能程序
;----------------------------------------------------------------------------------------------
;查表子程序
;----------------------------------------------------------------------------------------------
BMA ADDWF PCL,F ;加偏移量
RETLW 3FH ;"0" 编码
RETLW 06H ;"1" 编码
RETLW 5BH ;"2" 编码
RETLW 4FH ;"3" 编码
RETLW 66H ;"4" 编码
RETLW 6DH ;"5" 编码
RETLW 7DH ;"6" 编码
RETLW 07H ;"7" 编码
RETLW 7FH ;"8" 编码
RETLW 6FH ;"9" 编码
RETLW 00H ;"暗" 编码(0AH)
RETLW 40H ;"-" 编码(0BH)
;----------------------------------------------------------------------------------------------
;16键盘功能程序
;----------------------------------------------------------------------------------------------
XSH0 CALL YIWEI ;调用移位子程序
MOVLW .0 ;数字0送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSH1 CALL YIWEI ;调用移位子程序
MOVLW .1 ;数字1送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSH2 CALL YIWEI ;调用移位子程序
MOVLW .2 ;数字2送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSH3 CALL YIWEI ;调用移位子程序
MOVLW .3 ;数字3送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSH4 CALL YIWEI ;调用移位子程序
MOVLW .4 ;数字4送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSH5 CALL YIWEI ;调用移位子程序
MOVLW .5 ;数字5送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSH6 CALL YIWEI ;调用移位子程序
MOVLW .6 ;数字6送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSH7 CALL YIWEI ;调用移位子程序
MOVLW .7 ;数字7送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSH8 CALL YIWEI ;调用移位子程序
MOVLW .8 ;数字8送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSH9 CALL YIWEI ;调用移位子程序
MOVLW .9 ;数字9送数据缓冲器最低位60H
MOVWF 60H
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSHA CALL JKZT ;功能键"清零"
CALL XSHI ;调用显示
GOTO $ ;原地等待
XSHB CLRF S1H ;功能键"确定"
MOVF 60H,W
ANDLW B'00001111' ;屏蔽高4位
MOVWF S1L
SUBLW 0AH
BTFSS STATUS,Z ;是否为0AH
GOTO NEXTB1
CLRF S1L ;清0
NEXTB1 SWAPF 61H,W
ANDLW B'11110000' ;屏蔽低4位
MOVWF TEMP
SUBLW 0A0H
BTFSS STATUS,Z ;是否为0A0H
GOTO NEXTB2
CLRF TEMP ;清0
NEXTB2 MOVF TEMP,W
ADDWF S1L,1 ;获得了S1L的数据
MOVF 62H,W
ANDLW B'00001111' ;屏蔽高4位
MOVWF S1Z
SUBLW 0AH
BTFSS STATUS,Z ;是否为0AH
GOTO NEXTB3
CLRF S1Z ;清0
NEXTB3 SWAPF 63H,W
ANDLW B'11110000' ;屏蔽低4位
MOVWF TEMP
SUBLW 0A0H
BTFSS STATUS,Z ;是否为0A0H
GOTO NEXTB4
CLRF TEMP ;清0
NEXTB4 MOVF TEMP,W
ADDWF S1Z,1 ;获得了S1Z的数据
CALL BINTOB ;进行BCD码与二进制码的转换
MOVF R1L,W
MOVWF PORTD ;若D口接LED灯,可看到R1L的值
CALL DELAY1S
MOVF R1H,W
MOVWF PORTD ;若D口接LED灯,可看到R1H的值
CALL DELAY1S ;对于全部D口的操作仅仅是为了内部调试,读者可对此忽略
;----------------------------------------------------------------------------------------------
;输出波形功能程序
;----------------------------------------------------------------------------------------------
BSF STATUS,RP0 ;选择数据存储器体1
BCF TRISC,2 ;C2口为信号输出口
BCF STATUS,RP0 ;选择数据存储器体0
MOVF R1H,W ;0064H=.100 即:100uS
MOVWF CCPR1H
MOVF R1L,W
MOVWF CCPR1L
MOVLW B'00000000' ;设置T1控制方式预分频比例为1:1
MOVWF T1CON ;内部定时方式
MOVLW B'00001000' ;如果匹配,C2为高电平
MOVWF CCP1CON
BSF T1CON,TMR1ON
CCPR BTFSS PIR1,CCP1IF
GOTO CCPR
CLRF TMR1H
CLRF TMR1L
MOVLW B'00000001' ;如果匹配,设置为低电平
XORWF CCP1CON ;(高低电平交互产生)
BCF PIR1,CCP1IF ;CCP1CON的低四位设置可查书
GOTO CCPR
GOTO $-1
XSHC MOVLW B'10101010' ;缺省(功能)
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'01010101'
MOVWF PORTD
CALL DELAY1S ;调用延时
GOTO HUI
XSHD MOVLW B'00000001' ;缺省(功能)
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'00000011'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'00000111'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'00001111'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'00011111'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'00111111'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'01111111'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11111111'
MOVWF PORTD
CALL DELAY1S ;调用延时
GOTO HUI
XSHE MOVLW B'10000000' ;缺省(功能)
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11000000'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11100000'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11110000'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11111000'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11111100'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11111110'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11111111'
MOVWF PORTD
CALL DELAY1S ;调用延时
GOTO HUI
XSHF MOVLW B'10000001' ;缺省(功能)
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11000011'
MOVWF PORTD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -