Assembly 通过IR获取数字
我在继续我在这里要做的事情上有点困难。我安装了一个红外接收器,只需检查输入信号,它就是这样做的。我用的是一个简单的遥控器,上面是0-9,显然是10个数字 这是我到目前为止的代码,它得到了传入的IR并注意到了它。我想解码它是什么号码。我知道每个数字都有一个不同的信号,我可以通过高电平和低电平0和1计算出按下的数字,但我如何将其转换成什么数字,并将其放在LCD上显示 代码如下: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
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;预分频器