迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1265|回复: 3

【提问】写了个定时改变控件位置的OS代码,执行有问题

[复制链接]

5

主题

25

回帖

136

积分

注册会员

Rank: 2

积分
136
发表于 2019-10-16 16:46:24 | 显示全部楼层 |阅读模式
我编了个OS代码实现用定时器中断每隔数秒改变文本显示框的位置。
但是屏幕下载后,文字在快速闪动,也不会变换位置。不知道为什么。
有谁能看下有什么明显错误吗?
还有怎么清空这段OS程序呢?
T5 UID1平台
每隔40.8ms*256=10.44秒,把一个显示控件的描述指针0x8100的位置信息0x8101,由x 50, y 50 改为 x 100, y 100。

  1. ORG 1000H
  2. GOTO MAIN
  3. NOP
  4. NOP
  5. GOTO T2INT
  6. ORG 1080H
  7. MAIN:
  8.         LDBR R10,0X90,1                                            ;字节二进制第8位及第5位置1即为0x90,先存到R10
  9.         MOVRD R10,45,1                                                    ;从R10存入DR45,把DR45第8位总开关及第5位定时器2开关打开
  10.         LDWR R10,0x0FF0                                                 ;存入4080
  11.         MOVRD R10,48,2                                                   ;设置中断定时器2定时40.8ms
  12.         LDWR R20,0x0000                                                ;R20用来记录中断次数
  13.         LDWR R22,0x0100                                                 ;作为中断次数上限值
  14.         LDBR R24,0,1                                           ;用来记录当前控件移动位置状态
  15.         LDWR R0,0x8101                                                  ;显示控件描述指针位置地址存入R0:R1
  16.         LDWR R26,0x0032                                                ;原位置x坐标
  17.         LDWR R28,0x0032                                                 ;原位置y坐标
  18.         LDWR R30,0x0064                                                ;新位置x坐标
  19.         LDWR R32,0x0064                                                ;新位置y坐标
  20.         
  21. T2INT:
  22.         INC R20,1,1                                                                     ;R20数值+1,使用16bit模式
  23.         JS R22,R20,MOVENEXT                                    ;中断次数上限R22>=R20则继续下一条,否则跳转
  24.         RETI

  25. MOVENEXT:
  26.         LDWR R20,0x0000                                   ;定时器次数重新计数
  27.         IJNE R24,0,MOVEBACK                                     ;如果已经在MOVENEXT位置则移回MOVEBACK位置
  28.         LDBR R24,1,1
  29.         MOVXR R30,0,2                                                        ;写入新位置坐标到R0:R1所指的描述指针地址

  30. MOVEBACK:
  31.         LDBR R24,0,1
  32.         MOVXR R26,0,2                                                       ;写入原位置坐标到R0:R1所指的描述指针地址
复制代码
有几个疑问
程序中没一直跳转循环是不是程序只执行一次?那定时器中断也只执行一次?还是定时器开关没关就会一直执行?
定时器到时间中断后还需要再次设定时间吗?

怎么在屏幕上清空这段程序呢?


回复

使用道具 举报

0

主题

5

回帖

188

积分

注册会员

Rank: 2

积分
188
发表于 2019-10-16 21:18:20 | 显示全部楼层
1、您可以参考下下面两个配置定时器的例子。

2、原因应该是程序中:31行没有设置跳转,所以MOVENEXT段运行后,会继续运行MOVEBACK段,
3、如果要清空os程序编译一个空白的循环运行os进去就可以。







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

5

主题

25

回帖

136

积分

注册会员

Rank: 2

积分
136
 楼主| 发表于 2019-10-17 11:07:18 | 显示全部楼层
本帖最后由 开发版 于 2019-10-17 11:22 编辑

原来跟单片机一样要写成死循环,否则会不断重新运行整个程序,导致反复赋初值。
定时器中断不是一次性,无需再次设定时长。

:号下面的代码跟高级语言的函数不一样,遇到下一个:号也不会停止,会继续往下执行。要有返回或跳转指令才行

还是问下怎么清空OS程序呢?目前我是写了一个空MAIN程序代替
回复

使用道具 举报

2

主题

680

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

积分
13861
发表于 2022-1-20 10:26:43 | 显示全部楼层
开发版 发表于 2019-10-17 11:07
原来跟单片机一样要写成死循环,否则会不断重新运行整个程序,导致反复赋初值。
定时器中断不是一次性,无 ...

您好,没有其他较好的方法,建议使用空MAIN程序代替
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-7-12 16:47 , Processed in 0.033932 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表