Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 通过IR获取数字_Assembly_Binary_Pic_8 Bit - Fatal编程技术网

Assembly 通过IR获取数字

Assembly 通过IR获取数字,assembly,binary,pic,8-bit,Assembly,Binary,Pic,8 Bit,我在继续我在这里要做的事情上有点困难。我安装了一个红外接收器,只需检查输入信号,它就是这样做的。我用的是一个简单的遥控器,上面是0-9,显然是10个数字 这是我到目前为止的代码,它得到了传入的IR并注意到了它。我想解码它是什么号码。我知道每个数字都有一个不同的信号,我可以通过高电平和低电平0和1计算出按下的数字,但我如何将其转换成什么数字,并将其放在LCD上显示 代码如下: list p=16f690,r=dec ; set processor type, default

我在继续我在这里要做的事情上有点困难。我安装了一个红外接收器,只需检查输入信号,它就是这样做的。我用的是一个简单的遥控器,上面是0-9,显然是10个数字

这是我到目前为止的代码,它得到了传入的IR并注意到了它。我想解码它是什么号码。我知道每个数字都有一个不同的信号,我可以通过高电平和低电平0和1计算出按下的数字,但我如何将其转换成什么数字,并将其放在LCD上显示

代码如下:

        list p=16f690,r=dec     ; set processor type, default to base 10

#include    <p16f690.inc>           ; chip definitions
        errorlevel  -302        ; bank warnings on +302 off -302
        __CONFIG    (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF 
        & _MCLRE_OFF &    _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

#define     IR_PORT PORTA           ; IR receiver
#define     IR      2               ; IR receiver on RA2
#define     SWITCH  3               ; switch on RA3
#define     LED_0   0               ; LED on RC0
#define     LED_1   1               ; LED on RC1
#define     LED_2   2               ; LED on RC2
#define     LED_3   3               ; LED on RC3
#define     READY   0               ; READY bit

BANK_0      UDATA   0x20            ; bank_0
BANK_0      RES     1               ; variable used for bank switching
state       RES     1               ; state bits
bitcount    RES     1               ; number of bits seen so far
buffer      RES     20              ; the bits

SHARED      UDATA_SHR               ; shared across all banks
w_temp      RES     1               ; variable used for context saving 
status_temp RES     1               ; variable used for context saving
pclath_temp RES     1               ; variable used for context saving

RESET_VECTOR    CODE    0x000       ; processor reset vector location
    goto    main                ; go to beginning of program

INT_VECTOR      CODE    0x004       ; interrupt vector location
    goto    interrupt           ; go to the interrupt service routine

MAIN            CODE    0x005       ; address after vectors
interrupt:                          ; interrupt service routine
    movwf   w_temp              ; save off current W register contents
    movf    STATUS,w            ; move status register into W register
    movwf   status_temp         ; save off contents of STATUS register
    movf    PCLATH,w            ; move pclath register into W register
    movwf   pclath_temp         ; save off contents of PCLATH register
lowedge:                            ; let's check RA2
    btfss   INTCON,INTF         ; check for type of interrupt = RA2
    goto    timercheck          ; not RA2
    bcf     INTCON,INTF         ; ack the interrupt
    movf    TMR0,w              ; get the value
    movwf   INDF                ; store in buffer
    incf    FSR,f               ; bump the pointer
    incf    bitcount,f          ; count the bit
    movf    bitcount,w          ; pick up the count
    sublw   18                  ; got all the bits?
    btfss   STATUS,Z            ; check
    goto    goon                ; continue
    bsf     state,READY         ; it is
    bcf     INTCON,INTE         ; turn off RA2 interrupts for now
    bcf     INTCON,GIE
goon:                               ; go on
    movlw   200                 ; prepare
    movwf   TMR0                ; timeout
    bcf     INTCON,T0IF         ; clear the interrupt flag
    bsf     INTCON,T0IE         ; enable timer 0 interrupts
    goto    eoi                 ; we're done
timercheck:
    btfss   INTCON,T0IF         ; check for type of interrupt = TMR0
    goto    eoi                 ; is it an alien attack?
    bcf     INTCON,T0IF         ; ack the interrupt
    clrf    bitcount            ; clear the bitcount
    bcf     state,READY         ; clear just in case
    movlw   buffer              ; point at
    movwf   FSR                 ; start of buffer
    bcf     INTCON,T0IE         ; disable timer 0 interrupts
    BANKSEL BANK_0              ; bank 0
    comf    PORTC,f             ; flip the leds
    bcf     INTCON,T0IF         ; ack the interrupt
eoi:                                ; end of interrupt
    BANKSEL BANK_0              ; bank 0
    movf    pclath_temp,w       ; retrieve copy of PCLATH register
    movwf   PCLATH              ; restore pre-isr PCLATH register contents
    movf    status_temp,w       ; retrieve copy of STATUS register
    movwf   STATUS              ; restore pre-isr STATUS register contents
    swapf   w_temp,f            ; restore pre-isr W register contents
    swapf   w_temp,w            ; (swapf doesn't affect the flags)
    retfie                      ; return from interrupt

main:                               ; main code
    BANKSEL OSCCON              ; bank 1
    movlw   0x10                ; system clock = 125 kHz
    movwf   OSCCON              ; instruction clock = 7750 Hz, 32uS/instruction
    BANKSEL PORTA               ; bank 0
    clrf    PORTA               ; init PORTA
    BANKSEL ANSEL               ; bank 2
    clrf    ANSEL               ; digital I/O
    clrf    ANSELH              ; digital I/O
    BANKSEL TRISA               ; bank 1
    movlw   0xff                ; init PORTA
    movwf   TRISA               ; as inputs
    BANKSEL PORTC               ; bank 0
    clrf    PORTC               ; init PORTC as outputs
    BANKSEL TRISC               ; bank 1
    movlw   0xf0                ; set RC<7:4> as inputs
    movwf   TRISC               ; set RC<3:0> as outputs
    BANKSEL PORTC               ; bank 0
    movlw   0x09                ; init the
    movwf   PORTC               ;   leds
    clrwdt                      ; clear WDT and prescaler
    BANKSEL OPTION_REG          ; bank 1
    movlw   b'11110000'         ; mask TMR0 select and
    andwf   OPTION_REG,W        ;   prescaler bits
    iorlw   b'00000010'         ; set prescale to
    movwf   OPTION_REG          ;   1:n
    bcf     OPTION_REG,T0CS     ; make it a timer
    bcf     OPTION_REG,INTEDG   ; select the falling edge of RA2
    BANKSEL TMR0                ; bank 0
    clrf    TMR0                ; clear the count
    BANKSEL INTCON              ; bank 0
    bcf     INTCON,T0IF         ; clear pending timer 0 interrupts
    bcf     INTCON,T0IE         ; disallow timer 0 interrupts for now
    bsf     INTCON,INTE         ; enable RA2 interrupts
    BANKSEL BANK_0              ; bank 0
    bcf     state,READY         ; clear the ready bit
    clrf    bitcount            ; we have seen no bits
    movlw   buffer              ; point at
    movwf   FSR                 ; start of buffer
    bsf     INTCON,GIE          ; enable global interrupts
    BANKSEL BANK_0              ; bank 0
forever:                            ; stay here forever
    btfss   state,READY         ; check for IR Code ready
    goto    forever             ; go check again
dobits:                             ; process ir code
    BANKSEL BANK_0              ; bank 0

    bcf     state,READY         ; clear the ready bit
    clrf    bitcount            ; we have seen no bits
    movlw   buffer              ; point at
    movwf   FSR                 ; start of buffer
    bsf     INTCON,INTE         ; enable RA2 interrupts
    bsf     INTCON,GIE          ; enable global interrupts
    goto    forever             ; keep doing it

EE              CODE    0x2100  ;   eeprom
    DE      'J', 'A', 'S', 'O', 'N', 0

    END
list p=16f690,r=dec;设置处理器类型,默认为以10为基数
#包括,;芯片定义
错误级别-302;气缸组警告打开+302关闭-302
__配置(\u INTRC\u OSC\u NOCLKOUT和\u WDT\u OFF和\u PWRTE\u OFF
&MCLRE关闭和CP关闭和CPD关闭和BOR关闭和IESO关闭和FCMEN关闭)
#定义IR_端口端口;红外接收器
#定义IR 2;RA2红外接收机
#定义开关3;打开RA3
#定义LED_0;RC0上的LED
#定义LED_1;RC1上的LED
#定义LED_2;RC2上的LED
#定义LED_3;RC3上的LED
#定义就绪0;现成钻头
银行0 UDATA 0x20;银行0
世界银行1号决议;用于银行转换的变量
国家决议1;状态位
比特数res1;到目前为止看到的位数
缓冲区20;零碎
共享数据;所有银行共享
w_临时资源1;用于上下文保存的变量
状态1;用于上下文保存的变量
pclath_temp RES 1;用于上下文保存的变量
重置向量代码0x000;处理器重置向量位置
后藤大街;转到程序的开头
INT_矢量代码0x004;中断向量定位
转到中断;转到中断服务程序
主代码0x005;向量后的地址
中断:;中断服务程序
movwf w_temp;保存当前W寄存器内容
movf状态,w;将状态寄存器移到W寄存器中
movwf状态\温度;保存状态寄存器的内容
movf-PCLATH,w;将pclath寄存器移到W寄存器中
movwf平面温度;保存PCLATH寄存器的内容
洛威奇:;让我们检查一下RA2
btfss INTCON、INTF;检查中断类型=RA2
转到timercheck;不是RA2
bcf INTCON,INTF;确认中断
movf-TMR0,w;获取值
movwf-INDF;缓冲存储
incf-FSR,f;碰一下指针
incf位计数,f;数一数
movf比特计数,w;数一数
亚群18;有所有的碎片吗?
btfss状态,Z;检查
后藤关;持续
bsf状态,就绪;它是
bcf INTCON,INTE;暂时关闭RA2中断
bcf国际公司
傻瓜:;继续
movlw 200;准备
movwf-TMR0;超时
bcf INTCON,T0IF;清除中断标志
bsf INTCON,T0IE;启用计时器0中断
后藤平等机会;我们结束了
时间检查:
btfss INTCON,T0IF;检查中断类型=TMR0
后藤平等机会;是外星人攻击吗?
bcf INTCON,T0IF;确认中断
clrf位计数;清除位计数
bcf状态,就绪;以防万一
movlw缓冲器;指向
movwf-FSR;缓冲区开始
bcf国际公司,T0IE;禁用计时器0中断
班克塞尔银行(BANKSEL BANK_0),;银行0
comf PORTC,f;翻转LED
bcf INTCON,T0IF;确认中断
eoi:;中断结束
班克塞尔银行(BANKSEL BANK_0),;银行0
movf pclath_温度,w;检索PCLATH寄存器的副本
movwf-PCLATH;恢复isr前PCLATH寄存器内容
movf状态_温度,w;检索状态寄存器的副本
movwf状态;恢复isr前状态寄存器内容
swapf w_temp,f;恢复isr之前的W寄存器内容
swapf w_temp,w;(swapf不影响标志)
雷特菲;中断返回
主要:;主代码
班克塞尔振荡器;第一银行
movlw 0x10;系统时钟=125 kHz
movwf-OSCCON;指令时钟=7750 Hz,32uS/指令
班克塞尔港;银行0
clrf门;初始端口
班克塞尔·安塞尔;银行2
安塞尔;数字I/O
clrf-ANSELH;数字I/O
班克塞尔·特里萨;第一银行
movlw-0xff;初始端口
movwf-TRISA;作为输入
班克塞尔港;银行0
clrf端口C;初始化端口C作为输出
班克塞尔三色;第一银行
movlw 0xf0;将RC设置为输入
movwf-TRISC;将RC设置为输出
班克塞尔港;银行0
movlw 0x09;初始化
movwf-PORTC;发光二极管
clrwdt;清除WDT和预分频器
班克塞尔期权;第一银行
movlw b'11110000';屏蔽TMR0选择和
和WF选项_REG,W;预分频器