原创 PIC单片机

2008-1-9 13:16 3169 4 4 分类: 工业电子

;*******************************
;<<单键循环切换方波信号发生器>>程序
;文件名为 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                             ;通知汇编源程序结束

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条