;*******************************
;<<单键循环切换方波信号发生器>>程序
;文件名为 LXM006,ASM
;作者: liao xuming
;日期: 2008-1-7
;编译器: MPALB IDE FOR WINDOWS 5.70.40
;MCU: PIC16F877
;可选择Proteus 仿真
;QQ:471493963
;*******************************************
tmr0 equ 01h ;定义定时器/计数器0寄存器地址
status equ 3h ;定义状态寄存器地址
option_reg equ 81h ;定义选项寄存器地址
option_b equ 22h ;定义一个备份寄存器
intcon equ 0bh ;定义中断控制寄存器地址
portb equ 6h ;定义端口B的数据寄存器地址
trisb equ 86h ;定义端口B的方向控制寄存器
portc equ 7h ;定义端口C的数据寄存器地址
trisc equ 87h ;定义端口C的方向控制寄存器
tmr0b equ d'256'-d'125' ;定义常数标号作为TMR0的初值
;这是个算术形式,汇编器自动计算出结果
rp0 equ 5h ;定义状态寄存器中的页选位 RP0
;***************主程序**********************
org 000h ;定义程序存放区域的起始地址
main nop ;放置一条ICD必需的空操作指令
bsf status,rp0 ;设置文件寄存器的体1
movlw 0feh ;将端口C的方向控制码0FEH先送W
movwf trisc ;将RCO设置为输出
clrf portc ;将端口寄存器C清0
movlw 0ffh ;将端口寄存器B设置为输入
movwf trisb ;不用的引脚尽量设为输入
movlw 07h ;将分频比设定为1:256
movwf option_reg ;
bcf status,rp0 ;恢复到文件寄存器的体0
keyin btfsc portb,0 ;测试SW1按下否?是!跳过下条指令
goto loop ;否!则转到改变输出电平
call delay ;调用延时子程序,消除接通抖动的影响
btfsc portb,0 ;再次测试sw1是否按下?是!跳过下条指令
goto loop ;否!跳到改变输出电平
check btfss portb,0 ;测试SW1断开否?是!跳过下条指令
goto check ;否!循环检测
call delay ;调用延时子程序,消除断开抖动的影响
btfss portb,0 ;再次测试SW1断开否?是!跳过下条指令
goto check ;否!则循环检测
bsf status,rp0 ;是,设置文件寄存器的体1
decf option_reg,1 ;选项寄存器递减
movlw 07h ;为了确保BIT7-BIT3是0
andwf option_reg ;屏蔽选项寄存器的高5位
movf option_reg,1 ;自己传到自己为了影响Z标志位
bcf status,rp0 ;恢复文件寄存器的体0
btfsc status,2 ;检查选项寄存器减到0否?否!则跳一步
goto main ;是!则回到起始处开始下一轮的频率切换
loop movlw 01h ;用"异或"算法
xorwf portc ;将RC0的引脚电平取反
bcf intcon,2 ;消除TMR0溢出标志
movlw tmr0b ;TMR0重赋初值
movwf tmr0 ;并重新启动定时器开始计数
test btfss intcon,2 ;检测TMR0溢出标志位
goto test ;没有溢出,刚循环检测
goto keyin ;有溢出,则检测键盘输入
;*********** TMR0 延时子程序 8MS***********
delay
bsf status,rp0 ;设置文件寄存器的体1
movf option_reg,0 ;保护选项寄存器的内容
movwf option_b ;到备份寄存器
movlw 04h ;设置选项寄存器的,分频器给TMR0
movwf option_reg ;分频比初值设为1:32
bcf status,rp0 ;恢复到文件寄存器体0
bcf intcon,2 ;清除TMR0溢出标志位
movlw 06h ;TMR0初值为250=256-6
movwf tmr0 ;启动定时计数器
loop1 btfss intcon,2 ;检测TMR0溢出标志位
goto loop1 ;没有溢出,循环检测
bsf status,rp0 ;设置文件寄存器的体1
movf option_b,0 ;从备份寄存器中
movwf option_reg ;恢复选项寄存器的内容
bcf status,rp0 ;恢复文件寄存器的体0
return ;子程序的返回
;*********************************************
end ;通知汇编源程序结束
文章评论(0条评论)
登录后参与讨论