📄 jsv1.0.asm
字号:
ret
;************************************************************************
;************************************************************************
; 显示上一行
;************************************************************************
lcd16: push r14
push r15
push r16
push r17
push r18
push r19
push r20
ldi r16,$2
call wcom
ldi r16,'C'
call wdata
ldi r16,'H'
call wdata
lds r17,ch
call b8td2
ldi r20,$30
add r16,r20
call wdata
mov r16,r17
add r16,r20
call wdata
ldi r16,$20
call wdata
call wdata
call wdata
lds r17,mhzh
lds r16,mhzl
clr r19
ldi r18,40
call div16u
call b16td5
mov r13,r16
ldi r20,$30
cpi r19,0
brne lcdp2
ldi r16,$20
call wdata
cpi r18,0
brne lcdp3
ldi r16,$20
call wdata
cpi r17,0
brne lcdp4
ldi r16,$20
call wdata
rjmp lcdp5
lcdp2: add r19,r20
mov r16,r19
call wdata
lcdp3: add r18,r20
mov r16,r18
call wdata
lcdp4: add r17,r20
mov r16,r17
call wdata
lcdp5: add r13,r20
mov r16,r13
call wdata
ldi r16,'.'
call wdata
;余数乘10除40取小数1
mov r16,r14
ldi r17,10
call mpy8u
mov r16,r17
mov r17,r18
clr r19
ldi r18,40
call div16u
ldi r17,$30
add r16,r17
call wdata
;余数乘10除40取小数2
mov r16,r14
ldi r17,10
call mpy8u
mov r16,r17
mov r17,r18
clr r19
ldi r18,40
call div16u
ldi r17,$30
add r16,r17
call wdata
;余数乘10除40取小数3
mov r16,r14
ldi r17,10
call mpy8u
mov r16,r17
mov r17,r18
clr r19
ldi r18,40
call div16u
ldi r17,$30
add r16,r17
call wdata
ldi r16,$20
call wdata
pop r20
pop r19
pop r18
pop r17
pop r16
pop r15
pop r14
ret
;***********************************************************************
;***********************************************************************
; 显示下一行
;***********************************************************************
lcd32: push r0
push r1
push r16
push r17
push r30
push r31
ldi r16,$c0
call wcom
ldi r31,high(lcddata*2)
ldi r30,low(lcddata*2)
lds r16,mode
swap r16
ldi r17,3
mul r16,r17
mov r16,r0
clr r17
add r30,r16
adc r31,r17
lds r16,lcdadd
add r30,r16
adc r31,r17
ldi r17,$10
lcdpc1: lpm r16,z+
call wdata
dec r17
brne lcdpc1
pop r31
pop r30
pop r17
pop r16
pop r1
pop r0
ret
;**********************************************************************
;***********************************************************************
; 送频率字到接收机
;***********************************************************************
i2cwr: push r21
push r16 ;i2c指定地址写
push r17
push r18
push r19
push r20
ldi r21,$5 ;设定写出错重试次数
i2cw3: ldi r17,start ;发起始信号
out twcr,r17
call wite ;读应答字
cpi r16,$08 ;比较应答字
brne i2cw2 ;出错转移
ldi r17,$c0 ;发器件地址c0
out twdr,r17
ldi r17,nack ;发应答控制字
out twcr,r17
call wite ;读应答字
cpi r16,$18 ;比较应答字
brne i2cw2 ;出错转移
lds r17,mhzh ;发送数据
andi r17,$7f ;首位处理
mov r19,r17 ;暂存
out twdr,r17 ;发送频率高字节
ldi r17,nack ;发应答控制字
out twcr,r17
call wite ;读应答字
cpi r16,$28 ;比较应答字
brne i2cw2 ;出错转移
lds r17,mhzl ;发送频率低字节
mov r18,r17 ;暂存
out twdr,r17
ldi r17,nack ;发应答控制字
out twcr,r17
call wite ;读应答字
cpi r16,$28 ;比较应答字
brne i2cw2 ;出错转移
ldi r17,$8a ;发送控制字8a
out twdr,r17
ldi r17,nack ;发应答控制字
out twcr,r17
call wite ;读应答字
cpi r16,$28 ;比较应答字
brne i2cw2 ;出错转移
ldi r16,$1d ;根据频率值选择波段<r16,r20
ldi r20,$1a
ldi r17,$a0 ;低波段控制字a0
cp r18,r16
cpc r19,r20
brlo i2cw1
ldi r16,$5c ;根据频率值选择波段>r16,r20
ldi r20,$3d
ldi r17,$30 ;高波段控制字30
cp r18,r16
cpc r19,r20
brsh i2cw1
ldi r17,$90 ;中波段控制字90
i2cw1: out twdr,r17
ldi r17,nack ;发应答控制字
out twcr,r17
call wite ;读应答字
cpi r16,$28 ;比较应答字
brne i2cw2 ;出错转移
ldi r21,$5 ;设定读出错重试次数
rjmp i2cr1
i2cw4: rjmp i2cw3
i2cw2: ldi r17,stop ;发停止信号
out twcr,r17
dec r21
brne i2cw4
ldi r17,$20
sts lcdadd,r17
rjmp i2cr2 ;退出
i2cr3: ldi r17,stop ;发停止信号
out twcr,r17
dec r21
breq i2cr1
ldi r17,$10
sts lcdadd,r17
rjmp i2cr2 ;退出
i2cr1: ldi r17,start ;发重起始信号
out twcr,r17
call wite ;读应答字
cpi r16,$10 ;比较应答字
brne i2cr3 ;出错转移
ldi r17,$c1 ;发器件地址(读)c1
out twdr,r17
ldi r17,nack ;发应答控制字
out twcr,r17
call wite ;读应答字
cpi r16,$40
brne i2cr3 ;出错转移
ldi r17,nack ;接收数据发NACK
out twcr,r17
call wite ;读应答字
cpi r16,$58 ;比较应答字
brne i2cr3 ;出错转移
in r16,twdr ;读控制字
ldi r17,stop ;发停止信号
out twcr,r17
bst r16,6
brtc i2cr3
ldi r17,$00
sts lcdadd,r17
i2cr2: pop r20
pop r19
pop r18
pop r17
pop r16
pop r21
ret
;**************************************************************
;************************************************
; 检测I2C发送完毕
;************************************************
wite: in r17,twcr
bst r17,7
brtc wite
in r16,twsr
andi r16,$f8
ret
;************************************************
;******************************************************
; 廷时子程序
;*****************************************************
yss: push r0
push r20
clr r0
ldi r20,7
w1: dec r0
brne w1
dec r20
brne w1
pop r20
pop r0
ret
;*****************************************************
;*****************************************************************
; 按键处理子程序
;*****************************************************************
key: push r16
push r17
keya: in r16,pinb
ori r16,$f1
cpi r16,$ff
breq keya ;无按键继续检测
call yss ;延时去抖动
in r16,pinb
ori r16,$f1
cpi r16,$ff
breq keya ;干扰继续检测
clr r16,
sbis pinb,2 ;不是+键跳行
rjmp keyb
ldi r16,1
sbis pinb,1 ;不是-键跳行
rjmp keyb
ldi r16,2
sbic pinb,3 ;不是功能键跳行
rjmp keya
keyb: sts keyda,r16
keyc: in r17,pinb ;等待按键放开
ori r17,$f1
cpi r17,$ff
brne keyc
pop r17
pop r16
ret ;退出
;*****************************************************************
;**********************************************************************************
; 数学运算子程序
;**********************************************************************************
;4.2.1.1 mpy8u 8 位*8 位无符号乘法
;1 程序功能r16 (被乘数)* r17(乘数) r18 r17(结果)
;该子程序是将两个寄存器r16 和r17 相乘结果送至寄存器r18 和r17
;********************************************************************
mpy8u: ;8 位*8 位无符号乘法
clr r18 ;清结果高字节
ldi r19,8 ;初始化循环计数器
lsr r17 ;乘数循环
m8u_1:
brcc m8u_2 ;进位置位
add r18,r16 ;加被乘数到结果高字节
m8u_2:
ror r18 ;结果高字节右循环
ror r17 ;结果低字节和乘数右循环
dec r19 ;循环计数器减1
brne m8u_1 ;如没完成再循环
ret
;**********************************************************************************
;4.3.1 b16td5 16 位二进制转换成BCD 码
;1 程序功能将r17 r16 中16 位二进制转换成BCD 码个十百千和分别
;存放于r16 r17 r18 r19 中
;程序思想r17 r16-1000 够减Y 次则千位为Y 差值100 够减Z 次则百位为Z
;差值10 够减U 次则十位为U 差值为个位
;***********************************************************************************
b16td5: ser r19 ;r19 先送1
b16td5_2:
inc r19 ;r19 增1
subi r16,low(1000) ; r17 r16 10000
sbci r17,high(1000)
brcc b16td5_2 ;够减则返回b16td5_2
subi r16,low(-1000) ;不够减+1000 恢复余数
sbci r17,high(-1000)
ser r18 ;r18 先送1
b16td5_3:
inc r18 ;r18 增1
subi r16,low(100) ; r17 r16 100
sbci r17,high(100)
brcc b16td5_3 ;够减则返回b16td5_3
subi r16,low(-100) ;不够减+100 恢复余数
sbci r17,high(-100)
ser r17 ;r17 先送1
b16td5_4:
inc r17 ;r17 增1
subi r16,10 ; r17 r16 10
brcc b16td5_4 ;够减则返回b16td5_4
subi r16,-10 ;不够减+10 恢复余数
ret
;***********************************************************************************
;***********************************************************************************
; 8(r17) 位二进制转换成BCD 码(r16,r17)
; 差值10 够减U 次则十位为U 差值为个位
;************************************************************************************
b8td2: ser r16 ;r16 先送1
b8td2_1:
inc r16 ;r16 增1
subi r17,10 ; r17-10
brcc b8td2_1 ;够减则返回b8td2_1
subi r17,-10 ;不够减+10 恢复余数
ret
;******************************************************************************
; div16u 16 位/ 16 位无符号除法
; 程序功能r17 r16 / r19 r18 =r17 r16余 r15 r14
; 该子程序是将寄存器r17 和r16 的值与寄存器r19 和r18 的值相除结果送至寄存器r17
; 和r16 余数送r15 和r14 结果为16 位
;************************************************************************************
div16u: ;16 位/16 无符号除法
clr r14 ;清除余数和进位
sub r15,r15
ldi r20,17 ;初始化循环计数器
d16u_1:
rol r16 ;左移被除数
rol r17
dec r20 ; 计数器减1
brne d16u_2 ;不为0 跳至d16u_2
ret ;为0 返回
d16u_2:
rol r14 ;左移余数被除数移到除数
rol r15
sub r14,r18 ;余数除数
sbc r15,r19
brcc d16u_3 ;够减跳至d16u_3
add r14,r18 ;不够减再加除数
adc r15,r19
clc ;清进位位
rjmp d16u_1
d16u_3:
sec ;置进位位
rjmp d16u_1
;************************************************************************************
;*********************************************************************************************
lcddata:
.db 'Y', 'e', 's', ' ', 'L', 'o', 'c', 'k', ' ', ' ', 'C', 'H', ' ', '+', '/', '-'
.db 'N', 'o', ' ', 'L', 'o', 'c', 'k', ' ', ' ', ' ', 'C', 'H', ' ', '+', '/', '-'
.db 'B', 'a', 'd', ' ', 'n', 'o', ' ', 'a', 'n', 's', 'v', 'e', 'r', ' ', '.', '.'
.db 'Y', 'e', 's', ' ', 'L', 'o', 'c', 'k', ' ', ' ', 'F', 'R', ' ', '+', '/', '-'
.db 'N', 'o', ' ', 'L', 'o', 'c', 'k', ' ', ' ', ' ', 'F', 'R', ' ', '+', '/', '-'
.db 'B', 'a', 'd', ' ', 'n', 'o', ' ', 'a', 'n', 's', 'v', 'e', 'r', ' ', '.', '.'
.db 'Y', 'e', 's', ' ', ' ', 'S', 'c', 'a', 'n', '.', '.', 'P', 'U', '/', 'P', 'D'
.db 'N', 'o', ' ', ' ', ' ', 'S', 'c', 'a', 'n', '.', '.', 'P', 'U', '/', 'P', 'D'
.db 'B', 'a', 'd', ' ', 'n', 'o', ' ', 'a', 'n', 's', 'v', 'e', 'r', ' ', '.', '.'
.db 'S', 'a', 'v', 'e', 'F', 'r', 'e', 'q', 'u', 'e', 'n', 'c', 'y', 'Y', '/', 'N'
.db 'S', 'a', 'v', 'e', 'F', 'R', ' ', ' ', 'C', 'H', ' ', 'S', '/', '+', '/', '-'
.db 'Y', 'e', 's', ' ', ' ', 'S', 'c', 'a', 'n', '.', '.', 'P', 'U', '/', 'P', 'D'
.db 'S', 'a', 'v', 'e', 'F', 'r', 'e', 'q', 'u', 'e', 'n', 'c', 'y', 'Y', '/', 'N'
.db 'S', 'a', 'v', 'e', 'F', 'R', ' ', ' ', 'C', 'H', ' ', 'S', '/', '+', '/', '-'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -