文档库 最新最全的文档下载
当前位置:文档库 › PIC单片机 - 脉冲信号发生器

PIC单片机 - 脉冲信号发生器

;------------------------------------------------------------------------------------------
;脉冲信号发生器实验参考程序(实验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 NEXT

B4
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
CALL DELAY1S ;调用延时
MOVLW B'11100111'
MOVWF PORTD
CALL DELAY1S ;调用延时
MOVLW B'11111111'
MOVWF PORTD
CALL DELAY1S ;调用延时
GOTO HUI
;-------------------------------------------------------------------------------------------

---
;键盘粗扫描(有没有键按下)
;----------------------------------------------------------------------------------------------
JPSM MOVLW 0F0H
MOVWF PORTB
MOVLW B'11110000' ;屏蔽低4位
ANDWF PORTB,W
SUBLW B'11110000'
BTFSC STATUS,Z
RETURN ;没有键按下,返回
CALL DELAY10MS ;防干扰延时10MS
MOVLW 0F0H
MOVWF PORTB
MOVLW B'11110000' ;屏蔽低4位
ANDWF PORTB,W
SUBLW B'11110000'
BTFSC STATUS,Z
RETURN ;子程序返回
MOVLW B'11111110' ;键盘细扫描(哪个键按下了)
MOVWF PORTB
BTFSS PORTB,4
GOTO JIAN0 ;键"0"按下,转去执行对应键盘子程序
BTFSS PORTB,5
GOTO JIAN1 ;键"1"按下,转去执行对应键盘子程序
BTFSS PORTB,6
GOTO JIAN2 ;键"2"按下,转去执行对应键盘子程序
BTFSS PORTB,7
GOTO JIAN3 ;键"3"按下,转去执行对应键盘子程序
MOVLW B'11111101'
MOVWF PORTB
BTFSS PORTB,4
GOTO JIAN4 ;键"4"按下,转去执行对应键盘子程序
BTFSS PORTB,5
GOTO JIAN5 ;键"5"按下,转去执行对应键盘子程序
BTFSS PORTB,6
GOTO JIAN6 ;键"6"按下,转去执行对应键盘子程序
BTFSS PORTB,7
GOTO JIAN7 ;键"7"按下,转去执行对应键盘子程序
MOVLW B'11111011'
MOVWF PORTB
BTFSS PORTB,4
GOTO JIAN8 ;键"8"按下,转去执行对应键盘子程序
BTFSS PORTB,5
GOTO JIAN9 ;键"9"按下,转去执行对应键盘子程序
BTFSS PORTB,6
GOTO JIANA ;键"A"按下,转去执行对应键盘子程序
BTFSS PORTB,7
GOTO JIANB ;键"B"按下,转去执行对应键盘子程序
MOVLW B'11110111'
MOVWF PORTB
BTFSS PORTB,4
GOTO JIANC ;键"C"按下,转去执行对应键盘子程序
BTFSS PORTB,5
GOTO JIAND ;键"D"按下,转去执行对应键盘子程序
BTFSS PORTB,6
GOTO JIANE ;键"E"按下,转去执行对应键盘子程序
BTFSS PORTB,7
GOTO JIANF ;键"F"按下,转去执行对应键盘子程序
RETURN ;子程序返回
;----------------------------------------------------------------------------------------------
;对寄存器COUNT附相应值,用于主程序的查表转跳
;----------------------------------------------------------------------------------------------
JIAN0 CALL SFANG ;调用键盘释放子程序
MOVLW 00H ;寄存器COUNT赋值"0"
MOVWF COUNT
RETURN ;子程序返回
JIAN1 CALL SFANG ;调用键盘释放子程序
MOVLW 01H ;寄存器COUNT赋值"1"
MOVWF COUNT
RETURN ;子程序返回
JIAN2 CALL SFANG ;调用键盘释放子程序
MOVLW 02H ;寄存器COUNT赋值"2"
MOVWF COUNT
RETURN ;子程序返回
JIAN3 CALL SFANG ;调用键盘释放子程序
MOVLW 03H ;寄存器COUNT赋值"3"
MOVWF COUNT
RETURN ;子程序返回
JIAN4 CALL SFANG ;调用键盘释放子程序
MOVLW 04H ;寄存器COUNT赋值"4"
MOVWF COUNT
RETURN ;子程序返回
JIAN5 CALL SFANG

;调用键盘释放子程序
MOVLW 05H ;寄存器COUNT赋值"5"
MOVWF COUNT
RETURN ;子程序返回
JIAN6 CALL SFANG ;调用键盘释放子程序
MOVLW 06H ;寄存器COUNT赋值"6"
MOVWF COUNT
RETURN ;子程序返回
JIAN7 CALL SFANG ;调用键盘释放子程序
MOVLW 07H ;寄存器COUNT赋值"7"
MOVWF COUNT
RETURN ;子程序返回
JIAN8 CALL SFANG ;调用键盘释放子程序
MOVLW 08H ;寄存器COUNT赋值"8"
MOVWF COUNT
RETURN ;子程序返回
JIAN9 CALL SFANG ;调用键盘释放子程序
MOVLW 09H ;寄存器COUNT赋值"9"
MOVWF COUNT
RETURN ;子程序返回
JIANA CALL SFANG ;调用键盘释放子程序
MOVLW 0AH ;寄存器COUNT赋值"A"
MOVWF COUNT
RETURN ;子程序返回
JIANB CALL SFANG ;调用键盘释放子程序
MOVLW 0BH ;寄存器COUNT赋值"B"
MOVWF COUNT
RETURN ;子程序返回
JIANC CALL SFANG ;调用键盘释放子程序
MOVLW 0CH ;寄存器COUNT赋值"C"
MOVWF COUNT
RETURN ;子程序返回
JIAND CALL SFANG ;调用键盘释放子程序
MOVLW 0DH ;寄存器COUNT赋值"D"
MOVWF COUNT
RETURN ;子程序返回
JIANE CALL SFANG ;调用键盘释放子程序
MOVLW 0EH ;寄存器COUNT赋值"E"
MOVWF COUNT
RETURN ;子程序返回
JIANF CALL SFANG ;调用键盘释放子程序
MOVLW 0FH ;寄存器COUNT赋值"F"
MOVWF COUNT
RETURN ;子程序返回
;----------------------------------------------------------------------------------------------
;按键释放子程序
;----------------------------------------------------------------------------------------------
SFANG MOVLW 0F0H
MOVWF PORTB
MOVLW B'11110000' ;屏蔽低4位
ANDWF PORTB,W
SUBLW B'11110000'
BTFSS STATUS,Z
GOTO SFANG
CALL DELAY10MS ;防干扰延时10MS
MOVLW 0F0H
MOVWF PORTB
MOVLW B'11110000' ;屏蔽低4位
ANDWF PORTB,W
SUBLW B'11110000'
BTFSS STATUS,Z
GOTO SFANG
RETURN ;子程序返回
;------------------------------------------------------------------------------------------
;显示驱动子程序
;------------------------------------------------------------------------------------------
XSHI MOVLW 67H ;设置显示缓冲器的数据地址
MOVWF FSR
LOOP MOVF INDF,W ;取出数据
CALL BMA ;查询对应编码
CALL OUTXSH ;利用SPI方式输出编码数据
DECF FSR
BTFSS FSR,4 ;直到8位数码全部输出
GOTO LOOP
RETURN ;子程序返回
;------------------------------------------------------------------------------------------
;SPI方式输出编码数据子程序
;------------------------------------------------------------------------------------------
OUTXSH MOVWF SSPBUF ;送至SSPBUF后开始逐位发送
LOOP1 BSF STATUS,RP0 ;选择体1
BTFSS SSPSTAT,BF ;是否发送完毕
GOTO LOOP1 ;否,继续查询
BCF STATUS,RP0

;发送完毕,选择体0
MOVF SSPBUF,W ;移空SSPBUF
RETURN ;子程序返回
;-------------------------------------------------------------------------
JKZT MOVLW 0AH ;监控状态(数码管全黑)
MOVWF 60H
MOVWF 61H
MOVWF 62H
MOVWF 63H
MOVWF 64H
MOVWF 65H
MOVWF 66H
MOVLW 0AH
MOVWF 67H
RETURN ;子程序返回
;-------------------------------------------------------------------------
YIWEI MOVF 62H,W ;移位
MOVWF 63H
MOVF 61H,W
MOVWF 62H
MOVF 60H,W
MOVWF 61H
RETURN ;子程序返回
;------------------------------------------------------------------------------------------
BINTOB MOVLW 10H ;BCD码转为二进制数子程序
MOVWF COUNT1
CLRF R1H
CLRF R1L
LPDTB BCF STATUS,C
RRF S1H
RRF S1Z
RRF S1L
RRF R1H
RRF R1L
DECFSZ COUNT1
GOTO ADJDCT
RETLW 00H
ADJDCT MOVLW S1L
MOVWF FSR
CALL ADJBIN
MOVLW S1Z
MOVWF FSR
CALL ADJBIN
MOVLW S1H
MOVWF FSR
CALL ADJBIN
GOTO LPDTB
ADJBIN MOVLW 03H
BTFSC INDF,3
SUBWF INDF
MOVLW 30H
BTFSC INDF,7
SUBWF INDF
RETLW 0
;----------------------------------------------------------------------------------------
;10MS延时子程序
;----------------------------------------------------------------------------------------
DELAY10MS
MOVLW 0FH ;外循环常数
MOVWF 20H ;外循环寄存器
LO2 MOVLW 0FFH ;中循环常数
MOVWF 21H ;中循环寄存器
L01 DECFSZ 21H,F ;中循环寄存器递减
GOTO L01 ;继续中循环
DECFSZ 20H,F ;外循环寄存器递减
GOTO LO2 ;继续外循环
RETURN ;返回
;-----------------------------------------------------------------------------------------
;1s延时子程序
;-----------------------------------------------------------------------------------------
DELAY1S MOVLW 06H ;外循环常数
MOVWF 20H ;外循环寄存器
L0 MOVLW 0EBH ;中循环常数
MOVWF 21H ;中循环寄存器
L1 MOVLW 0ECH ;内循环常数
MOVWF 22H ;内循环寄存器
L2 DECFSZ 22H,F ;内循环寄存器递减
GOTO L2 ;继续内循环
DECFSZ 21H,F ;中循环寄存器递减
GOTO L1 ;继续中循环
DECFSZ 20H,F ;外循环寄存器递减
GOTO L0 ;继续外循环
RETURN ;返回
;------------------------------------------------------------------------------------------
END
;------------------------------------------------------------------------------------------


相关文档