本文介绍了如何在按下按钮3次后创建一个程序点亮LED 30秒?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我的代码,我有很多研究,但我没有得到它!我把那些看起来模糊相似的东西组合在一起,但它们不会在一起!



; ********* ************************************************** ***************************************** 
;定义
; ******************************************** ************************************************** ******

列表P = PIC16F84A,R = D;定义PIC类型和基数
;(H =十六进制,D =十进制)。十六进制数字必须为
;形式为0xAA或0AAh
包括P16F84A.INC4; P16F84A.INC是包含
的文件; PIC寄存器的定义

; ******寄存器使用******

;对于PIC16C84,用户RAM从0Ch开始。以下定义
;(名称是任意的)将在许多程序中发挥作用。

count equ 0Ch;计数器寄存器
flag equ 0Dh; Counter Flag
msloop equ 0Eh;微秒延迟循环寄存器
tenloop equ 0Fh;十分之一秒延迟循环寄存器
secloop equ 10h;一秒延迟循环寄存器


; ************************ ************************************************** **************************
;矢量
; ******************************************** ************************************************** ******

; PIC16C84向量位于存储器底部(0000h-0007h)

org 0000h; PIC16C84的复位向量位于0000h
转到开始;转到主程序启动
org 0004h; PIC16C84的中断向量为0004h
转到inter;转到中断服务程序的开始
org 0008h;第一个位置可用于程序

; ****************************************** ************************************************** ********
; SUBROUTINES
; ******************************************** ************************************************** ******

;按照惯例,子程序放在向量之后,使得
;位于内存的底部。这避免了
的小型程序的内存库切换。


;给出1微秒延迟

onems movlw 248;将数字248移动到工作寄存器
movwf msloop;将数字从工作寄存器移到msloop
loop1 nop;用于填充
decfsz msloop,1;将msloop减少1,如果为零则跳过下一条指令
goto loop1;继续循环直到msloop达到零
nop;用于填充
返回

;给出0.1秒延迟

第十个movlw 100;将数字100移动到工作寄存器
movwf tenloop;移动数字从工作寄存器到tenloop
loop2调用onems;调用1微秒延迟子程序
decfsz tenloop,1;将tenloop减1,如果为零则跳过下一条指令
goto loop2;继续调用微秒延迟直到tenloop达到零
返回

;给出1秒延迟

sec movlw 10;将数字10移动到工作寄存器
movwf secloop; Moves从工作注册到tenloop的数字
loop3 call tenth;调用十分之一秒延迟子程序
decfsz secloop,1;将secloop减少1,如果为零则跳过下一条指令
转到loop3;继续调用0.1秒延迟直到secloop到达零
返回

;预设闪烁输出序列

outseq bsf PORTB,1;设置输出端口的第1位
call sec;调用一个第二个延迟子程序
bcf PORTB,1;清除输出端口的第1位
调用秒;调用一秒延迟子程序
转到outseq;继续闪存输出位1直到中断
返回


; ************************************ ************************************************** **************
;主程序
; ******************************************* ************************************************** *******

; ****** INITIALISATION ******

;在使用I / O端口之前,数据方向寄存器必须设置
; up。状态寄存器中的位RP0选择正常寄存器
;设置为0时,或者设置为1时的特殊寄存器。数据方向
;将TRISA和TRISB寄存在特殊寄存器组中。
中的'1';这些寄存器将相应的端口线设置为Input,并将
设置为'0',使相应的线成为输出。

start bsf STATUS,RP0;选择特殊寄存器设置

movlw b'11111';将PORTA上的每个引脚设置为输入
movwf TRISA
movlw b'00000000';将PORTA上的每个引脚设置为输出
movwf TRISB

bcf状态,RP0;选择正常寄存器设置


; ****** MAIN PROGRAM ******

;复位计数和标志寄存器和清除输出
clrf count;清除计数寄存器中的值
movlw b'00000000';将二进制值00000000复制到工作寄存器
movwf PORTB;将值从工作寄存器复制到输出端口
clrf标志;清除标志寄存器

;用标志计数
等待btfsc PORTA,0;测试输入端口的第0位跳过下一条指令,如果为零,则
转到;如果位0,则程序转到标签向上
bcf标志,0;清除第0位标志寄存器
转到等待
up btfsc flag,0
goto wait
bsf flag,0;设置标志寄存器的第0位
incf count ,1;计数值增加1

; EXOR计数寄存器100
movlw 100;将数字100移动到工作寄存器
xorwf count,0; EXOR计数数字在工作寄存器中
btfss STATUS,Z;检查状态位Z以查看工作寄存器中的所有位是否都设置为
goto wait
bsf PORTB,0;如果是EXOR,则设置输出端口的位0成功

; EXOR计数寄存器200
movlw 200;将数字200移动到工作寄存器
xorwf count,0; EXOR计数工作寄存器中的数字
btfss STATUS,Z;检查状态位Z以查看工作寄存器中的所有位是否都设置为
转到等待
调用outseq;调用输出序列

你能做些什么来帮助我?谢谢

解决方案



Below is my code, I have lots of research but I don't get it! I have cobined things that look vaguely similar but they won't go together!

;****************************************************************************************************
;					DEFINITIONS						     
;****************************************************************************************************
 
		list    P=PIC16F84A, R=D	;Define PIC type and radix
				;(H=Hex, D=Decimal). Hex numbers must
				;be of the form 0xAA or 0AAh
		include "P16F84A.INC"4	;P16F84A.INC is a file containing
				;definitions of PIC registers
 
;****** REGISTER USAGE ******
 
;For PIC16C84, user RAM starts at 0Ch. The following definitions
;(the names are arbitrary) will be found useful in many programs.
 
count   equ	0Ch		;Counter register
flag    equ    	0Dh		;Counter Flag
msloop	equ    	0Eh		;Microsecond delay loop register
tenloop	equ	0Fh		;Tenth of second delay loop register
secloop	equ	10h		;One Second delay loop register
 
 
;****************************************************************************************************
;					VECTORS							     
;****************************************************************************************************
 
;The PIC16C84 vectors live at the bottom of memory (0000h-0007h)
 
		org	0000h		;Reset vector for PIC16C84 is at 0000h
        	goto    start		;Go to main program start
		org	0004h		;Interrupt vector for PIC16C84 is at 0004h
		goto	inter		;Go to start of interrupt service routine
		org	0008h		;first location available to programs
 
;****************************************************************************************************
;					SUBROUTINES 						     
;****************************************************************************************************
 
;By convention, subroutines are placed after the vectors so that they
;are at the bottom of memory. This avoids memory bank-switching for
;small programs.
 
 
;Gives a 1 microsecond delay

onems	movlw	248		;Moves number 248 into the working register
	movwf	msloop		;Moves number from working register to msloop
loop1	nop			;Used for padding
	decfsz 	msloop,1	;Decrements msloop by 1, skips next instruction if zero
	goto    loop1		;Continues to loop until msloop reaches zero
	nop			;Used for padding
	return
 
;Gives a 0.1 Second Delay

tenth   movlw	100		;Moves number 100 into the working register
	movwf	tenloop		;Moves number from working register to tenloop
loop2	call	onems		;Calls the 1 microsecond delay subroutine
	decfsz	tenloop,1	;Decrements tenloop by 1, skips next instruction if zero
	goto	loop2		;Continues to call microsecond delay until tenloop reaches zero
	return
 
;Gives a 1 Second Delay

sec	movlw	10		;Moves number 10 into the working register
	movwf	secloop		;Moves number from working register to tenloop
loop3	call	tenth		;Calls the tenth of a second delay subroutine
	decfsz	secloop,1	;Decrements secloop by 1, skips next instruction if zero
	goto	loop3		;Continues to call 0.1 second delay until secloop reaches zero
	return

;Preset Flashing Output Sequence

outseq	bsf	PORTB,1		;Sets bit 1 of output port
	call	sec		;Calls the one second delay subroutine
	bcf	PORTB,1		;Clears bit 1 of output port
	call	sec		;Calls the one second delay subroutine
	goto	outseq		;Continues to flash output bit 1 until interrupted
	return
 
 
;****************************************************************************************************
;					MAIN PROGRAM						     
;****************************************************************************************************
 
;****** INITIALISATION ******
 
;Before using the I/O ports, the data direction registers must be set
;up. Bit RP0 in the status register selects either the normal register
;set when 0, or the special register set when 1. The data direction
;registers TRISA and TRISB live in the special register set. A '1' in
;these registers sets the corresponding port line to an Input, and a
;'0' makes the corresponding line an output.
 
start	bsf	STATUS,RP0		;Select special register set
 
		movlw	b'11111'	;Set every pin on PORTA to be an Input
		movwf	TRISA
		movlw	b'00000000'	;Set every pin on PORTA to be an Ouput
		movwf	TRISB
 
		bcf		STATUS,RP0	;Select normal register set
 

;****** MAIN PROGRAM ******
 
;Reset Count and Flag Registers and Clear Outputs
		clrf	count		;Clears value in count register
		movlw	b'00000000'	;Copies binary value 00000000 into working register
 		movwf	PORTB		;Copies value from working register to Output Port 
		clrf	flag		;Clear flag register

;Counting with a flag
wait	btfsc	PORTA,0			;Tests bit 0 of Input Port skips next instruction if zero 
		goto	up		;If bit 0 on then program goes to label up
		bcf	flag,0		;Clears bit 0 of the flag register
		goto	wait		
up		btfsc	flag,0		
		goto 	wait
		bsf	flag,0		;Sets bit 0 of the flag register
		incf	count,1		;Increments value in count by 1
	
;EXOR count register with 100
		movlw	100		;Moves number 100 into working register
		xorwf	count,0		;EXORs count with the number in the working register
		btfss 	STATUS,Z	;Checks Status Bit Z to see if all bits in working register are set
		goto	wait
		bsf	PORTB,0		;Sets bit 0 of Output Port if EXOR is successful

;EXOR count register with 200	
		movlw	200		;Moves number 200 into working register
		xorwf	count,0		;EXORs count with the number in the working register
		btfss 	STATUS,Z	;Checks Status Bit Z to see if all bits in working register are set		
		goto	wait
		call	outseq		;Calls ouput sequence 

What can you do to help me? Thanks

解决方案



这篇关于如何在按下按钮3次后创建一个程序点亮LED 30秒?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 09:57