嵌入式技术论坛
直播中

ZXC

6年用户 100经验值
擅长:EMC/EMI设计 嵌入式技术 制造/封装 接口/总线/驱动 处理器/DSP 控制/MCU EDA/IC设计
私信 关注
[经验]

迪文屏二次开发问题详解(附例程)

1. 介绍
通常情况,迪文屏可实现大部分常用的简单功能;然而,在实现一些复杂的功能逻辑时(二次开发),主要可以通过DWIN OS Builder(汇编)和DWIN C Complier(C编译器)两种方式进行开发。DWIN C Complier主要基于 T5平台液晶屏开发,部分老的型号还是通过DWIN OS Builder进行开发。

C语言和汇编语言也各有千秋。C语言C语言属于高级语言,易理解,编程速度快,程序容易移植。但其程序执行效率远不如汇编语言,且汇编语言占用的空间要小的多。基于DWIN C Complier前面有讲到过,今天主要结合一些样例介绍下 DWIN OS Builder。

2 DWIN OS Builder开发及样例
开发指南详解请参照附件。
2.1 利用os实现RTC的星期换成中文
  1. [size=4]; DWIN OS

  2. LDBR R10,0,16
  3. MOVDR 23H,R13,1 ;DGUS屏的23寄存器给到os寄存器R13放星期0-6表示 日、一、二、。。。六
  4. LDWR R16,2 ;乘以2,这里用乘法是用查表的字节
  5. MAC R10,R14,R18 ;乘积放入了os寄存器8个 18 19 20 21 22 23 24 25
  6. LDADR TAB2 ;加载TAB2,这里tab1和2是一样的,存到的地址会到os的寄存器 5 6 7
  7. ADD R22,R4,R30 ;30 31 32 33 34 35 36 37是和=查表地址的起始地址+星期号*2字节数
  8. MOV R34,R4,4 ; os的寄存器5 6 7是多少我们不用管,只需要知道有起始地址了根据星期是多少来加载新的地址
  9. MOVC R24,2

  10. LDWR R0,0002H ;0002H地址是用的文本显示,再吧R24里面的星期给进去到屏上面变量地址显示就行
  11. MOVXR R24,0,1

  12. END

  13. TAB1:
  14. DW 0XC8D5,0XD2BB,0XB6FE,0XC8FD,0XCBC4,0XCEE5,0XC1F9 ;日一二三四五六

  15. TAB2:
  16. DW “日一二三四五六”[/size]
常规的写法可能就是星期的那个寄存器的值需要判断6次,分别给进去, 本os程序用了查表、加法 乘法指令,设计还是比较巧妙,对于查表指令的理解需要掌握,另外加法、乘法的寄存器占用需要清晰。

2.2 利用os实现进度条功能

方法1:0-100 做100个图标,下线0 ,上限100,用图标的办法解决,这种方法的缺点是图标的长宽大小不能超过255x255(T5的DGUS屏最大1023x1023支持图标),如果刻度需要精确,需要美工做很多图片,这种方法能处理做圆形的进度条。
方法2:图片动画显示,利用图片切换的原理。
方法3:基本图形剪切,把其他页面的进度条的依照坐标剪切过来。另外的就是矩形填充等,这样需要单片机发指令或者os处理。


这里主要用os计算好坐标画矩形填充处理。我们先算好起始坐标(20,)

指令:5A A5 +长度+ 82 0005 0004 0001 +左上角坐标+左下角坐标 + F800红色
用户如果不用os处理,串口发矩形填充指令也行。

OS程序设计实例:
a. 先取坐标:右下角x/100就能随着变化,设当0005H=100时 左上角坐标(20.280)右下角坐标(20,300)。
b. 取x横坐标变化范围420-20=400,分成100等分,则变化量为4即随着 0005的x 变化为20+4x。
  1. CALL 进度条
  2. END
  3. 进度条:
  4. LDWR R0,0005H ;0005h是一个整数类型的数据显示0-100,这里可以利用控件设置带好单位%
  5. MOVXR R70,1,1
  6. LDWR, R116,0004H ;加载变量命令及固定不变坐标量
  7. LDWR R118,0001H
  8. LDWR R120,20
  9. LDWR R122,280
  10. LDWR R126,300
  11. LDWR R128,F800H
  12. LDWR R140,4
  13. LDBR R142,0,30 ;清零变量
  14. MOV R70,R142,2
  15. SMAC R140,R142,R144 ;乘4
  16. LDWR R150,20
  17. ADD R144,R148,R152 ;加20
  18. MOV R158,R124,2
  19. LDWR R0,0020H ;基本图形用来显示矩形填充的地址0020H
  20. MOVXR R116,0,7
  21. RET

2.3 实现显示上电运行时间和总运行时间


DGUS屏有一个上电运行时间的寄存器,占用4个字节空间,这个寄存器里面的时间是BCB编码,我们屏上面显示的时候可以用时间变量,也是就是16进制变量直接调取出来显示,这样直接就能调用这个程序是怎么显示上电运行时间,和将总运行时间保存到数据的写法。

因为数据擦写寿命限制,理论寿命10万次,经过本人几次测试某段地址的擦写情况,实际寿命只有5-8万次,运气不好可能3万次左右,我们这里采用变化了1个小时就进行时间的保存,如果要细写也可以写15分钟30分钟保存一次。
os示例如下:
  1. CALL 运行时间
  2. CALL 累计时间
  3. END
  4. ;============================================================
  5. 运行时间:
  6. MOVDR 0CH,R10,4 ;主页面显示运行时间
  7. LDWR R0,0020H
  8. MOVXR R11,0,2
  9. ONE-H-MARK:
  10. CJNE R11,R245,R><245;判断小时是否变化,变化了说明经过一个小时了,
  11. GOTO GND
  12. R><245:
  13. MOV R11,R245,1
  14. LDWR R4,0018H ;
  15. LDWR R6,0030H ;
  16. LDWR R0,0060H ;数据库清零测5A A5 0C 80 56 5A 50 0018 0030 1000 0001
  17. MOVXL 2,1
  18. MOVXR R32,1,1 ;字
  19. LDWR R22,1
  20. ADD R20,R30,R40 ;加法将时间加一个小时,
  21. MOVXR R46,0,1
  22. MOVXL 3,1 ;保存到数据库
  23. GND:
  24. RET
  25. ;============================================================
  26. 累计时间:
  27. LDWR R4,0018H ;
  28. LDWR R6,0030H ;
  29. LDWR R0,0004H ;从数据库读出来
  30. MOVXL 2,1
  31. RET

  32. ;==================================================

2.4 利用OS实现加密键盘
  1. ORG       1000H
  2. GOTO    START
  3. NOP
  4. NOP
  5. NOP

  6. ORG       1080H

  7. START:
  8.        LDWR    R0,5000H
  9.         LDADR STRING
  10.         MOVC  R100,64
  11.         MOVXR       R100,0,32
  12.         LDWR  R20,5AA5H
  13.         LDWR  R22,0000H;上电禁用掉数据录入控件
  14.         LDWR  R24,0100H
  15.         LDWR  R26,0000H
  16.         LDWR  R0,00B0H
  17.         MOVXR       R20,0,4
  18.         
  19. MAIN:
  20.        CALL      ANYA_CHUFA
  21.         CALL    CK_LURU
  22.         CALL    CK_CHANGE
  23.         GOTO  MAIN
  24.        ;====================
  25.        ;====================
  26. ANYA_CHUFA:
  27.        LDWR    R0,1F00H
  28.         MOVXR       R10,1,1
  29.         IJNE     R11,0,1
  30.         RET
  31.         LDWR  R0,00B0H
  32. LOOP:    MOVXR  R10,1,1
  33.        IJNE       R10,0,LOOP  ;开启本条指令
  34.         IJNE     R11,0,LOOP

  35.         LDWR  R20,5AA5H
  36.         LDWR  R22,0000H
  37.         LDWR  R24,0100H
  38.         LDWR  R26,0001H
  39.         LDWR  R0,00B0H
  40.         MOVXR       R20,0,4
  41.       
  42. LOOP1:  MOVXR  R10,1,1
  43.        IJNE       R10,0,LOOP1       ;模拟触发本条指令     
  44.         IJNE     R11,0,LOOP1
  45.         LDWR  R20,5AA5H
  46.         LDWR  R22,0004H
  47.         LDWR  R24,100
  48.         LDWR  R26,100
  49.         LDWR  R0,00D4H
  50.         MOVXR       R20,0,4
  51.       
  52.         LDWR  R10,0
  53.         LDWR  R0,1F00H
  54.         MOVXR       R10,0,1
  55.         RET
  56. ;====================================
  57. ;====================================
  58. CK_LURU:
  59.        LDWR    R0,1F01H
  60.         MOVXR       R10,1,1
  61.         IJNE     R11,0,1
  62.         RET
  63.         LDWR  R10,1
  64.         LDWR  R0,1F02H
  65.         MOVXR       R10,0,1
  66.         RET
  67. ;============================
  68. CK_CHANGE:
  69.        LDWR    R0,1F02H;检查标志位是不是1
  70.         MOVXR       R10,1,1
  71.         IJNE     R11,0,1
  72.         RET
  73.        LDWR    R0,1F01H;在标志位是1的情况下检查是不是在录入状态
  74.         MOVXR       R10,1,1
  75.         IJNE     R11,1,1
  76.         RET;录入状态直接返回
  77.         LDWR  R0,1F02H;标志位清零
  78.         LDWR  R10,0
  79.         MOVXR       R10,0,1
  80.         
  81.         
  82.         
  83.         
  84.         LDWR  R0,5011H
  85.         MOVXR       R10,1,1
  86.         DEC     R10,1,1
  87.         IJNE     R11,1,1
  88.         LDWR  R10,12
  89.         MOVXR       R10,0,1
  90.         LDWR  R0,5000H;录入过程中调用的界面更改
  91.         MOVXR       R10,1,32
  92.         LDWR  R0,00B4H
  93.         MOVXR       R10,0,32  
  94.         
  95.       
  96.         LDWR  R10,5AA5H;更改该条触控指令
  97.         LDWR  R12,0000H
  98.         LDWR  R14,0100H
  99.         LDWR  R16,0003H
  100.         LDWR  R0,00B0H
  101.         MOVXR       R10,0,4
  102. ;        LDWR R0,00B0H
  103. LOOP3:  MOVXR  R10,1,1
  104.        IJNE       R10,0,LOOP3  
  105.         IJNE     R11,0,LOOP3   
  106.         LDWR  R20,5AA5H
  107.         LDWR  R22,0000H
  108.         LDWR  R24,0100H
  109.         LDWR  R26,0000H;禁用该条指令
  110.         LDWR  R0,00B0H
  111.         MOVXR       R20,0,4   
  112.         
  113.       
  114. CK_CHANGE_RET:
  115.        NOP
  116.         RET        
  117. ;=======================================
  118. STRING:
  119. DB  00H,00H,00H,00H,00H,00H,01H,03H,00H,B5H,FFH,00H,FFH,00H,FDH,00H,FEH,20H,00H,01H,08H,00H,01H,6AH,01H,5DH,00H,00H,00H,10H,00H,01H,FEH,01H,00H,0CH,00H,62H,01H,4CH,01H,7EH,02H,A5H,00H,62H,01H,4CH,FEH,00H,00H,00H,00H,00H,00H,00H,00H,00H,5AH,1FH,01H,00H,01H,00H

2.5 利用OS 实现手势解锁功能
  1. ORG 1000H           ;目前的T5 OS 2.07以上版本已经要求严格按照以下几行的标准格式来了                  
  2. GOTO MAIN           ;代码的第一条指令必须是GOTO
  3. ;GOTO T0INT                 ;中断产生时,跳转到T0中断处理程序,必须使用GOTO,不能用CALL
  4. NOP
  5. NOP                                        ;T1中断未使用
  6. NOP
  7. ;GOTO T2INT                         ;中断产生时,跳转到T2中断处理程序
  8. ORG 1080H                        ;跳转到主函数MAIN
  9. ;******************************************************************************
  10. ;MAIN主流程
  11. ;******************************************************************************
  12. MAIN:
  13.         CALL        DINIT                                ;程序第一次运行时需要进行初始化的内容
  14. START:   
  15.         CALL        GET_PICID                        ;获取当前页面ID
  16.         IJNE        R198,0x00,OVER                ;确保ID的高字节为0
  17.         IJNE        R199,PAGE_LOCK,1        ;判断是否为解锁界面
  18.         CALL        UNLOCK                                ;屏保界面解锁功能
  19. OVER:  
  20.         GOTO        START
  21.         
  22. ;******************************************************************************
  23.         ;Fuction:程序第一次运行时需要进行初始化的内容
  24. ;******************************************************************************               
  25. DINIT:
  26. ;配置接口寄存器
  27.         ;选择需要初始化的寄存器页
  28.         LDBR        R10,0x00,1                                ;OS有8个寄存器页切换,DR0=0x00-0x07
  29.         MOVRD        R10,0,1                                        ;选择DR0作为初始值页面
  30.         ;配置定时器中断功能        
  31. ;        LDBR        R10,0x90,1
  32. ;        MOVRD        R10,45,1                                ;使能定时中断-2
  33. ;        LDWR        R10,0xC350
  34. ;        MOVRD        R10,48,2                                ;设置定时时间-500ms

  35. ;自定义【R100~R199】为双字节数据空间--数据操作
  36.         LDWR        R100,DATA_DOUBLE_0                ;实时坐标X轴        
  37.         LDWR        R102,DATA_DOUBLE_0                ;实时坐标Y轴
  38.         LDWR        R104,DATA_X0_START                ;X轴第0列起点
  39.         LDWR        R106,DATA_X1_START                ;X轴第1列起点
  40.         LDWR        R108,DATA_X2_START                ;X轴第2列起点
  41.         LDWR        R110,DATA_X3_START                ;X轴第3列起点
  42.         LDWR        R112,DATA_X4_START                ;X轴第4列起点
  43.         LDWR        R114,DATA_X4_OVER                ;X轴第4列终点
  44.         LDWR        R116,DATA_Y1_START                ;Y轴第1行起点
  45.         LDWR        R118,DATA_Y1_OVER                ;Y轴第1行终点
  46.         LDWR        R120,DATA_DOUBLE_0                ;解锁ICON赋值为0
  47.         LDWR        R196,DATA_DOUBLE_0                ;显示页面临时变量                                       
  48.         LDWR        R198,DATA_DOUBLE_0                ;当前显示页面        
  49.         
  50. ;自定义【R200~R255】为单字节数据空间--标志位
  51.         LDBR        R200,DATA_SINGLE_0,1        ;X0标志位,为1说明第一块区域已经被按下               
  52.         
  53. ;其他数据初始化        
  54.         
  55. DINIT_RET:
  56.         RET  
  57.         
  58. ;******************************************************************************
  59. ;Fuction:获取当前页面ID
  60. ;******************************************************************************
  61. GET_PICID:
  62.         LDWR        R0,ADDR_PIC_NOW
  63.         MOVXR        R196,1,1
  64.         ;判断当前页面与上一次的页面是否相同,不同:跳转到START重新开始
  65.         CJNE        R196,R198,2
  66.         CJNE        R197,R199,1
  67.         GOTO        GET_PICID_RET        
  68.         MOV                R196,R198,2
  69.         GOTO        START        
  70.         
  71. GET_PICID_RET:
  72.         RET         
  73. ;******************************************************************************
  74. ;Fuction:(屏保界面)根据坐标来修改变量图标的数据,如果为4,说明已经解锁完成,跳转到指定页面
  75. ;******************************************************************************
  76. UNLOCK:
  77.         CALL        GET_PICID                                ;获取当前页面ID        
  78.         ;获取坐标数据
  79.         LDWR    R0,ADDR_TP_STATUS                ;获取TP的状态数据
  80.         MOVXR   R10,1,4                                        ;【R10~R17】8个字节数据
  81.         MOV                R12,R100,2                                ;实时坐标X轴
  82.         MOV                R14,R102,2                                ;实时坐标Y轴        
  83.         ;判断是否按下?
  84.         IJNE        R11,0x00,1                                ;根据TP状态值,00=松开
  85.         GOTO        UNLOCK                                        ;重新回到解锁流程
  86.         IJNE        R11,0x02,1                                ;根据TP状态值,02=抬起
  87.         GOTO        UNLOCK_TEST                                ;判断解锁是否成功
  88.         ;判断Y轴是否满足要求?
  89. Y_JUDG:
  90.         JS                R102,R116,UNLOCK                ;如果Y轴大于起点坐标,则继续判断
  91.         JS                R118,R102,UNLOCK                ;如果Y轴小于终点坐标,则继续判断X轴
  92.         ;判断是否按压了X0?
  93. X0_FLAG:
  94.         IJNE        R200,0x01,1                                ;为1说明第一块区域已经被按下
  95.         GOTO        X_JUDG
  96.         JS                R100,R104,UNLOCK                ;如果X轴大于第0列起点坐标,则继续判断
  97.         JS                R106,R100,UNLOCK                ;如果X轴小于第0列终点坐标,则继续判断下一列
  98.         LDBR        R200,0x01,1                                ;X0标志位置1
  99.         GOTO        UNLOCK
  100.         ;判断X轴是否满足要求?        
  101. X_JUDG:
  102.         JS                R100,R104,UNLOCK        ;如果X轴大于第0列起点坐标,则继续判断
  103.         JS                R106,R100,2                                ;如果X轴小于第0列终点坐标,则继续判断下一列
  104.         LDWR        R120,0x0000
  105.         GOTO        ICON_SHOW                        
  106.         JS                R108,R100,2
  107.         LDWR        R120,0x0001
  108.         GOTO        ICON_SHOW        
  109.         JS                R110,R100,2
  110.         LDWR        R120,0x0002
  111.         GOTO        ICON_SHOW               
  112.         JS                R112,R100,2
  113.         LDWR        R120,0x0003
  114.         GOTO        ICON_SHOW        
  115.         JS                R114,R100,UNLOCK
  116.         LDWR        R120,0x0004                                
  117.         GOTO        ICON_SHOW                        
  118.         ;显示当前位置的ICON图标
  119. ICON_SHOW:
  120.         LDWR        R0,ADDR_JSICON        
  121.         MOVXR        R120,0,1
  122.         GOTO        UNLOCK        
  123.         ;抬手后对滑动图标进行判断
  124. UNLOCK_TEST:
  125.         ;清除数据
  126.         MOV                R120,R20,2                                ;将按压区域保存在临时数据,用于判断是否可以解锁
  127.         LDWR        R0,ADDR_JSICON
  128.         LDWR        R120,DATA_DOUBLE_0                ;清除ICON图标数据
  129.         MOVXR        R120,0,1                                
  130.         LDBR        R200,DATA_SINGLE_0,1        ;清除X0标志位
  131.         ;解锁成功后跳转到页面3
  132.         IJNE        R21,0x04,UNLOCK                        ;如果等于4,说明可以解锁成功
  133.         LDWR        R20,0x5A01
  134.         LDWR        R22,0x0003                                
  135.         LDWR        R0,0084H                        
  136.         MOVXR   R20,0,2
  137.         ;等待页面成功跳转到页面3
  138. WAIT_PAGE3:
  139.         NOP        
  140.         LDWR        R0,ADDR_PIC_NOW
  141.         MOVXR        R20,1,1
  142.         IJNE        R21,PAGE_INDEX,WAIT_PAGE3               
  143.         GOTO        UNLOCK_RET                                ;解锁流程结束
  144.         
  145. UNLOCK_RET:
  146.         RET

  147. ;******************************************************************************
  148. ;Fuction:中断处理
  149. ;******************************************************************************
  150. ; T0INT:        NOP                        ;T0中断处理程序
  151. ;
  152. ; RETI                                ;必须使用RETI结束,不能使用RET
  153. ;
  154. ;T2INT:        NOP                        ;T2中断处理程序
  155. ;
  156. ;        RETI

  1. [size=4];******************************************************************************
  2.         ;九宫格解锁DEMO
  3.         ;参考手机的九宫格解锁效果,在T5平台上实现类似的效果,提供给用户参考使用
  4. ;******************************************************************************
  5.         ;内核程序:########
  6.         ;编程环境:DWIN_OS_Builder V3.0.2.4
  7.         ;通讯波特率:115200bps
  8.         ;串口模式:8N1
  9. ;******************************************************************************
  10. ORG 1000H           ;目前的T5 OS 2.07以上版本已经要求严格按照以下几行的标准格式来了                  
  11. GOTO MAIN           ;代码的第一条指令必须是GOTO
  12. ;GOTO T0INT                         ;中断产生时,跳转到T0中断处理程序,必须使用GOTO,不能用CALL
  13. NOP
  14. NOP                                        ;T1中断未使用
  15. GOTO T2INT                         ;中断产生时,跳转到T2中断处理程序
  16. ORG 1080H                        ;跳转到主函数MAIN
  17. ;******************************************************************************
  18. ;MAIN主流程
  19. ;******************************************************************************
  20. MAIN:
  21.         CALL        DINIT                                        ;程序第一次运行时需要进行初始化的内容
  22. START:   
  23.         CALL        GET_PICID                                ;获取当前页面ID
  24.         IJNE        R198,0x00,OVER                        ;确保页面ID的高字节为0
  25.         IJNE        R199,PAGE_LOCK,2
  26.         CALL         UNLOCK_INIT                                ;解锁界面初始化
  27.         CALL        UNLOCK                                        ;屏保界面解锁功能
  28.         IJNE        R199,PAGE_PSWSET1,2
  29.         CALL         PSWSET1_INIT                        ;设定密码界面1初始化
  30.         CALL        PSWSET1                                        ;设定解锁密码        
  31.         IJNE        R199,PAGE_PSWSET2,2
  32.         CALL         PSWSET2_INIT                        ;设定密码界面2初始化
  33.         CALL        PSWSET2                                        ;确认解锁密码               
  34. OVER:  
  35.         GOTO        START

  36. ;******************************************************************************
  37. ;Fuction:程序第一次运行时需要进行初始化的内容
  38. ;******************************************************************************        
  39. DINIT:
  40. ;选择你需要使用的寄存器页面
  41.         ;选择需要初始化的寄存器页
  42.         LDBR        R10,0x00,1                                ;OS有8个寄存器页切换,DR0=0x00-0x07
  43.         MOVRD        R10,0,1                                        ;选择DR0作为初始值页面
  44.         ;配置定时器中断功能        
  45.         LDBR        R10,0x90,1
  46.         MOVRD        R10,45,1                                ;使能定时中断-2
  47.         LDWR        R10,0xC350
  48.         MOVRD        R10,48,2                                ;设置定时时间-500ms
  49.         
  50. ;规定【R100~R199】为双字节数据空间-数据操作
  51.         LDWR        R100,DATA_DOUBLE_0                ;实时坐标X轴        
  52.         LDWR        R102,DATA_DOUBLE_0                ;实时坐标Y轴        
  53.         LDWR        R104,DATA_X1_START                ;X轴第1列起点
  54.         LDWR        R106,DATA_X1_OVER                ;X轴第1列终点
  55.         LDWR        R108,DATA_X2_START                ;X轴第2列起点
  56.         LDWR        R110,DATA_X2_OVER                ;X轴第2列终点
  57.         LDWR        R112,DATA_X3_START                ;X轴第3列起点
  58.         LDWR        R114,DATA_X3_OVER                ;X轴第3列终点
  59.         LDWR        R116,DATA_Y1_START                ;Y轴第1行起点
  60.         LDWR        R118,DATA_Y1_OVER                ;Y轴第1行终点
  61.         LDWR        R120,DATA_Y2_START                ;Y轴第2行起点
  62.         LDWR        R122,DATA_Y2_OVER                ;Y轴第2行终点
  63.         LDWR        R124,DATA_Y3_START                ;Y轴第3行起点
  64.         LDWR        R126,DATA_Y3_OVER                ;Y轴第3行终点               
  65.         LDWR        R128,DATA_DOUBLE_0                ;九宫格列数X【1~3】
  66.         LDWR        R130,DATA_DOUBLE_0                ;九宫格行数Y【1~3】
  67.         LDWR        R132,DATA_DOUBLE_0                ;保留上次的九宫格列数X【1~3】
  68.         LDWR        R134,DATA_DOUBLE_0                ;保留上次的九宫格行数Y【1~3】        
  69.         LDWR        R136,DATA_DOUBLE_0                ;实时NUM值
  70.         LDWR        R138,DATA_DOUBLE_0                ;保留上次的的NUM值
  71.         LDWR        R140,DATA_DOUBLE_0                ;记录NUM值的个数
  72.         LDWR        R142,ADDR_UNLOCK                ;记录解锁密码的地址
  73.         LDWR        R144,DATA_DOUBLE_0                ;9个密码的位标志
  74.         LDWR        R196,DATA_DOUBLE_0                ;显示页面临时变量                                       
  75.         LDWR        R198,DATA_DOUBLE_0                ;当前显示页面        

  76. ;规定【R200~R255】为单字节数据空间-标志位
  77.         LDBR        R200,DATA_SINGLE_0,1        ;记录按压状态
  78.         LDBR        R201,DATA_SINGLE_0,1        ;记录计算结果是否有效        
  79.         LDBR        R203,DATA_SINGLE_0,1        ;记录500ms
  80.         LDBR        R204,DATA_SINGLE_0,1        ;解锁成功标志位
  81.         LDBR        R205,DATA_SINGLE_0,1        ;第一次设定密码有效标志位
  82.         LDBR        R206,DATA_SINGLE_0,1        ;第二次确认密码有效标志位        

  83. ;其他数据初始化
  84.         ;设置基础图形显示-公用
  85.         LDWR        R10,0x000A                                ;基本图形显示-线段显示
  86.         LDWR        R12,0x0001                                ;数据包为1个
  87.         ;设置基础图形显示-交叉红线
  88.         LDWR        R14,DATA_COOR_COLOR                ;颜色为红色
  89.         LDWR        R0,ADDR_GRAPSHOW0                ;显示界面-竖线
  90.         MOVXR        R10,0,3                                
  91.         LDWR        R0,ADDR_GRAPSHOW1                ;显示界面-横线
  92.         MOVXR        R10,0,3        
  93.         ;设置基础图形显示-九宫格连线
  94.         LDWR        R14,DATA_LINK_COLOR                ;颜色为黑色
  95.         LDWR        R0,ADDR_PRESS                        ;按压点1
  96.         LDWR        R20,8                                        ;共8个连线界面,循环8次
  97.         XH_0:
  98.         MOVXR        R10,0,3                        
  99.         INC                R0,1,ADDR_PRESS_OFFSET
  100.         DJNZ        R20,1,XH_0
  101.         ;解锁密码初始化,如果未设定密码,就把初始密码12369写入到数据库保存
  102. ;        CALL        NOR_FLASH_R                                ;读取数据库中的密码放置密码保存区域
  103.         CALL        NAND_FLASH_R                        ;读取数据库中的密码放置密码保存区域        
  104.         LDWR        R0,ADDR_PWDSET
  105.         INC                R0,1,0x09                                ;密码设定标志位在数据库的09处
  106.         MOVXR        R10,1,1
  107.         IJNE        R11,0,DINIT_RET                        ;如果标志位不为0,说明已经设定过密码了
  108.         LDWR        R20,0x0001                                ;否则设置初始解锁密码
  109.         LDWR        R22,0x0002
  110.         LDWR        R24,0x0003        
  111.         LDWR        R26,0x0006
  112.         LDWR        R28,0x0009
  113.         LDWR        R0,ADDR_PWDSET
  114.         MOVXR        R20,0,5
  115. ;        CALL        NOR_FLASH_W                                ;将初始密码更新到数据库
  116.         CALL        NAND_FLASH_W                                ;将初始密码更新到数据库
  117.                         
  118. DINIT_RET:
  119.         RET


  120. ;******************************************************************************
  121. ;Fuction:数据库读写--解锁密码的读取和写入
  122. ;******************************************************************************
  123. NOR_FLASH_R:        
  124. ;片内 Nor  Flash 数据库读取
  125.         LDWR        R10,0x5A00
  126.         GOTO        NOR_FLASH_RET
  127. NOR_FLASH_W:
  128. ;片内 Nor  Flash 数据库写入
  129.         LDWR        R10,0xA500
  130. NOR_FLASH_RET:        
  131.         ;将数据读/写到用于存储解锁密码的地址区域
  132.         LDWR        R12,0x0000
  133.         LDWR        R14,ADDR_PWDSET
  134.         LDWR        R16,0x0010
  135.         LDWR        R0,ADDR_NOR_FLASH
  136.         MOVXR        R10,0,4
  137.         ;判断数据库写操作是否完成,等CPU操作完清零
  138.         XH_6:        NOP                                
  139.         MOVXR        R40,1,1
  140.         IJNE        R40,0,XH_6
  141.         RET
  142.         
  143. NAND_FLASH_R:        
  144. ;片内 Nand  Flash 数据库读取
  145.         LDWR        R10,0x5A01
  146.         GOTO        NAND_FLASH_RET
  147. NAND_FLASH_W:
  148. ;片内 Nadn  Flash 数据库写入
  149.         LDWR        R10,0x5A02
  150. NAND_FLASH_RET:        
  151.         ;将数据读/写到用于存储解锁密码的地址区域
  152.         LDWR        R12,0x4000
  153.         LDWR        R14,0x0000        
  154.         LDWR        R16,ADDR_PWDSET
  155.         LDWR        R18,0x0010
  156.         LDWR        R20,0x0000        
  157.         LDWR        R0,ADDR_NAND_FLASH
  158.         MOVXR        R10,0,6
  159.         ;判断数据库写操作是否完成,等CPU操作完清零
  160.         XH_11:        NOP                                
  161.         MOVXR        R40,1,1
  162.         IJNE        R40,0,XH_11        
  163.         RET        
  164.         
  165. ;******************************************************************************
  166. ;Fuction:设置文本显示的点阵大小,用于控制文本是否显示
  167. ;******************************************************************************
  168. TEXT_SHOW:
  169.         INC                R0,1,000AH                                ;控制点阵大小的位置需要偏移
  170.         LDWR        R10,DATA_TIP_FONT                ;点阵大小设置为32*32
  171.         MOVXR        R10,0,1                        
  172.         RET
  173.         
  174. TEXT_SHOW_NONE:
  175.         INC                R0,1,000AH                                ;控制点阵大小的位置需要偏移
  176.         LDWR        R10,0101H                                ;点阵大小设置为1*1,将不显示
  177.         MOVXR        R10,0,1        
  178.         RET

  179. ;******************************************************************************
  180. ;Fuction:设定解锁密码之前的初始化
  181. ;******************************************************************************        
  182. PSWSET1_INIT:
  183.         ;第一次输入密码提示-显示
  184.         LDWR        R0,ADDR_TIP_SET1_P                ;文本显示的指针
  185.         CALL        TEXT_SHOW
  186.         ;解锁图案错误提示-不显示
  187.         LDWR        R0,ADDR_TIP_ERROR1_P        ;文本显示的指针
  188.         CALL        TEXT_SHOW_NONE
  189. PSWSET1_INIT_RET:
  190.         RET
  191.         
  192. ;******************************************************************************
  193. ;Fuction:设定解锁密码流程
  194. ;******************************************************************************        
  195. PSWSET1:
  196.         CALL        GET_PICID                                ;获取当前页面ID
  197.         CALL        GET_COOR                                ;获取坐标数据并显示
  198.         ;判断按压状态
  199.         IJNE        R200,0x00,1                                ;根据TP状态值,00=松开
  200.         GOTO        PSWSET1                                        ;重新开始等待按压
  201.         IJNE        R200,0x02,1                                ;根据TP状态值,02=抬起
  202.         GOTO        FINGER_UP1                                ;按压结束
  203.         ;记录按压的数据
  204.         CALL        CALCU_XY_NUM                        ;根据坐标数据计算行列值和NUM值
  205.         IJNE        R201,0x01,PSWSET1                ;如果计算结果无效,则重新开始等待按压
  206.         CALL        RECORD                                        ;记录NUM值,NUM值的个数,记录输入密码
  207.         GOTO        PSWSET1
  208.                
  209. FINGER_UP1:        
  210.         IJNE        R141,0,1                                ;如果NUM的个数等于0,说明没有手指按下
  211.         GOTO        PSWSET1
  212.         CALL        PSW_CHECK1
  213.         IJNE        R205,0x01,PSWSET1                ;如果密码无效,则重新开始等待按压        
  214.                
  215. PSWSET1_RET:
  216.         RET
  217.         
  218. ;******************************************************************************
  219. ;Fuction:抬手后进行密码长度判断
  220. ;******************************************************************************               
  221. PSW_CHECK1:
  222.         ;判断密码数是否小于4个
  223.         LDWR        R10,DATA_PWD_LEN
  224.         JS                R140,R10,PSW_BAD

  225. PSW_OK:                                                                ;密码合法
  226.         LDBR        R205,1,1                                ;密码有效标志位
  227.         LDWR        R0,ADDR_UNLOCK
  228.         LDWR        R2,ADDR_PWDSET1
  229.         MOVXX        10                                                ;把刚才设定的密码暂存起来
  230.         LDWR        R10,PAGE_PSWSET2                ;由R10指定页面ID        
  231.         CALL        JUMP_PICID                                ;跳转到指定页面        
  232.         GOTO        PSW_CHECK_LATER

  233. PSW_BAD:                                                        ;密码无效
  234.         LDBR        R205,0,1                                ;密码有效标志位
  235.         ;第一次输入密码提示-不显示
  236.         LDWR        R0,ADDR_TIP_SET1_P                ;文本显示的指针
  237.         CALL        TEXT_SHOW_NONE
  238.         ;解锁图案错误提示-显示
  239.         LDWR        R0,ADDR_TIP_ERROR1_P        ;文本显示的指针
  240.         CALL        TEXT_SHOW
  241.         LDBR        R203,DATA_SINGLE_0,1        ;记录500ms
  242.         XH_9:        NOP
  243.         IJNE        R203,3,XH_9                                ;等待1s后再去清除数据

  244. PSW_CHECK1_RET:
  245.         CALL         PSW_CHECK_LATER
  246.         RET  

  247. ;******************************************************************************
  248. ;Fuction:确认解锁密码之前的初始化
  249. ;******************************************************************************        
  250. PSWSET2_INIT:
  251.         ;第一次输入密码提示-显示
  252.         LDWR        R0,ADDR_TIP_SET2_P                ;文本显示的指针
  253.         CALL        TEXT_SHOW
  254.         ;解锁图案错误提示-不显示
  255.         LDWR        R0,ADDR_TIP_ERROR2_P        ;文本显示的指针
  256.         CALL        TEXT_SHOW_NONE
  257.         
  258. PSWSET2_INIT_RET:
  259.         RET
  260.         
  261. ;******************************************************************************
  262. ;Fuction:确认解锁密码流程
  263. ;******************************************************************************        
  264. PSWSET2:
  265.         CALL        GET_PICID                                ;获取当前页面ID
  266.         CALL        GET_COOR                                ;获取坐标数据并显示
  267.         ;判断按压状态
  268.         IJNE        R200,0x00,1                                ;根据TP状态值,00=松开
  269.         GOTO        PSWSET2                                        ;重新开始等待按压
  270.         IJNE        R200,0x02,1                                ;根据TP状态值,02=抬起
  271.         GOTO        FINGER_UP2                                ;按压结束
  272.         ;记录按压的数据
  273.         CALL        CALCU_XY_NUM                        ;根据坐标数据计算行列值和NUM值
  274.         IJNE        R201,0x01,PSWSET2                ;如果计算结果无效,则重新开始等待按压
  275.         CALL        RECORD                                        ;记录NUM值,NUM值的个数,记录输入密码
  276.         GOTO        PSWSET2
  277.                
  278. FINGER_UP2:        
  279.         IJNE        R141,0,1                                ;如果NUM的个数等于0,说明没有手指按下
  280.         GOTO        PSWSET2
  281.         CALL        PSW_CHECK2
  282.         IJNE        R206,0x01,PSWSET2                ;如果密码不同,则重新开始等待按压        

  283. PSWSET2_RET:
  284.         RET

  285. ;******************************************************************************
  286. ;Fuction:抬手后进行密码一致性判断
  287. ;******************************************************************************               
  288. PSW_CHECK2:
  289.         ;利用序列快速比较两组密码是否相同
  290.         LDWR        R0,ADDR_UNLOCK
  291.         MOVXR        R20,1,10
  292.         LDWR        R0,ADDR_PWDSET1
  293.         MOVXR        R40,1,10
  294.         TESTS        R20,R40,18                                ;最多9个密码
  295.         IJNE        R0,0x00,PSW_DIFF        

  296. PSW_SAME:                                                        ;密码一致
  297.         LDBR        R206,1,1                                ;密码有效标志位
  298.         LDWR        R0,ADDR_UNLOCK
  299.         LDWR        R2,ADDR_PWDSET
  300.         MOVXX        10                                                ;把设定的密码放置到数据库保存起来
  301.         LDWR        R0,ADDR_PWDSET
  302.         INC                R0,1,0x09
  303.         LDWR        R10,1
  304.         MOVXR        R10,0,1                                        ;给密码设置标志位置1,下次启动将不使用初始密码
  305. ;        CALL        NOR_FLASH_W
  306.         CALL        NAND_FLASH_W        
  307.         LDWR        R10,PAGE_INDEX                        ;由R10指定页面ID        
  308.         CALL        JUMP_PICID                                ;跳转到指定页面        
  309.         GOTO        PSW_CHECK_LATER

  310. PSW_DIFF:                                                        ;密码不同
  311.         LDBR        R206,0,1                                ;密码有效标志位
  312.         ;第一次输入密码提示-不显示
  313.         LDWR        R0,ADDR_TIP_SET2_P                ;文本显示的指针
  314.         CALL        TEXT_SHOW_NONE
  315.         ;解锁图案错误提示-显示
  316.         LDWR        R0,ADDR_TIP_ERROR2_P        ;文本显示的指针
  317.         CALL        TEXT_SHOW
  318.         LDBR        R203,DATA_SINGLE_0,1        ;记录500ms
  319.         XH_10:        NOP
  320.         IJNE        R203,3,XH_10                        ;等待1s后再去清除数据

  321. PSW_CHECK2_RET:
  322.         CALL         PSW_CHECK_LATER
  323.         RET  
  324.                                        
  325. ;******************************************************************************
  326. ;Fuction:九宫格解锁流程之前的初始化
  327. ;******************************************************************************
  328. UNLOCK_INIT:
  329.         ;第一次输入密码提示-显示
  330.         LDWR        R0,ADDR_TIP_INPUT_P                ;文本显示的指针
  331.         CALL        TEXT_SHOW
  332.         ;解锁图案错误提示-不显示
  333.         LDWR        R0,ADDR_TIP_ERROR_P                ;文本显示的指针
  334.         CALL        TEXT_SHOW_NONE
  335.         ;获取解锁密码
  336. ;        CALL        NOR_FLASH_R
  337.         CALL        NAND_FLASH_R
  338.         
  339. UNLOCK_INIT_RET:
  340.                 RET
  341.                
  342. ;******************************************************************************
  343. ;Fuction:九宫格解锁流程
  344. ;******************************************************************************
  345. UNLOCK:
  346.         CALL        GET_PICID                                ;获取当前页面ID
  347.         CALL        GET_COOR                                ;获取坐标数据并显示
  348.         ;判断按压状态
  349.         IJNE        R200,0x00,1                                ;根据TP状态值,00=松开
  350.         GOTO        UNLOCK                                        ;重新开始等待按压
  351.         IJNE        R200,0x02,1                                ;根据TP状态值,02=抬起
  352.         GOTO        FINGER_UP                                ;按压结束
  353.         ;记录按压的数据
  354.         CALL        CALCU_XY_NUM                        ;根据坐标数据计算行列值和NUM值
  355.         IJNE        R201,0x01,UNLOCK                ;如果计算结果无效,则重新开始等待按压
  356.         CALL        RECORD                                        ;记录NUM值,NUM值的个数,记录输入密码
  357.         GOTO        UNLOCK
  358.         
  359. FINGER_UP:        
  360.         IJNE        R141,0,1                                ;如果NUM的个数等于0,说明没有手指按下
  361.         GOTO        UNLOCK
  362.         CALL        PSW_CHECK
  363.         IJNE        R204,0x01,UNLOCK                ;如果解锁失败,则重新开始等待按压        
  364.                
  365. UNLOCK_RET:
  366.         RET  
  367.         
  368. ;******************************************************************************
  369. ;Fuction:抬手后进行密码判断
  370. ;******************************************************************************               
  371. PSW_CHECK:
  372.         ;利用序列快速比较两组密码是否相同
  373.         LDWR        R0,ADDR_UNLOCK
  374.         MOVXR        R20,1,10
  375.         LDWR        R0,ADDR_PWDSET
  376.         MOVXR        R40,1,10
  377.         TESTS        R20,R40,18                                ;最多9个密码
  378.         IJNE        R0,0x00,PSW_ERROR        

  379. PSW_CURRECT:                                                ;密码正确
  380.         LDBR        R204,1,1                                ;解锁成功标志位
  381.         LDWR        R10,PAGE_INDEX                        ;由R10指定页面ID        
  382.         CALL        JUMP_PICID                                ;跳转到指定页面
  383.         GOTO        PSW_CHECK_LATER                        ;清除数据

  384. PSW_ERROR:                                                        ;密码错误        
  385.         LDBR        R204,0,1                                ;解锁成功标志位
  386.         ;第一次输入密码提示-不显示
  387.         LDWR        R0,ADDR_TIP_INPUT_P                ;文本显示的指针
  388.         CALL        TEXT_SHOW_NONE
  389.         ;解锁图案错误提示-显示
  390.         LDWR        R0,ADDR_TIP_ERROR_P                ;文本显示的指针
  391.         CALL        TEXT_SHOW
  392.         LDBR        R203,DATA_SINGLE_0,1        ;记录500ms
  393.         XH_4:        NOP
  394.         IJNE        R203,3,XH_4                                ;等待1s后再去清除数据
  395.         
  396. PSW_CHECK_LATER:
  397.         LDWR        R138,DATA_DOUBLE_0                ;保留上次的的NUM值        
  398.         LDWR        R140,DATA_DOUBLE_0                ;记录NUM值的个数        
  399.         LDWR        R142,ADDR_UNLOCK                ;地址进行过自加,需要重新设置存储解锁密码的地址
  400.         LDWR        R144,DATA_DOUBLE_0                ;9个密码的位标志        
  401.         
  402.         LDBR        R10,0,20
  403.         LDWR        R0,ADDR_ICON
  404.         MOVXR        R10,0,10                                ;清除图标变量显示                        
  405.         LDWR        R0,ADDR_UNLOCK
  406.         MOVXR        R10,0,10                                ;清除密码        
  407.         
  408.         LDWR        R0,ADDR_PRESS                        ;按压点1
  409.         LDWR        R20,8                                        ;共8个连线界面,循环8次
  410.         LDBR        R10,0,8
  411.         INC                R0,1,3                                        ;地址偏移3位
  412.         XH_5:
  413.         MOVXR        R10,0,4                        
  414.         INC                R0,1,ADDR_PRESS_OFFSET
  415.         DJNZ        R20,1,XH_5

  416. PSW_CHECK_RET:
  417.         RET  

  418. ;******************************************************************************
  419. ;Fuction:记录NUM值,NUM值的个数,记录输入密码
  420. ;******************************************************************************        
  421. RECORD:
  422.         ;判断是否重复区域
  423.         CJNE        R137,R139,1                                ;如果本次计算的NUM和上一次的NUM相同,则不计入密码
  424.         GOTO        RECORD_RET
  425.         ;判断是否重复密码        
  426.         MOV                R144,R10,2                                ;获取当前密码的位标志
  427.         MOV                R136,R12,2                                ;获取当前的NUM密码
  428.         IJNE        R13,1,1                                        ;如果当前密码值为1,说明不需要移位
  429.         GOTO        PSW_BIT_CHECK
  430.         DEC                R12,0x0001,1               
  431.         XH_2:
  432.         SHR                R10,2,1
  433.         DJNZ        R12,1,XH_2                                ;将位标志移位到首位,用于判断
  434.         PSW_BIT_CHECK:        
  435.         LDWR        R20,0x01
  436.         AND         R11,R21,1
  437.         IJNE        R11,1,1                                        ;如果本次计算的NUM已经计入密码,则不再计入密码
  438.         GOTO        RECORD_RET               
  439.         
  440.         ;设置变量图标
  441.         LDBR        R30,0,50                                ;临时变量数据清空        
  442.         LDWR        R32,ADDR_ICON                        ;获取变量图标的起始地址                                
  443.         MOV                R136,R42,2                        
  444.         ADD                R30,R40,R50                                ;根据NUM计算需要显示的位置
  445.         MOV         R56,R0,2                                ;重新指定变量图标的地址
  446.         LDWR        R10,DATA_ICON_SHOW        
  447.         MOVXR        R10,0,1                                        ;显示变量图标
  448.         ;存储输入密码        
  449.         MOV         R142,R0,2                                ;获取存储解锁密码的地址        
  450.         MOVXR        R42,0,1                                        ;存储密码
  451.         INC                R142,1,1                                ;密码地址增加1次        
  452.         ;记录本次的NUM值和次数
  453.         MOV                R136,R138,2                                ;保存本次的NUM结果,用于下次比对
  454.         INC                R140,1,1                                ;NUM值的个数增加1次
  455.         ;给密码位置记录1,标记此密码已经被记录
  456.         LDWR        R10,0x0001
  457.         MOV                R136,R12,2
  458.         IJNE        R13,1,1
  459.         GOTO        PSW_BIT_CALCU        
  460.         DEC                R12,0x0001,1        
  461.         XH_3:
  462.         SHL                R10,2,1
  463.         DJNZ        R12,1,XH_3
  464.         PSW_BIT_CALCU:
  465.         OR                R144,R10,2                                
  466.         
  467.         ;记录第一次按压时的行列值
  468.         IJNE        R141,0x01,3                                ;绘制连接线需要上一次的坐标数据
  469.         MOV                R128,R132,2
  470.         MOV                R130,R134,2
  471.         GOTO        RECORD_RET
  472.         CALL        DRAW_LINE                                ;根据按压的位置,绘制连接线
  473.                         
  474. RECORD_RET:        
  475.         RET
  476.         
  477. ;******************************************************************************
  478. ;Fuction:根据按压的位置,绘制连接线
  479. ;******************************************************************************
  480. DRAW_LINE:         
  481.         ;坐标X1 = DATA_NUM1_X + DATA_COOR_OFFSET*(行数-1)
  482.         LDBR        R10,DATA_SINGLE_0,50
  483.         MOV                R132,R10,2                                ;获取上次的行数据
  484.         DEC                R10,1,1                                        ;自减1,用于计算坐标
  485.         LDWR        R20,DATA_COOR_OFFSET
  486.         SMAC        R10,R20,R30
  487.         LDWR        R42,DATA_NUM1_X                                
  488.         ADD                R30,R40,R50
  489.         MOV                R56,R80,2                                ;保留X1坐标
  490.         
  491.         ;坐标Y1 = DATA_NUM1_Y + DATA_COOR_OFFSET*(列数-1)        
  492.         LDBR        R10,DATA_SINGLE_0,50
  493.         MOV                R134,R10,2                                ;获取上次的行数据
  494.         DEC                R10,1,1                                        ;自减1,用于计算坐标
  495.         LDWR        R20,DATA_COOR_OFFSET
  496.         SMAC        R10,R20,R30
  497.         LDWR        R42,DATA_NUM1_Y                                
  498.         ADD                R30,R40,R50
  499.         MOV                R56,R82,2                                ;保留Y1坐标
  500.         
  501.         ;坐标X2 = DATA_NUM1_X + DATA_COOR_OFFSET*(行数-1)
  502.         LDBR        R10,DATA_SINGLE_0,50
  503.         MOV                R128,R10,2                                ;获取上次的行数据
  504.         DEC                R10,1,1                                        ;自减1,用于计算坐标
  505.         LDWR        R20,DATA_COOR_OFFSET
  506.         SMAC        R10,R20,R30
  507.         LDWR        R42,DATA_NUM1_X                                
  508.         ADD                R30,R40,R50
  509.         MOV                R56,R84,2                                ;保留X2坐标
  510.         
  511.         ;坐标Y2 = DATA_NUM1_Y + DATA_COOR_OFFSET*(列数-1)        
  512.         LDBR        R10,DATA_SINGLE_0,50
  513.         MOV                R130,R10,2                                ;获取上次的行数据
  514.         DEC                R10,1,1                                        ;自减1,用于计算坐标
  515.         LDWR        R20,DATA_COOR_OFFSET
  516.         SMAC        R10,R20,R30
  517.         LDWR        R42,DATA_NUM1_Y                                
  518.         ADD                R30,R40,R50
  519.         MOV                R56,R86,2                                ;保留Y2坐标
  520.         
  521.         LDWR        R0,ADDR_PRESS                        ;组合成基本图形数据包,一起发送        
  522.         MOV                R140,R10,2
  523.         DEC                R10,1,2
  524.         LDWR        R12,1
  525.         JS                R10,R12,2
  526.         XH_1:
  527.         INC                R0,1,ADDR_PRESS_OFFSET
  528.         DJNZ        R10,1,XH_1
  529.         INC                R0,1,3                                        ;地址偏移3位
  530.         MOVXR        R80,0,4               
  531.                
  532. DRAW_LINE_RET:
  533.         MOV                R128,R132,2
  534.         MOV                R130,R134,2
  535.         RET               
  536.         
  537. ;******************************************************************************
  538. ;Fuction:根据坐标数据计算行列值和NUM值
  539. ;******************************************************************************        
  540. CALCU_XY_NUM:
  541.         ;计算X值-列
  542. CALCU_X:                                                
  543.         JS                R100,R104,CALCU_INVALID
  544.         JS                R106,R100,2
  545.         LDWR        R128,1                                        ;九宫格起始值X=1
  546.         GOTO        CALCU_Y        
  547.         JS                R100,R108,CALCU_INVALID
  548.         JS                R110,R100,2        
  549.         LDWR        R128,2                                        ;九宫格起始值X=2
  550.         GOTO        CALCU_Y                                
  551.         JS                R100,R112,CALCU_INVALID
  552.         JS                R114,R100,2        
  553.         LDWR        R128,3                                        ;九宫格起始值X=3
  554.         GOTO        CALCU_Y
  555.         GOTO        CALCU_INVALID        
  556.         ;计算Y值-行
  557. CALCU_Y:
  558.         JS                R102,R116,CALCU_INVALID
  559.         JS                R118,R102,2
  560.         LDWR        R130,1                                        ;九宫格起始值Y=1
  561.         GOTO        CALCU_NUM
  562.         JS                R102,R120,CALCU_INVALID
  563.         JS                R122,R102,2        
  564.         LDWR        R130,2                                        ;九宫格起始值Y=2
  565.         GOTO        CALCU_NUM                        
  566.         JS                R102,R124,CALCU_INVALID
  567.         JS                R126,R102,2        
  568.         LDWR        R130,3                                        ;九宫格起始值Y=3
  569.         GOTO        CALCU_NUM        
  570.         GOTO        CALCU_INVALID        
  571.         ;计算NUM值-数字
  572. CALCU_NUM:
  573.         ;根据X和Y值计算需要记录的NUM = (y-1)*3+x
  574.         LDBR        R30,0,50                                ;临时变量数据清空        
  575.         MOV                R128,R32,2                                ;提取列数X
  576.         MOV                R130,R40,2                                ;提取行数Y
  577.         DEC                R40,1,1                                        ;y-1
  578.         LDWR        R50,0x0003                                ;乘法器需要16bit数据,得到32bit数据
  579.         SMAC        R40,R50,R60                                ;(y-1)*3
  580.         ADD                R60,R30,R70                                ;(y-1)*3+x
  581.         MOV                R76,R136,2                                ;把计算的最终结果赋值给NUM
  582.         
  583. CALCU_XY_NUM_RET:
  584.         LDBR        R201,0x01,1                                ;计算结果有效
  585.         RET
  586. CALCU_INVALID:
  587.         LDBR        R201,0x00,1                                ;计算结果无效
  588.         RET
  589.         
  590. ;******************************************************************************
  591. ;Fuction:获取坐标数据并显示
  592. ;******************************************************************************
  593. GET_COOR:
  594.         ;从TP状态寄存器读取按压状态和实时坐标
  595.         LDWR    R0,ADDR_TP_STATUS                ;获取TP的状态数据
  596.         MOVXR   R10,1,4                                        ;【R10~R17】8个字节数据
  597.         MOV                R11,R200,1                                ;记录按压状态        
  598.         MOV                R12,R100,2                                ;实时坐标X轴-坐标0
  599.         MOV                R14,R102,2                                ;实时坐标Y轴-坐标0        
  600.         
  601.         ;在界面上显示XY轴当前坐标值        
  602.         LDWR    R0,ADDR_COX                                ;显示实时坐标X轴
  603.         MOVXR   R100,0,1
  604.         LDWR    R0,ADDR_COY                                ;显示实时坐标Y轴
  605.         MOVXR   R102,0,1
  606.         
  607.         ;使用交叉红线定位坐标位置
  608.         ;显示竖线
  609.         MOV                R100,R20,2                                ;起点X-提取实时坐标X
  610.         LDWR        R22,0x0000                                ;起点Y-最小值0
  611.         MOV                R100,R24,2                                ;终点X-提取实时坐标X
  612.         LDWR        R26,DATA_PIXEL_Y                ;终点Y-最大值854
  613.         LDWR        R0,ADDR_GRAPSHOW0                ;组合成基本图形数据包,一起发送
  614.         INC                R0,1,3                                        ;地址偏移3位
  615.         MOVXR        R20,0,4        
  616.         ;显示横线
  617.         LDWR        R20,0x0000                                ;起点X-最小值0
  618.         MOV                R102,R22,2                                ;起点Y-提取实时坐标Y
  619.         LDWR        R24,DATA_PIXEL_X                ;终点X-最大值480
  620.         MOV                R102,R26,2                                ;终点Y-提取实时坐标Y
  621.         LDWR        R0,ADDR_GRAPSHOW1                ;组合成基本图形数据包,一起发送        
  622.         INC                R0,1,3                                        ;地址偏移3位        
  623.         MOVXR        R20,0,4
  624.         
  625. GET_COOR_RET:
  626.         RET         

  627. ;******************************************************************************
  628. ;Fuction:切换到指定页面ID-由调用函数前的 R10寄存器 指定
  629. ;******************************************************************************
  630. JUMP_PICID:
  631.         LDWR        R20,0x5A01
  632.         MOV                R10,R22,2                                
  633.         LDWR        R0,0084H                        
  634.         MOVXR   R20,0,2                                        ;页面切换        
  635.         XH_7:        NOP        
  636.         LDWR        R0,ADDR_PIC_NOW
  637.         MOVXR        R20,1,1
  638.         CJNE        R21,R11,XH_7        
  639.         
  640. JUMP_PICID_RET:
  641.         RET  
  642.                
  643. ;******************************************************************************
  644. ;Fuction:获取当前页面ID
  645. ;******************************************************************************
  646. GET_PICID:
  647.         LDWR        R0,ADDR_PIC_NOW
  648.         MOVXR        R196,1,1
  649.         ;判断当前页面与上一次的页面是否相同,不同:跳转到START重新开始
  650.         CJNE        R196,R198,2
  651.         CJNE        R197,R199,1
  652.         GOTO        GET_PICID_RET        
  653.         MOV                R196,R198,2
  654.         GOTO        START        
  655.         
  656. GET_PICID_RET:
  657.         RET  
  658.         
  659. ;******************************************************************************
  660. ;Fuction:中断处理程序
  661. ;******************************************************************************
  662. ;T0INT:        NOP                        ;T0中断处理程序
  663. ;
  664. ;T0INT_RET:        
  665. ;        RETI                        ;必须使用RETI结束,不能使用RET

  666. T2INT:        NOP                        ;T2中断处理程序
  667.         INC                R203,0,1
  668.         
  669. T2INT_RET:        
  670.         RETI
  671.         
  672. [/size]

回帖(1)

王栋春

2019-2-20 21:56:28
对此不太了解  围观一下
举报

更多回帖

发帖
×
20
完善资料,
赚取积分