迪文科技论坛

 找回密码
 立即注册
搜索
查看: 968|回复: 4

【提问】如何在调用指令COMTXI后只发送一次数据或者中断...

[复制链接]

1

主题

3

回帖

22

积分

新手上路

Rank: 1

积分
22
发表于 2020-12-16 20:21:21 | 显示全部楼层 |阅读模式
RT,我在使用OS的汇编指令时将一帧固定的数据通过串口发送出来,按照论坛上的参考程序在调用指令COMTXI后确实实现了想要的功能,但是发送的数据不止一帧,还是连续发送的,其实我只想发送一帧数据即可,或者可以使用什么指令将结束掉循环发送,不知道有何方法可以实现。
下面是我汇编指令的一段通过串口发送的程序,如下:
SendDataToCOM:
                LDBR        R100,0,9        
        LDWR        R100,5AA5H                  
        LDWR        R102,0683H
        LDWR        R104,000EH
        LDWR        R106,0100H
        LDBR        R108,01H,1
        COMTXI        0,R100,9

回复

使用道具 举报

0

主题

6

回帖

113

积分

注册会员

Rank: 2

积分
113
发表于 2020-12-17 09:22:27 | 显示全部楼层
楼主,您好。您应该是K600+的屏吧。
K600+ 将 COMTXI  换成 COMTXD 就好了。
回复

使用道具 举报

1

主题

3

回帖

22

积分

新手上路

Rank: 1

积分
22
 楼主| 发表于 2020-12-17 19:10:26 | 显示全部楼层
Olivia 发表于 2020-12-17 09:22
楼主,您好。您应该是K600+的屏吧。
K600+ 将 COMTXI  换成 COMTXD 就好了。

谢谢建议,已经修改了。好久不用汇编语言了,要花点时间了解一下,0.0
回复

使用道具 举报

1

主题

3

回帖

22

积分

新手上路

Rank: 1

积分
22
 楼主| 发表于 2020-12-17 19:24:59 | 显示全部楼层
看了一个晚上,大致了解了一下,在这里也写一下这个汇编的一些理解,因为刚刚上手,所以很多还不懂,不过这个还是挺容易上手的。

个人理解:
这个嵌入的汇编程序相当于这个屏上处理器给用户留出的一个接口,屏上的操作系统(应该是操作系统或者类似于操作系统)留出来的一个进程,这个进程就是给用户嵌入一段汇编语言,方便用户操作屏。
进程的执行时间应该是一个固定的时间,周期性的调用这个汇编语言,所以就会出现我提出的那个问题,所以循环的打印数据到串口,
既然是这样,那么对于我的那个问题就可以更简单的解决,设定一个标志位(存放在DGUS变量地址中),当执行过一次倒计时(我的是倒计时的功能,倒计时结束时打印数据到串口),将此标志位写一个值,再在程序再次执行到这里时判断此标志位是否被改变,来选择是否执行串口打印。这样就解决了。
我的例程是来自下面的链接:http://inforum.dwin.com.cn:20080 ... amp;_dsign=a607ca0a
原来的这个例程是无法在倒计时结束时打印数据到串口的,我添加了几段代码后可以实现在倒计数结束时打印一帧数据到串口,并把按键0x0004的值修改为未按下状态。
附件这个ASM是我自己写的,给能用得到人参考一下。
回复

使用道具 举报

1

主题

3

回帖

22

积分

新手上路

Rank: 1

积分
22
 楼主| 发表于 2020-12-17 19:25:59 | 显示全部楼层
附件加不上,还是贴出来代码吧

  1. ; DWIN OS
  2. ;单位时间标志寄存器R250
  3.                 CALL        BOUT_Mark                    ;开始和停止按键是否按下的标志位 R253=1开始, =0暂停
  4.                 CALL    One_S_Mark                     ;单位S时间随RTC是否变化的标志位 R250=1
  5.                 CALL        MAIN
  6.                 END
  7. ;======================================================                 
  8. ;-------------------------------------------
  9. BOUT_Mark:                                     ;R253=1开始 或0暂停
  10.          LDWR        R0,0004H
  11.          MOVXR        R10,1,1
  12.          IJNE        R11,1,B1=0
  13.          LDBR        R253,1,1
  14.          
  15. B1=0:    IJNE        R11,0,B_M_R  
  16.          LDBR        R253,0,1
  17. B_M_R:   
  18.                  RET
  19. ;-------------------------------------------
  20. One_S_Mark:
  21.          MOVDR        0x20,R10,7                        ;秒
  22.          CJNE        R16,R245,R><R245         
  23.          GOTO        COM_S
  24. R><R245: MOV        R16,R245,1                                
  25.          LDBR        R250,1,1                         ;R250=1
  26. COM_S:         RET
  27. ;------------------------------------------
  28. MAIN:         IJNE        R253,1,GEND                     ;如果按键按了,会开始倒计时
  29.                  ;
  30.                  LDWR R0,0X6FFF ;指定DGUS变量地址
  31.          LDWR R10,0x0000;将值写为0保存到R10中
  32.          MOVXR R10, 0, 1;把R10:R11 数据传送到地址为0X6FFF的DGUS变量中。
  33.                  ;
  34.                  LDBR        R254,0,1
  35.                  IJNE        R250,1,GEND                     ;单位s时间是否变化
  36.                  LDBR        R250,0,1                         ;R250=0
  37.                        
  38.                  LDWR        R0,0003H
  39.                  MOVXR        R10,1,1
  40.                  IJNE        R11,0,STAR-S                 ;秒如果为0,跳到分检测是否为0如果不为0,开始秒的倒计时
  41.                  GOTO        STAR-M

  42. STAR-S:
  43.                  LDWR        R0,0003H
  44.                  MOVXR        R10,1,1
  45.                  DEC        R11,0,1                                  
  46.                  MOVXR        R10,0,1
  47.                  IJNE        R11,0,GEND                         ;当秒不为0,这一秒倒计时程序结束,如果为0,检测分是否为0
  48.                  
  49. STAR-M: LDWR        R0,0002H                          
  50.                  MOVXR        R12,1,1
  51.                  IJNE        R13,0,M-1                         ;分如果为0,会检测时是否为0,分如果不为0,跳到分减少1
  52.                  GOTO        STAR-H

  53. STAR-H: LDWR        R0,0001H
  54.                  MOVXR        R14,1,1
  55.                  IJNE        R15,0,H-1                        ;时如果为0,结束,如果不为0,跳到时减少1
  56.                  GOTO        STAR0
  57.   H-1:   LDWR        R0,0001H                         ;时减少1,分变成60       
  58.                  MOVXR        R14,1,1
  59.                  DEC        R14,1,1
  60.                  MOVXR        R14,0,1
  61.                  LDWR        R0,0002H
  62.                  LDWR        R12,60
  63.                  MOVXR        R12,0,1
  64.                  GOTO        GEND
  65.                  
  66.   M-1:  LDWR        R0,0002H                          ;分减少1,秒变成59
  67.                  MOVXR        R12,1,1
  68.                  DEC        R12,1,1
  69.                  MOVXR        R12,0,1
  70.                  LDWR        R0,0003H
  71.                  LDWR        R10,59
  72.                  MOVXR        R10,0,1                 
  73.                  GOTO        GEND
  74. STAR0:   CALL        SendDataToCOM

  75. GEND:         RET       
  76. ;-----------------------------------------
  77. Alarm:
  78.                  IJNE        R254,0,Alarm_R;判断R254的值,为0则顺序执行,否则跳转至Alarm_R
  79.                  LDBR        R254,1,1
  80.                  LDBR        R10,20,1
  81.                  MOVRD        R10,2,1 ;将长度为1的第二个参数(就是2)放进R10中(R10控制蜂鸣器鸣叫),随后蜂鸣器鸣叫
  82. Alarm_R: RET
  83. ;-----------------------------------------
  84. SendDataToCOM:                                        ;SendDataToCOM:将设定好的数据发送到串口中,循环发送,这时需要单片机发送一个命令将这个循环切断。
  85.                 LDWR R0,0X6FFF ; R0:R1 指定DGUS变量地址0X6FFF
  86.                 MOVXR R10 ,1, 1;把DGUS 变量地址0X6FFF 中的数据读到R10:R11
  87.                
  88.                 IJNE R11,2,SendDataToCOM1;如果R11的值为2,表示已经有数据传送到串口,则立即结束,否则跳转
  89.                 END
  90. SendDataToCOM1:       
  91.                 LDBR        R100,0,9        
  92.         LDWR        R100,5AA5H  ;5A A5 06 83 00 0E 01 00 00        
  93.         LDWR        R102,0683H
  94.         LDWR        R104,000EH
  95.         LDWR        R106,0100H
  96.         LDBR        R108,00H,1
  97.         COMTXI        0,R100,9
  98.         ;将变量地址中的值改为2,指定的存储变量的地址是:0X6FFF
  99.         LDWR R0,0X6FFF ;指定DGUS变量地址
  100.         LDWR R10,0x0002;将值写为2保存到R10中
  101.         MOVXR R10, 0, 1;把R10:R11 数据传送到地址为0X6FFF的DGUS变量中。
  102.         ;将地址为0x0004的按钮的值修改为未触发状态
  103.         LDWR R0,0X0004 ;指定DGUS变量地址
  104.         LDWR R10,0x0000;将值写为2保存到R10中
  105.         MOVXR R10, 0, 1;把R10:R11 数据传送到地址为0X6FFF的DGUS变量中。
  106.         RET

  107.                
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 13:44 , Processed in 0.072182 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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