中科因仑“3+1”工程特种兵精英论坛
标题:
选择电视频道,
[打印本页]
作者:
张衍波
时间:
2015-10-15 08:08
标题:
选择电视频道,
当你坐在家里吃着月饼,惬意地用电视遥控器选择电视频道,不停地用 +/- 键盘调节电视音量到合适的时候,你可曾想过,此时崂山也许正钻在在温度高达35摄氏度以上的树丛里,忍耐蚊子蚂蚁的叮咬,研究用什么样的通信线更好地防止雨水侵蚀和动物的啃咬。
也许你从没有留意你按下的节目频道、音量等这些 标有 + / - 符号的键盘是怎样工作控制大小的。
下面我们学习两个新指令 incf 和 decf ,它们都是对某一个寄存器进行增1 或减1 操作,例句中假如我们要操作的寄存器是 09H
movlw 02H '常数2进入W
movwf 09H '把w 内的数2 复制到09H 这个寄存器
'现在09H 寄存器内存储的数是2
incf 09H '寄存器09H内存储的数 增加1
'现在09H内存储的数变成3
decf 09H '寄存器09H内存储的数 减掉1
'现在09H内存储的数变成2
movlw 0FFH '常数255进入W
movwf 09H '把w 内的数255 复制到09H 这个寄存器
'现在09H 寄存器内存储的数是255
incf 09H '寄存器09H内存储的数 增加1
'现在09H内存储的数变成0
decf 09H '寄存器09H内存储的数 减掉1
'现在09H内存储的数又变成255
如果你事先定义好了地址为09H 的这个寄存器里存储的数字大小,代表电视机节目频道的话,你会很喜欢这两个指令的。并且当节目频道到达最大值255 或最小值0的时候无需担心,寄存器在0时减1 会得255, 255状态下增1 会得0
至于为什么会这样,学过环形计数器的人不会感到奇怪的。你要是没有学过计数器电路也不要紧,记住一个寄存器的最大存储数值是255 = 0FFH 就可以了,加减法都会导致它“进位”
当然控制音量时这个程序不能使用,因为它在0和255之间变化,音量忽大忽小怎们行。
为解决这个问题, 我们必须再学习两条指令 incfsz 和 decfsz
它们与上两个功能基本相同,不同的是: 寄存器增1 或减1操作以后,该指令会自动判定寄存器内的结果是否为零,如果不为零,继续正常执行该指令后面的语句. 但如果结果为零的话,则程序会 "跳一步" .绕过紧挨着它下面的一条指令,继续执行更下面的语句,举例子说明
假定我们操作的寄存器还是09H:
movlw 0FDH '常数253进入W
movwf 09H '把w 内的数253 复制到09H 这个寄存器
'现在09H 寄存器内存储的数是253
incfsz 09H '寄存器09H内存储的数 增加1,结果变成254 结果不等于0,故程序继续执行下一指令
nop '该句得到执行(因为上一句寄存器09H的计算结果不等于0)
incf 09H '寄存器09H内存储的数 增加1,结果是255
incfsz 09H '寄存器09H内存储的数 增加1,结果变成0
'因为结果等于0,故程序要跳过下面的一句(不运行下面的一句).
incf 09H '由于上一句的存在并结果为0,该句得不到执行,被忽略
incf 09H '程序跳入这一句继续运行 寄存器09H内存储的数 增加1
nop '因此现在 09H寄存器存储的数是1
nop '继续运行
.
.
.
.
.
思考题:设计一段程序代码,当用户连续按下音量减小键后,判定音量寄存器09H的存储音量数值,
防止该寄存器的值从0 变成255,以免震惊到用户。
.
.
.
.
SMALL_SOUND: nop '标号可以任意写的,此前用户一旦按下音量减,就把程
' 序引导到这一句上来
decfsz 09H '寄存器09H内存储的数 减1,如果结果为0 就跳一步
goto OK '如果上一句结果不为0,执行该句后,程序去了ok语句
movlw 01H '跳到这一步说明寄存器结果是0
movwf 09 '强行把 09H内的数值写成1,仍然是小音量,这样音量不会被因为 减小而变成255
OK: nop '继续运行
.
.
思考题:利用decfsz 指令设计一段延时代码,使得延时时间可以在10个机器周期到65535个机器周期之间,
可以通过程序任意控制
在这个例子中,设我们要控制的延时时间大约是24086个及其周期,用16进制表是就是 5E16 H.
如果用到通用寄存器,请使用 0AH, 0BH
yanshi: movlw 5EH ' 常数5E进W 标号是延时
movwf 0BH , '0B寄存器数为5EH
movlw 16H '常数16进W
movwf 0AH '0A寄存器数为16H
jixu: decfsz 0AH '0A寄存器内的数减1,如果结果为0跳步
goto jixu '结果不为0,继续
decfsz 0BH '0B寄存器内的数减1,如果结果为0跳步
goto jixu '结果不为0,继续
nop '延时完毕
.
.
.
.
你现在可以只用这几个简单句子完成任意时间的延时程序了。转载
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4