|
|
发表于 2019-9-16 08:58:55
|
显示全部楼层
K600+的定时器比如80指令给0x4A 4B寄存器一个值, 5a a5 04 80 4A 13 38 ;定时20秒左右,1338H=5000,5000*4=20000MS,然后5a a5 03 81 4A 02 读指令 读出来的数会自减,等约20秒读的时候 应该读出来的值是0
一般是也可以用OS去实现的,K600+的自减定时器,原理是给相关的寄存器赋值之后,会自减到0,我们可以判断里面的值是否为0,来获取一个不精准的延时,或者利用K600+的运行周期运行,INC对某个寄存器进行自增,然后判断运行了多少个周期,一种在os程序处理的不精确延时的一种方法。
(如果需要比较准确的1秒以上的时间,可以用屏的RTC比较处理)
使用到timer寄存器,OS里用MOVDR指令MOVRD指令,将定时器寄存器的值进行交换处理去实现。
程序容易出错的地方是要控制给定时器赋值的时候只赋值一次,后面时间自减为0了,根据实际情况是去重新给定时器寄存器赋值。
附件有例子可以参考下。
IJNE R100,0,main
LDBR R100,1,1 ;先定时,程序只执行一次R100是从R0-R255之间随意取的一个寄存器,用于定时器启动标志寄存器,此处置1,只让程序执行一次,避免重复运行到此行的时候给定时器重新复制
Set_Time:
LDBR R110,13H,1 ;定时20秒左右,1338H=5000,5000*4=20000MS
LDBR R111,38H,1
MOVRD R110,4AH,2
main:
。。。。
。。。。
MOVDR 4AH,R160,2 ; 判断计时器中的数据是否自减为零,否,计时
IJNE R160,0xxx
IJNE R161,0,xxx
LDBR R100,0,1 ;R100置0,根据实际情况将定时器填数的标志寄存器清0
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|