📄 jsv1.0.asm
字号:
;2005.10.10
.include "m8def.inc"
.equ start=$a4 ;开始控制字
.equ stop=$94 ;停止控制字
.equ ack=$c4 ;应答控制字
.equ nack=$84 ;无应答控制字
.dseg
ch: .byte 1 ;频道号缓存
mhzh: .byte 1 ;接收频率字缓存H
mhzl: .byte 1 ;接收频率字缓存L
lcdadd: .byte 1 ;提示代码储存地址
mode: .byte 1 ;模式控制字
keyno1: .byte 1 ;按键次数缓存
keyda: .byte 1 ;按键值
fradd: .byte 1 ;频率扫描速度因子
.cseg
.org $000
rjmp reset
.org $013
reset: ldi r31,high(RAMEND)
out sph,r31
ldi r31,low(RAMEND)
out spl,r31
ldi r16,$00
out ddrb,r16 ;PB口设为输入
ldi r16,$ff
out portb,r16 ;PB口打开上拉
out ddrd,r16 ;PD口为输出(LCD数据)
ldi r16,$3f
out ddrc,r16 ;PC口为输出(I2C+LCD控制)
ldi r16,$30
out portc,r16 ;PC口5、4位上拉(I2C)
ldi r16,$04
out twcr,r16 ;I2C使能
ldi r16,200
out twbr,r16 ;I2C分频系数
ldi r16,$3c ;液晶显示器初始化
call wcom
ldi r16,$0e
call wcom
ldi r16,$06
call wcom
ldi r16,$01
call wcom
;****************************************************************
s1: clr r16 ;开机频道为0,模式为0
sts ch,r16 ;频道号送入缓存
sts mode,r16 ;模式号送入缓存
s4: call mhss ;根据频道号读频率字15H,14H
sts mhzl,r14 ;将频率字低字节送入缓存
ldi r16,$7f
and r15,r16
sts mhzh,r15 ;将频率字高字节送入缓存
s6: call lcd16 ;显示频道信息
call i2cwr ;将频率字送入接收机
s5: call lcd32 ;显示提示信息
s2: call key
ldi r31,high(S3)
ldi r30,low(S3)
lds r16,mode
ldi r17,3
cp r16,r17
brlo s7
clr r18
sts mode,r18
s7: mul r16,r17
lds r16,keyda
cp r16,r17
brsh s2
add r16,r0
clr r17
add r30,r16
adc r31,r17
ijmp
S3: rjmp K1
rjmp K2
rjmp K3
rjmp K4
rjmp K5
rjmp K6
rjmp K7
rjmp k8
rjmp K9
;***********************************************
; 接收频道加1
;***********************************************
K1: lds r17,ch ;频道加1
inc r17
cpi r17,100
brlo k1a
clr r17
k1a: sts ch,r17
rjmp S4
;***************************************************
; 接收频道减1
;***************************************************
K2: lds r17,ch ;频道减1
dec r17
cpi r17,100
brlo k2a
ldi r17,99
k2a: sts ch,r17
rjmp S4
;****************************************************
; 切换为模式2
;****************************************************
K3: ldi r17,1
sts mode,r17
rjmp S6
;****************************************************
; 接收频率加1
;****************************************************
K4: lds r19,mhzh ;频率值加1
lds r18,mhzl
ldi r16,$1
clr r17
add r18,r16
adc r19,r17
cpi r19,$80
brlo k4a
ldi r19,$0d
clr r18
k4a: sts mhzh,r19
sts mhzl,r18
rjmp S6
;*****************************************************
; 接收频率减1
;*****************************************************
K5: lds r19,mhzh ;频率值减1
lds r18,mhzl
ldi r16,$1
clr r17
sub r18,r16
sbc r19,r17
cpi r19,$0d
brsh k5a
ldi r19,$7f
ser r18
k5a: sts mhzh,r19
sts mhzl,r18
rjmp S6
;********************************************************
; 切换为模式3,如频率值有变可保存,可改变保存位置
;*********************************************************
k6y: clr r17
sts fradd,r17
lds r17,mode
inc r17
cpi r17,3
brlo k6y1
clr r17
k6y1: sts mode,r17
rjmp S6
k6: call mhss ;根据频道号读频率字15h,14h
lds r19,mhzh
lds r18,mhzl
cp r14,r18
cpc r15,r19
breq k6y ;比较频率值是否变化,没有变化退出
ldi r16,$60
sts lcdadd,r16
call lcd32 ;提示是否保存新值
k6a: call key
ldi r31,high(k6b)
ldi r30,low(k6b)
lds r16,keyda
clr r17
add r30,r16
adc r31,r17
ijmp
k6b: rjmp k6c
rjmp s4
rjmp s6
k6c: ldi r16,$70 ;+键确认须保存并显示提示
sts lcdadd,r16
call lcd32
k6h: call key
ldi r31,high(k6d)
ldi r30,low(k6d)
lds r16,keyda
clr r17
add r30,r16
adc r31,r17
ijmp
k6d: rjmp k6f
rjmp k6g
rjmp k6e
k6e: sbic eecr,eewe ;保存原频道号频率新值
rjmp k6e
clr r17
out eearh,r17
lds r17,ch
lsl r17
out eearl,r17
lds r18,mhzl
out eedr,r18 ;保存低字节
sbi eecr,eemwe
sbi eecr,eewe
k6e1: sbic eecr,eewe
rjmp k6e1
inc r17
out eearl,r17
lds r19,mhzh
out eedr,r19 ;保存高字节
sbi eecr,eemwe
sbi eecr,eewe
rjmp s6
k6f: lds r17,ch ;+键 频道加1
inc r17
cpi r17,100
brlo k6f1
clr r17
k6f1: sts ch,r17
call lcd16
rjmp k6h ;返回键检测
k6g: lds r17,ch ;-键 频道-1
dec r17
cpi r17,100
brlo k6g1
ldi r17,99
k6g1: sts ch,r17
call lcd16
rjmp k6h ;返回键检测
;**********************************************************
; 接收频率向上扫描,可停止,加速或减速扫描
;************************************************************
k7e: in r16,pinb
ori r16,$f1
cpi r16,$ff
brne k7e ;等待按键放开
k7: lds r17,fradd
ldi r16,125
add r17,r16
k7a: in r16,pinb ;检查是否有键按下
ori r16,$f1
cpi r16,$ff
breq k7c ;无键返回扫描
call yss ;廷时去抖动
in r16,pinb
ori r16,$f1
cpi r16,$ff
breq k7c ;干扰返回扫描
sbis pinb,3
rjmp s5 ;确定键退出
sbis pinb,1
rjmp k7d ;-键 减速扫描
sbic pinb,2
rjmp k7c ;无效键返回扫描
lds r16,fradd ;+键 加速扫描
subi r16,12
sts fradd,r16
rjmp k7e
k7d: lds r16,fradd ;-键 减速扫描
subi r16,-12
sts fradd,r16
rjmp k7e
k7c: call yss
dec r17
brne k7a
lds r19,mhzh ;频率值加1
lds r18,mhzl
ldi r16,$1
clr r17
add r18,r16
adc r19,r17
cpi r19,$80
brlo k7b
ldi r19,$0d
clr r18
k7b: sts mhzh,r19
sts mhzl,r18
call lcd16
call i2cwr
call lcd32
rjmp k7
;**********************************************************
; 接收频率向下扫描,可停止,加速或减速扫描
;************************************************************
k8e: in r16,pinb
ori r16,$f1
cpi r16,$ff
brne k8e ;等待按键放开
k8: lds r17,fradd
ldi r16,125
add r17,r16
k8a: in r16,pinb ;检查是否有键按下
ori r16,$f1
cpi r16,$ff
breq k8c ;无键返回扫描
call yss ;廷时去抖动
in r16,pinb
ori r16,$f1
cpi r16,$ff
breq k8c ;干扰返回扫描
sbis pinb,3
rjmp s5 ;确定键退出
sbis pinb,1
rjmp k8d ;-键 减速扫描
sbic pinb,2
rjmp k8c ;无效键返回扫描
lds r16,fradd ;+键 加速扫描
subi r16,12
sts fradd,r16
rjmp k8e
k8d: lds r16,fradd ;-键 减速扫描
subi r16,-12
sts fradd,r16
rjmp k8e
k8c: call yss
dec r17
brne k8a
lds r19,mhzh ;频率值减1
lds r18,mhzl
ldi r16,$1
clr r17
sub r18,r16
sbc r19,r17
cpi r19,$0d
brlo k8b
ldi r19,$0d
clr r18
k8b: sts mhzh,r19
sts mhzl,r18
call lcd16
call i2cwr
call lcd32
rjmp k8
;********************************************************
; 切换为模式1,如频率值有变可保存,可改变保存位置
;*********************************************************
k9: rjmp k6
;*********************************************************************
;
;*********************************************************************
; 根据频道号读频率字15h,14h
;*********************************************************************
mhss: push r17
push r18
mhss1: sbic eecr,eewe ;根据频道读已存频率低字节
rjmp mhss1
clr r17
out eearh,r17
lds r18,ch
lsl r18
out eearl,r18
sbi eecr,eere
in r14,eedr
inc r18
mhss2: sbic eecr,eewe ;根据频道读已存频率高字节
rjmp mhss2
out eearl,r18
sbi eecr,eere
in r15,eedr
mov r17,r15
cpi r17,$0d
brsh mhss3
mhss4: sbic eecr,eewe ;保存原频道号频率新值
rjmp mhss4
ldi r17,$0d ;保存高字节
mov r15,r17
out eedr,r17
sbi eecr,eemwe
sbi eecr,eewe
mhss5: sbic eecr,eewe
rjmp mhss5
dec r18 ;保存低字节
out eearl,r18
clr r17
mov r14,r17
out eedr,r17
sbi eecr,eemwe
sbi eecr,eewe
mhss3: pop r18
pop r17
ret
;**********************************************************************
;**********************************************************************
; 写一个命令(r16)到LCD
;**********************************************************************
wcom: cbi ddrd,7 ;设为读命令状态
sbi portd,7
cbi portc,2
sbi portc,1
sbi portc,0
nop
wcom1: sbic pind,7 ;检查忙状态
rjmp wcom1
cbi portc,0 ;设为写命令状态
cbi portd,7
sbi ddrd,7
cbi portc,1
out portd,r16
sbi portc,0
nop
nop
nop
cbi portc,0
ret
;***********************************************************************
;***********************************************************************
; 写一个数据(r16)到LCD
;***********************************************************************
wdata: cbi ddrd,7 ;设为读命令状态
sbi portd,7
cbi portc,2
sbi portc,1
sbi portc,0
nop
wdata1: sbic pind,7 ;检查忙状态
rjmp wdata1
cbi portc,0 ;设为写数据状态
cbi portd,7
sbi ddrd,7
sbi portc,2
cbi portc,1
out portd,r16
sbi portc,0
nop
nop
nop
cbi portc,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -