📄 74as.asm
字号:
#include <p16f74.inc>
udata 0x0020
input res 1
ctrlword res 1
count res 1 ;计数用
count1 res 1
count2 res 1
w_temp res 1
status_temp res 1
bufferx2 res 1 ;触摸屏数据接收缓冲
bufferx1 res 1
buffery2 res 1
buffery1 res 1
modeaddress res 1 ;视频解码模块寄存器控制
selectaddress res 1
selectvalue res 1
shipinaddress res 1
shipinvalue res 1
tmr0_temp res 1
irvalue res 1
datax equ 0x78 ;初始控制解码芯片
controlx equ 0xd0 ;ADS7846控制字
controly equ 0x90
timevalue equ 0x05
#define MODE .32 ;LRS5752控制液晶显示的较好值
#define PICTURE .16
#define COLOR .148
#define TINT .158
#define PHASE .44
#define CONTVIDEO .161
#define CONTRGB1 .0
#define CONTRGB2 .1
#define GAMMA1 .145
#define GAMMA2 .160
#define RGBAMP .89
#define BRIGHT .185
#define SUBBRIGHT_R .139
#define SUBBRIGHT_B .140
#define COM_AMP .132
#define COM_DC .100
#define DACOUT .163
data_tx macro address,value
banksel PORTC;写入LRS5752各寄存器的合适值
bcf PORTC,1
;writeaddress
movlw address
movwf input
movlw 8
movwf count
movlw 0xff
andwf input,1 ;使用GPIO的方法,将RC3作为时钟输入,RC4作为数据输入(并口模拟串口的方法)
btfsc input,0 ;上升沿触发
bsf PORTC,4
bcf PORTC,4
bcf PORTC,3
nop
bsf PORTC,3
nop
rrf input,1
decfsz count,1
goto $-.11
;writevalue
movlw value
movwf input
movlw 8
movwf count
movlw 0xff
andwf input,1
btfsc input,0
bsf PORTC,4
bcf PORTC,4
bcf PORTC,3
nop
bsf PORTC,3
nop
rrf input,1
decfsz count,1
goto $-.11
bsf PORTC,1
endm
data_select macro ;按键选择,输入选择寄存器和相应的值
banksel PORTC
bcf PORTC,1
;writeaddress
movf shipinaddress,w
movwf input
movlw 8
movwf count
movlw 0xff
andwf input,1
btfsc input,0
bsf PORTC,4
bcf PORTC,4
bcf PORTC,3
nop
bsf PORTC,3
nop
rrf input,1
decfsz count,1
goto $-.11
;writevalue
movf shipinvalue,w
movwf input
movlw 8
movwf count
movlw 0xff
andwf input,1
btfsc input,0
bsf PORTC,4
bcf PORTC,4
bcf PORTC,3
nop
bsf PORTC,3
nop
rrf input,1
decfsz count,1
goto $-.11
bsf PORTC,1
endm
push macro
movwf w_temp
movf STATUS,w
movwf status_temp
endm
pop macro
movf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
endm
gettouchvalue macro controlvalue,storeone,storetwo
movlw controlvalue
movwf ctrlword
movlw 8
movwf count
;LOOP1 ;input controlword
movlw 0xff
andwf ctrlword,1 ;同样用GPIO的方法进行ADS7846控制字的写入
btfsc ctrlword,7 ;得到触摸屏的x值和y值,特别要注意时序问题
bsf PORTC,4
bcf PORTC,4
bcf PORTC,3
nop
bsf PORTC,3 ;上升沿触发
nop
rlf input,1
decfsz count,1
goto $-.11
clrf storetwo
banksel TRISC
bsf TRISC,5
;wait
banksel PORTB
btfsc PORTB,1
goto $-.1
movlw 4
movwf count
;coutinue1
rlf storetwo,1
bsf PORTC,3
nop
bcf PORTC,3 ;下降沿触发
nop
btfsc PORTC,5
incf storetwo,1
decfsz count,1
goto $-.8
movlw 8
movwf count
;coutinue2
rlf storeone,1
bsf PORTC,3
nop
bcf PORTC,3
nop
btfsc PORTC,5
incf storeone,1
decfsz count,1
goto $-.8
endm
RST code 0x00
nop
clrf PCLATH
;pagesel start
goto start
nop
goto ISR
PGM code
start
banksel TRISC ;初始化,配置一些寄存器
clrf TRISC
banksel SSPCON
bcf SSPCON,SSPEN
banksel T1CON
bcf T1CON,TMR1ON
banksel TMR0
movlw timevalue
movwf TMR0
banksel INTCON
clrf INTCON
bsf INTCON,GIE
bcf INTCON,INTF
bcf INTCON,T0IF
bcf INTCON,RBIF
bsf INTCON,INTE ;允许INT中断
bsf INTCON,T0IE ;允许TIMER0中断
bsf INTCON,RBIE ;允许RB中断
banksel OPTION_REG
clrf OPTION_REG
banksel TRISB
bcf TRISB,2
bcf TRISB,3
bsf TRISB,1
bsf TRISB,7
banksel PORTB
bsf PORTB,2
bcf PORTB,3
banksel TRISA
movlw 0xff
movwf TRISA
banksel TRISD
bcf TRISD,1
banksel PORTC
bsf PORTC,1
bsf PORTC,0
banksel PORTD
bsf PORTD,1
movlw datax ;对LRS5752进行初始化 datax=0x78
movwf input
movlw 8
movwf count
LOOP ;初始化解码芯片
movlw 0xff
andwf input,1
btfsc input,0
bsf PORTC,4
bcf PORTC,4
bcf PORTC,3
nop
bsf PORTC,3
nop
rrf input,1
decfsz count,1
goto LOOP
bcf PORTC,0
data_tx 0x60,MODE ;写寄存器的值
data_tx 0x61,PICTURE
data_tx 0x62,COLOR
data_tx 0x63,TINT
data_tx 0x64,PHASE
data_tx 0x65,CONTVIDEO
data_tx 0x66,CONTRGB1
data_tx 0x67,CONTRGB2
data_tx 0x68,GAMMA1
data_tx 0x69,GAMMA2
data_tx 0x6a,RGBAMP
data_tx 0x6b,BRIGHT
data_tx 0x6c,SUBBRIGHT_R
data_tx 0x6d,SUBBRIGHT_B
data_tx 0x6e,COM_AMP
data_tx 0x6f,COM_DC
data_tx 0x70,DACOUT
movlw 0x50 ;0x50-0x52作为模式选择的储存值
movwf FSR ;存取值分别为0x20,0x21,0x23,进行PAL,NTSC,自动检测之间的转换
movlw 0x20
movwf INDF
incf FSR,1
movlw 0x21
movwf INDF
incf FSR,1
movlw 0x23
movwf INDF
movlw 0x60 ;0x60-0x67作为用户选择的存储值,调整PICTURE,COLOR,BRIGHT,COMAMPITUDE四种因素
movwf FSR ;需要的话可再增加
movlw 0x61 ;先是地址值,然后是对应的写入值
movwf INDF
incf FSR,1
movlw PICTURE
movwf INDF
incf FSR,1
movlw 0x62
movwf INDF
incf FSR,1
movlw COLOR
movwf INDF
incf FSR,1
movlw 0x6b
movwf INDF
incf FSR,1
movlw BRIGHT
movwf INDF
incf FSR,1
movlw 0x6e
movwf INDF
incf FSR,1
movlw COM_AMP
movwf INDF
incf FSR,1
movlw 0x50
movwf modeaddress
movlw 0x60
movwf selectaddress
movlw 0x61
movwf selectvalue
goto $
ISR
nop
nop
banksel INTCON ;中断程序
btfss INTCON,INTF ;是否为INT中断
goto step1
goto intservice
step1
btfss INTCON,T0IF ;是否为定时器中断
goto step2
goto timersevice
step2
btfss INTCON,RBIF ;是否为RB中断
goto $
goto irservice
intservice
bcf INTCON,INTF ;判断为INT中断
push
call delay
banksel PORTB
bcf PORTB,2
gettouchvalue controlx,bufferx1,bufferx2
gettouchvalue controly,buffery1,buffery2
nop
nop
call delay
bsf PORTB,2 ;晶振为4MHz
banksel TRISC ;将触摸屏的值传送出去
movwf 0x80
movwf TRISC ; TX/RX口输入输出配置
banksel SPBRG
movlw D'24' ; 十进制的24
movwf SPBRG ; 大约9600 BPS/ 10MHZ
banksel TXSTA
clrf TXSTA
bsf TXSTA,BRGH ; HIGH SPEED/ASYN/8BITS
bsf TXSTA,TXEN
banksel RCSTA
bsf RCSTA,SPEN
banksel TXREG
movf bufferx2,w ;共12位,先传高4位,再传低8位
movwf TXREG
call TXPOLL
movf bufferx1,w
movwf TXREG
call TXPOLL
movf buffery2,w
movwf TXREG
call TXPOLL
movf buffery1,w
movwf TXREG
call TXPOLL ;中断返回
nop
nop
pop
retfie
TXPOLL
bsf STATUS,RP0
TLOOP
btfss TXSTA,TRMT ;发送完成
goto TLOOP
bcf STATUS,RP0
return
timersevice ;定时器中断,轮询4个按键,看哪个按下,并进行相应的处理
push
banksel PORTA
btfss PORTA,5
goto judge1
goto modeselect
modeselect ;模式选择,RA5按下
call delay
banksel modeaddress
incf modeaddress,1
movf modeaddress,w
sublw 0x52
btfsc STATUS,C
call recoveraddress1
movlw 0x60
movwf shipinaddress
movf modeaddress,w
movwf shipinvalue
data_select
goto recovertimer
recoveraddress1
movlw 0x50
movwf modeaddress
return
judge1 ;用户菜单选择,RA0按下
banksel PORTA
btfss PORTA,0
goto judge2
goto menuselect
menuselect
call delay
movlw .2
addwf selectaddress,1
addwf selectvalue,1
movf selectaddress,w
sublw 0x66
btfsc STATUS,C
call recoveraddress2
goto recovertimer
recoveraddress2
movlw 0x60
movwf selectaddress
movlw 0x61
movwf selectvalue
return
judge2
banksel PORTA ;数值增加,RA2按下
btfss PORTA,2
goto judge3
goto incresing
incresing
call delay
movf selectvalue,w
addlw .2
movwf selectvalue
movwf shipinvalue
movf selectaddress,w
movwf shipinaddress
data_select
goto recovertimer
judge3
banksel PORTA ;数值减小,RA1按下
btfsc PORTA,1
goto decresing
goto recovertimer
decresing
call delay
movf selectvalue,w
sublw .2
movwf selectvalue
movwf shipinvalue
movf selectaddress,w
movwf shipinaddress
data_select
goto recovertimer
recovertimer ;定时器中断返回
banksel TMR0
movlw timevalue
movwf TMR0
banksel INTCON
bcf INTCON,T0IF
pop
retfie
delay ;延时去抖动,但按键的释放?
movlw .100
movwf count
goon1 nop
decfsz count,1
goto goon1
return
irservice ;IR中断处理
banksel INTCON
bcf INTCON,RBIF
bcf INTCON,T0IE ;关定时器
bcf INTCON,RBIE ;RB输入
movf TMR0,w ;保存TMR0
movwf tmr0_temp
push
call delay4.6ms
movlw 4
movf count2,w
movlw 0x70
movwf FSR
read4datas
clrf irvalue
movlw 8
movwf count
readdata
banksel PORTB
btfss PORTB,7 ;等待高电平
goto $-.1
call delay0.882ms
btfsc PORTB,7
call delay1ms
rlf irvalue,1
decfsz count,1
goto readdata
goto storedata
storedata
movf irvalue,w
movwf INDF
incf FSR,1
decfsz count2,1
goto read4datas
goto check
check ;校验系统码是否相等,资料码和资料反码之和为0xff
movf 0x70,w
subwf 0x71,0
banksel STATUS
btfss STATUS,Z
goto irreturn
movf 0x72,w
addwf 0x73,0
sublw 0xff
btfss STATUS,Z
goto irreturn
goto irdatatx
irdatatx
banksel TRISC
movwf 0x80
movwf TRISC
banksel SPBRG
movlw D'64' ; 十进制的64
movwf SPBRG ; 大约9600 BPS/ 10MHZ
banksel TXSTA
clrf TXSTA
bsf TXSTA,BRGH ; HIGH SPEED/ASYN/8BITS
bsf TXSTA,TXEN
banksel TXREG ;传送IR资料码
movf 0x72,w
movwf TXREG
call irTXPOLL
goto irreturn
irTXPOLL
bsf STATUS,RP0
irTLOOP
btfss TXSTA,TRMT
goto irTLOOP
bcf STATUS,RP0
return
irreturn
banksel INTCON ;中断返回
bsf INTCON,T0IE
bsf INTCON,RBIE
movf tmr0_temp,w
movwf TMR0
pop
retfie
delay1ms ;2778
banksel irvalue
incf irvalue,1
movlw .16
movwf count2
counter1 movlw .174
movwf count
goon4 nop
decfsz count,1
goto goon4
decfsz count2,1
goto counter1
return
delay0.882ms ;2450
movlw .49
movwf count2
counter2 movlw .50
movwf count
goon3 nop
decfsz count,1
goto goon3
decfsz count2,1
goto counter2
return
delay4.6ms ;12778
movlw .68
movwf count2
counter3 movlw .188
movwf count
goon2 nop
decfsz count,1
goto goon2
decfsz count2,1
goto counter2
return
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -