FREQD(Frequency deviation.): 频率偏差 (reg7, bit4~15)
一般我们设置的范围是100~200,以150为例, 用C语言时表达为:
if( (FREQD>=150)&&(FREQD<=(0xfff-150)))
用C表达相当简单,但是汇编实现起来确实相当麻烦.
此句的意思为:
当FREQD小于等于150,或freqd大于等于0fff-150,当前台才为真台.
我们可以发现一个规律, 小于等于150时,12位的最高4位一定全为0. 大于等于offf-150时, 最高4位一定全为1. 因为低8位的范围就达到了0~255了.
所以,我们可以把12位的高4位作为标志位来判断,只有全为0,或全为1时,我们才进行下一步的判断.
用汇编表示如下:
//省略I2C读过程, 假设FREQD的值已存入寄存器R0,R1. R0的高4位已清零,低4位存了FREQD的高4位, R1存了FREQD的低8位.
MOV A, R0 //把含有FREQD的高4位值R0寄存器的值传入A
DECA 14 //高4位减去14,如果是4位全1减去14不用借位.
BTFSS Cy //判断是否有借位
GOTO 0XFFDEC150 //没借位,说明全1,进入判断低8位是否>=(0xfff-150)
GOTO ALLZERODET //有借位,进入全0判断.
0XFFDEC150 //判断低8位是否>=(0xfff-150),由于高4位已经确实,我们只要确定低8位是否>=(0xff-150)
MOV A,R1 //把低8位传入A
INC 150 //低8位加150,
BTFSS Cy //判断是否有进位
GOTO ERRORSTATION //没进位,说明<(0xff-150),是假台.
GOTO REALSTATION //有进位,说明>=(0xff-150),是真台.
ALLZERODET //高4位全零判断.
MOV A,R0 //把含有FREQD的高4位值R0寄存器的值传入A
INCA 255 //判断高4位是否全0,非全零的任何数加255都有进位
BTFSS Cy //判断是否有进位
GOTO LESS150DET //没有进位,说明全0,高4位符合条件,进入低8位<150判断
GOTO ERRORSTATION //有进位,说明高4位不为零,进入假台设置.
LESS150DET //判断低8位是否小于150
MOV A,R1 //把低8位传入A
DECA 150 //低8位减150,
BTFSS Cy //判断是否有借位
GOTO ERRORSTATION //没借位,说明大于150,是假台.
GOTO REALSTATION //有借位,说明小于150,是真台.
ERRORSTATION //假台设置
........
RETLW 0 //返回假台返回值0
REALSTATION //真台设置
........
RETLW 1 //返回真台返回值1
关联博文:
http://forum.eet-cn.com/BLOG_ARTICLE_9882.HTM
43. BK1080自动搜台参数FREQD为12位的,8位单片机用汇编语言如何用最短的程序判断.
http://forum.eet-cn.com/view_comments***pa?entry_id=9135&from=RSS
3.BK1080自动搜台几个参数代表什么意思,如何调整自动搜台参数? BK1080搜台指标的作用? BK1080自动搜台判据的意思?
meng_411698409 2012-12-18 15:04
用户1675231 2012-12-17 09:38