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的星期换成中文
- [size=4]; DWIN OS
- LDBR R10,0,16
- MOVDR 23H,R13,1 ;DGUS屏的23寄存器给到os寄存器R13放星期0-6表示 日、一、二、。。。六
- LDWR R16,2 ;乘以2,这里用乘法是用查表的字节
- MAC R10,R14,R18 ;乘积放入了os寄存器8个 18 19 20 21 22 23 24 25
- LDADR TAB2 ;加载TAB2,这里tab1和2是一样的,存到的地址会到os的寄存器 5 6 7
- ADD R22,R4,R30 ;30 31 32 33 34 35 36 37是和=查表地址的起始地址+星期号*2字节数
- MOV R34,R4,4 ; os的寄存器5 6 7是多少我们不用管,只需要知道有起始地址了根据星期是多少来加载新的地址
- MOVC R24,2
- LDWR R0,0002H ;0002H地址是用的文本显示,再吧R24里面的星期给进去到屏上面变量地址显示就行
- MOVXR R24,0,1
- END
- TAB1:
- DW 0XC8D5,0XD2BB,0XB6FE,0XC8FD,0XCBC4,0XCEE5,0XC1F9 ;日一二三四五六
- TAB2:
- 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。
- CALL 进度条
- END
- 进度条:
- LDWR R0,0005H ;0005h是一个整数类型的数据显示0-100,这里可以利用控件设置带好单位%
- MOVXR R70,1,1
- LDWR, R116,0004H ;加载变量命令及固定不变坐标量
- LDWR R118,0001H
- LDWR R120,20
- LDWR R122,280
- LDWR R126,300
- LDWR R128,F800H
- LDWR R140,4
- LDBR R142,0,30 ;清零变量
- MOV R70,R142,2
- SMAC R140,R142,R144 ;乘4
- LDWR R150,20
- ADD R144,R148,R152 ;加20
- MOV R158,R124,2
- LDWR R0,0020H ;基本图形用来显示矩形填充的地址0020H
- MOVXR R116,0,7
- RET
2.3 实现显示上电运行时间和总运行时间
DGUS屏有一个上电运行时间的寄存器,占用4个字节空间,这个寄存器里面的时间是BCB编码,我们屏上面显示的时候可以用时间变量,也是就是16进制变量直接调取出来显示,这样直接就能调用这个程序是怎么显示上电运行时间,和将总运行时间保存到数据的写法。
因为数据擦写寿命限制,理论寿命10万次,经过本人几次测试某段地址的擦写情况,实际寿命只有5-8万次,运气不好可能3万次左右,我们这里采用变化了1个小时就进行时间的保存,如果要细写也可以写15分钟30分钟保存一次。
os示例如下:
- CALL 运行时间
- CALL 累计时间
- END
- ;============================================================
- 运行时间:
- MOVDR 0CH,R10,4 ;主页面显示运行时间
- LDWR R0,0020H
- MOVXR R11,0,2
- ONE-H-MARK:
- CJNE R11,R245,R><245;判断小时是否变化,变化了说明经过一个小时了,
- GOTO GND
- R><245:
- MOV R11,R245,1
- LDWR R4,0018H ;
- LDWR R6,0030H ;
- LDWR R0,0060H ;数据库清零测5A A5 0C 80 56 5A 50 0018 0030 1000 0001
- MOVXL 2,1
- MOVXR R32,1,1 ;字
- LDWR R22,1
- ADD R20,R30,R40 ;加法将时间加一个小时,
- MOVXR R46,0,1
- MOVXL 3,1 ;保存到数据库
- GND:
- RET
- ;============================================================
- 累计时间:
- LDWR R4,0018H ;
- LDWR R6,0030H ;
- LDWR R0,0004H ;从数据库读出来
- MOVXL 2,1
- RET
- ;==================================================
2.4 利用OS实现加密键盘
- ORG 1000H
- GOTO START
- NOP
- NOP
- NOP
- ORG 1080H
- START:
- LDWR R0,5000H
- LDADR STRING
- MOVC R100,64
- MOVXR R100,0,32
- LDWR R20,5AA5H
- LDWR R22,0000H;上电禁用掉数据录入控件
- LDWR R24,0100H
- LDWR R26,0000H
- LDWR R0,00B0H
- MOVXR R20,0,4
-
- MAIN:
- CALL ANYA_CHUFA
- CALL CK_LURU
- CALL CK_CHANGE
- GOTO MAIN
- ;====================
- ;====================
- ANYA_CHUFA:
- LDWR R0,1F00H
- MOVXR R10,1,1
- IJNE R11,0,1
- RET
- LDWR R0,00B0H
- LOOP: MOVXR R10,1,1
- IJNE R10,0,LOOP ;开启本条指令
- IJNE R11,0,LOOP
- LDWR R20,5AA5H
- LDWR R22,0000H
- LDWR R24,0100H
- LDWR R26,0001H
- LDWR R0,00B0H
- MOVXR R20,0,4
-
- LOOP1: MOVXR R10,1,1
- IJNE R10,0,LOOP1 ;模拟触发本条指令
- IJNE R11,0,LOOP1
- LDWR R20,5AA5H
- LDWR R22,0004H
- LDWR R24,100
- LDWR R26,100
- LDWR R0,00D4H
- MOVXR R20,0,4
-
- LDWR R10,0
- LDWR R0,1F00H
- MOVXR R10,0,1
- RET
- ;====================================
- ;====================================
- CK_LURU:
- LDWR R0,1F01H
- MOVXR R10,1,1
- IJNE R11,0,1
- RET
- LDWR R10,1
- LDWR R0,1F02H
- MOVXR R10,0,1
- RET
- ;============================
- CK_CHANGE:
- LDWR R0,1F02H;检查标志位是不是1
- MOVXR R10,1,1
- IJNE R11,0,1
- RET
- LDWR R0,1F01H;在标志位是1的情况下检查是不是在录入状态
- MOVXR R10,1,1
- IJNE R11,1,1
- RET;录入状态直接返回
- LDWR R0,1F02H;标志位清零
- LDWR R10,0
- MOVXR R10,0,1
-
-
-
-
- LDWR R0,5011H
- MOVXR R10,1,1
- DEC R10,1,1
- IJNE R11,1,1
- LDWR R10,12
- MOVXR R10,0,1
- LDWR R0,5000H;录入过程中调用的界面更改
- MOVXR R10,1,32
- LDWR R0,00B4H
- MOVXR R10,0,32
-
-
- LDWR R10,5AA5H;更改该条触控指令
- LDWR R12,0000H
- LDWR R14,0100H
- LDWR R16,0003H
- LDWR R0,00B0H
- MOVXR R10,0,4
- ; LDWR R0,00B0H
- LOOP3: MOVXR R10,1,1
- IJNE R10,0,LOOP3
- IJNE R11,0,LOOP3
- LDWR R20,5AA5H
- LDWR R22,0000H
- LDWR R24,0100H
- LDWR R26,0000H;禁用该条指令
- LDWR R0,00B0H
- MOVXR R20,0,4
-
-
- CK_CHANGE_RET:
- NOP
- RET
- ;=======================================
- STRING:
- 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 实现手势解锁功能
- ORG 1000H ;目前的T5 OS 2.07以上版本已经要求严格按照以下几行的标准格式来了
- GOTO MAIN ;代码的第一条指令必须是GOTO
- ;GOTO T0INT ;中断产生时,跳转到T0中断处理程序,必须使用GOTO,不能用CALL
- NOP
- NOP ;T1中断未使用
- NOP
- ;GOTO T2INT ;中断产生时,跳转到T2中断处理程序
- ORG 1080H ;跳转到主函数MAIN
- ;******************************************************************************
- ;MAIN主流程
- ;******************************************************************************
- MAIN:
- CALL DINIT ;程序第一次运行时需要进行初始化的内容
- START:
- CALL GET_PICID ;获取当前页面ID
- IJNE R198,0x00,OVER ;确保ID的高字节为0
- IJNE R199,PAGE_LOCK,1 ;判断是否为解锁界面
- CALL UNLOCK ;屏保界面解锁功能
- OVER:
- GOTO START
-
- ;******************************************************************************
- ;Fuction:程序第一次运行时需要进行初始化的内容
- ;******************************************************************************
- DINIT:
- ;配置接口寄存器
- ;选择需要初始化的寄存器页
- LDBR R10,0x00,1 ;OS有8个寄存器页切换,DR0=0x00-0x07
- MOVRD R10,0,1 ;选择DR0作为初始值页面
- ;配置定时器中断功能
- ; LDBR R10,0x90,1
- ; MOVRD R10,45,1 ;使能定时中断-2
- ; LDWR R10,0xC350
- ; MOVRD R10,48,2 ;设置定时时间-500ms
- ;自定义【R100~R199】为双字节数据空间--数据操作
- LDWR R100,DATA_DOUBLE_0 ;实时坐标X轴
- LDWR R102,DATA_DOUBLE_0 ;实时坐标Y轴
- LDWR R104,DATA_X0_START ;X轴第0列起点
- LDWR R106,DATA_X1_START ;X轴第1列起点
- LDWR R108,DATA_X2_START ;X轴第2列起点
- LDWR R110,DATA_X3_START ;X轴第3列起点
- LDWR R112,DATA_X4_START ;X轴第4列起点
- LDWR R114,DATA_X4_OVER ;X轴第4列终点
- LDWR R116,DATA_Y1_START ;Y轴第1行起点
- LDWR R118,DATA_Y1_OVER ;Y轴第1行终点
- LDWR R120,DATA_DOUBLE_0 ;解锁ICON赋值为0
- LDWR R196,DATA_DOUBLE_0 ;显示页面临时变量
- LDWR R198,DATA_DOUBLE_0 ;当前显示页面
-
- ;自定义【R200~R255】为单字节数据空间--标志位
- LDBR R200,DATA_SINGLE_0,1 ;X0标志位,为1说明第一块区域已经被按下
-
- ;其他数据初始化
-
- DINIT_RET:
- RET
-
- ;******************************************************************************
- ;Fuction:获取当前页面ID
- ;******************************************************************************
- GET_PICID:
- LDWR R0,ADDR_PIC_NOW
- MOVXR R196,1,1
- ;判断当前页面与上一次的页面是否相同,不同:跳转到START重新开始
- CJNE R196,R198,2
- CJNE R197,R199,1
- GOTO GET_PICID_RET
- MOV R196,R198,2
- GOTO START
-
- GET_PICID_RET:
- RET
- ;******************************************************************************
- ;Fuction:(屏保界面)根据坐标来修改变量图标的数据,如果为4,说明已经解锁完成,跳转到指定页面
- ;******************************************************************************
- UNLOCK:
- CALL GET_PICID ;获取当前页面ID
- ;获取坐标数据
- LDWR R0,ADDR_TP_STATUS ;获取TP的状态数据
- MOVXR R10,1,4 ;【R10~R17】8个字节数据
- MOV R12,R100,2 ;实时坐标X轴
- MOV R14,R102,2 ;实时坐标Y轴
- ;判断是否按下?
- IJNE R11,0x00,1 ;根据TP状态值,00=松开
- GOTO UNLOCK ;重新回到解锁流程
- IJNE R11,0x02,1 ;根据TP状态值,02=抬起
- GOTO UNLOCK_TEST ;判断解锁是否成功
- ;判断Y轴是否满足要求?
- Y_JUDG:
- JS R102,R116,UNLOCK ;如果Y轴大于起点坐标,则继续判断
- JS R118,R102,UNLOCK ;如果Y轴小于终点坐标,则继续判断X轴
- ;判断是否按压了X0?
- X0_FLAG:
- IJNE R200,0x01,1 ;为1说明第一块区域已经被按下
- GOTO X_JUDG
- JS R100,R104,UNLOCK ;如果X轴大于第0列起点坐标,则继续判断
- JS R106,R100,UNLOCK ;如果X轴小于第0列终点坐标,则继续判断下一列
- LDBR R200,0x01,1 ;X0标志位置1
- GOTO UNLOCK
- ;判断X轴是否满足要求?
- X_JUDG:
- JS R100,R104,UNLOCK ;如果X轴大于第0列起点坐标,则继续判断
- JS R106,R100,2 ;如果X轴小于第0列终点坐标,则继续判断下一列
- LDWR R120,0x0000
- GOTO ICON_SHOW
- JS R108,R100,2
- LDWR R120,0x0001
- GOTO ICON_SHOW
- JS R110,R100,2
- LDWR R120,0x0002
- GOTO ICON_SHOW
- JS R112,R100,2
- LDWR R120,0x0003
- GOTO ICON_SHOW
- JS R114,R100,UNLOCK
- LDWR R120,0x0004
- GOTO ICON_SHOW
- ;显示当前位置的ICON图标
- ICON_SHOW:
- LDWR R0,ADDR_JSICON
- MOVXR R120,0,1
- GOTO UNLOCK
- ;抬手后对滑动图标进行判断
- UNLOCK_TEST:
- ;清除数据
- MOV R120,R20,2 ;将按压区域保存在临时数据,用于判断是否可以解锁
- LDWR R0,ADDR_JSICON
- LDWR R120,DATA_DOUBLE_0 ;清除ICON图标数据
- MOVXR R120,0,1
- LDBR R200,DATA_SINGLE_0,1 ;清除X0标志位
- ;解锁成功后跳转到页面3
- IJNE R21,0x04,UNLOCK ;如果等于4,说明可以解锁成功
- LDWR R20,0x5A01
- LDWR R22,0x0003
- LDWR R0,0084H
- MOVXR R20,0,2
- ;等待页面成功跳转到页面3
- WAIT_PAGE3:
- NOP
- LDWR R0,ADDR_PIC_NOW
- MOVXR R20,1,1
- IJNE R21,PAGE_INDEX,WAIT_PAGE3
- GOTO UNLOCK_RET ;解锁流程结束
-
- UNLOCK_RET:
- RET
- ;******************************************************************************
- ;Fuction:中断处理
- ;******************************************************************************
- ; T0INT: NOP ;T0中断处理程序
- ;
- ; RETI ;必须使用RETI结束,不能使用RET
- ;
- ;T2INT: NOP ;T2中断处理程序
- ;
- ; RETI
- [size=4];******************************************************************************
- ;九宫格解锁DEMO
- ;参考手机的九宫格解锁效果,在T5平台上实现类似的效果,提供给用户参考使用
- ;******************************************************************************
- ;内核程序:########
- ;编程环境:DWIN_OS_Builder V3.0.2.4
- ;通讯波特率:115200bps
- ;串口模式:8N1
- ;******************************************************************************
- ORG 1000H ;目前的T5 OS 2.07以上版本已经要求严格按照以下几行的标准格式来了
- GOTO MAIN ;代码的第一条指令必须是GOTO
- ;GOTO T0INT ;中断产生时,跳转到T0中断处理程序,必须使用GOTO,不能用CALL
- NOP
- NOP ;T1中断未使用
- GOTO T2INT ;中断产生时,跳转到T2中断处理程序
- ORG 1080H ;跳转到主函数MAIN
- ;******************************************************************************
- ;MAIN主流程
- ;******************************************************************************
- MAIN:
- CALL DINIT ;程序第一次运行时需要进行初始化的内容
- START:
- CALL GET_PICID ;获取当前页面ID
- IJNE R198,0x00,OVER ;确保页面ID的高字节为0
- IJNE R199,PAGE_LOCK,2
- CALL UNLOCK_INIT ;解锁界面初始化
- CALL UNLOCK ;屏保界面解锁功能
- IJNE R199,PAGE_PSWSET1,2
- CALL PSWSET1_INIT ;设定密码界面1初始化
- CALL PSWSET1 ;设定解锁密码
- IJNE R199,PAGE_PSWSET2,2
- CALL PSWSET2_INIT ;设定密码界面2初始化
- CALL PSWSET2 ;确认解锁密码
- OVER:
- GOTO START
- ;******************************************************************************
- ;Fuction:程序第一次运行时需要进行初始化的内容
- ;******************************************************************************
- DINIT:
- ;选择你需要使用的寄存器页面
- ;选择需要初始化的寄存器页
- LDBR R10,0x00,1 ;OS有8个寄存器页切换,DR0=0x00-0x07
- MOVRD R10,0,1 ;选择DR0作为初始值页面
- ;配置定时器中断功能
- LDBR R10,0x90,1
- MOVRD R10,45,1 ;使能定时中断-2
- LDWR R10,0xC350
- MOVRD R10,48,2 ;设置定时时间-500ms
-
- ;规定【R100~R199】为双字节数据空间-数据操作
- LDWR R100,DATA_DOUBLE_0 ;实时坐标X轴
- LDWR R102,DATA_DOUBLE_0 ;实时坐标Y轴
- LDWR R104,DATA_X1_START ;X轴第1列起点
- LDWR R106,DATA_X1_OVER ;X轴第1列终点
- LDWR R108,DATA_X2_START ;X轴第2列起点
- LDWR R110,DATA_X2_OVER ;X轴第2列终点
- LDWR R112,DATA_X3_START ;X轴第3列起点
- LDWR R114,DATA_X3_OVER ;X轴第3列终点
- LDWR R116,DATA_Y1_START ;Y轴第1行起点
- LDWR R118,DATA_Y1_OVER ;Y轴第1行终点
- LDWR R120,DATA_Y2_START ;Y轴第2行起点
- LDWR R122,DATA_Y2_OVER ;Y轴第2行终点
- LDWR R124,DATA_Y3_START ;Y轴第3行起点
- LDWR R126,DATA_Y3_OVER ;Y轴第3行终点
- LDWR R128,DATA_DOUBLE_0 ;九宫格列数X【1~3】
- LDWR R130,DATA_DOUBLE_0 ;九宫格行数Y【1~3】
- LDWR R132,DATA_DOUBLE_0 ;保留上次的九宫格列数X【1~3】
- LDWR R134,DATA_DOUBLE_0 ;保留上次的九宫格行数Y【1~3】
- LDWR R136,DATA_DOUBLE_0 ;实时NUM值
- LDWR R138,DATA_DOUBLE_0 ;保留上次的的NUM值
- LDWR R140,DATA_DOUBLE_0 ;记录NUM值的个数
- LDWR R142,ADDR_UNLOCK ;记录解锁密码的地址
- LDWR R144,DATA_DOUBLE_0 ;9个密码的位标志
- LDWR R196,DATA_DOUBLE_0 ;显示页面临时变量
- LDWR R198,DATA_DOUBLE_0 ;当前显示页面
- ;规定【R200~R255】为单字节数据空间-标志位
- LDBR R200,DATA_SINGLE_0,1 ;记录按压状态
- LDBR R201,DATA_SINGLE_0,1 ;记录计算结果是否有效
- LDBR R203,DATA_SINGLE_0,1 ;记录500ms
- LDBR R204,DATA_SINGLE_0,1 ;解锁成功标志位
- LDBR R205,DATA_SINGLE_0,1 ;第一次设定密码有效标志位
- LDBR R206,DATA_SINGLE_0,1 ;第二次确认密码有效标志位
- ;其他数据初始化
- ;设置基础图形显示-公用
- LDWR R10,0x000A ;基本图形显示-线段显示
- LDWR R12,0x0001 ;数据包为1个
- ;设置基础图形显示-交叉红线
- LDWR R14,DATA_COOR_COLOR ;颜色为红色
- LDWR R0,ADDR_GRAPSHOW0 ;显示界面-竖线
- MOVXR R10,0,3
- LDWR R0,ADDR_GRAPSHOW1 ;显示界面-横线
- MOVXR R10,0,3
- ;设置基础图形显示-九宫格连线
- LDWR R14,DATA_LINK_COLOR ;颜色为黑色
- LDWR R0,ADDR_PRESS ;按压点1
- LDWR R20,8 ;共8个连线界面,循环8次
- XH_0:
- MOVXR R10,0,3
- INC R0,1,ADDR_PRESS_OFFSET
- DJNZ R20,1,XH_0
- ;解锁密码初始化,如果未设定密码,就把初始密码12369写入到数据库保存
- ; CALL NOR_FLASH_R ;读取数据库中的密码放置密码保存区域
- CALL NAND_FLASH_R ;读取数据库中的密码放置密码保存区域
- LDWR R0,ADDR_PWDSET
- INC R0,1,0x09 ;密码设定标志位在数据库的09处
- MOVXR R10,1,1
- IJNE R11,0,DINIT_RET ;如果标志位不为0,说明已经设定过密码了
- LDWR R20,0x0001 ;否则设置初始解锁密码
- LDWR R22,0x0002
- LDWR R24,0x0003
- LDWR R26,0x0006
- LDWR R28,0x0009
- LDWR R0,ADDR_PWDSET
- MOVXR R20,0,5
- ; CALL NOR_FLASH_W ;将初始密码更新到数据库
- CALL NAND_FLASH_W ;将初始密码更新到数据库
-
- DINIT_RET:
- RET
- ;******************************************************************************
- ;Fuction:数据库读写--解锁密码的读取和写入
- ;******************************************************************************
- NOR_FLASH_R:
- ;片内 Nor Flash 数据库读取
- LDWR R10,0x5A00
- GOTO NOR_FLASH_RET
- NOR_FLASH_W:
- ;片内 Nor Flash 数据库写入
- LDWR R10,0xA500
- NOR_FLASH_RET:
- ;将数据读/写到用于存储解锁密码的地址区域
- LDWR R12,0x0000
- LDWR R14,ADDR_PWDSET
- LDWR R16,0x0010
- LDWR R0,ADDR_NOR_FLASH
- MOVXR R10,0,4
- ;判断数据库写操作是否完成,等CPU操作完清零
- XH_6: NOP
- MOVXR R40,1,1
- IJNE R40,0,XH_6
- RET
-
- NAND_FLASH_R:
- ;片内 Nand Flash 数据库读取
- LDWR R10,0x5A01
- GOTO NAND_FLASH_RET
- NAND_FLASH_W:
- ;片内 Nadn Flash 数据库写入
- LDWR R10,0x5A02
- NAND_FLASH_RET:
- ;将数据读/写到用于存储解锁密码的地址区域
- LDWR R12,0x4000
- LDWR R14,0x0000
- LDWR R16,ADDR_PWDSET
- LDWR R18,0x0010
- LDWR R20,0x0000
- LDWR R0,ADDR_NAND_FLASH
- MOVXR R10,0,6
- ;判断数据库写操作是否完成,等CPU操作完清零
- XH_11: NOP
- MOVXR R40,1,1
- IJNE R40,0,XH_11
- RET
-
- ;******************************************************************************
- ;Fuction:设置文本显示的点阵大小,用于控制文本是否显示
- ;******************************************************************************
- TEXT_SHOW:
- INC R0,1,000AH ;控制点阵大小的位置需要偏移
- LDWR R10,DATA_TIP_FONT ;点阵大小设置为32*32
- MOVXR R10,0,1
- RET
-
- TEXT_SHOW_NONE:
- INC R0,1,000AH ;控制点阵大小的位置需要偏移
- LDWR R10,0101H ;点阵大小设置为1*1,将不显示
- MOVXR R10,0,1
- RET
- ;******************************************************************************
- ;Fuction:设定解锁密码之前的初始化
- ;******************************************************************************
- PSWSET1_INIT:
- ;第一次输入密码提示-显示
- LDWR R0,ADDR_TIP_SET1_P ;文本显示的指针
- CALL TEXT_SHOW
- ;解锁图案错误提示-不显示
- LDWR R0,ADDR_TIP_ERROR1_P ;文本显示的指针
- CALL TEXT_SHOW_NONE
- PSWSET1_INIT_RET:
- RET
-
- ;******************************************************************************
- ;Fuction:设定解锁密码流程
- ;******************************************************************************
- PSWSET1:
- CALL GET_PICID ;获取当前页面ID
- CALL GET_COOR ;获取坐标数据并显示
- ;判断按压状态
- IJNE R200,0x00,1 ;根据TP状态值,00=松开
- GOTO PSWSET1 ;重新开始等待按压
- IJNE R200,0x02,1 ;根据TP状态值,02=抬起
- GOTO FINGER_UP1 ;按压结束
- ;记录按压的数据
- CALL CALCU_XY_NUM ;根据坐标数据计算行列值和NUM值
- IJNE R201,0x01,PSWSET1 ;如果计算结果无效,则重新开始等待按压
- CALL RECORD ;记录NUM值,NUM值的个数,记录输入密码
- GOTO PSWSET1
-
- FINGER_UP1:
- IJNE R141,0,1 ;如果NUM的个数等于0,说明没有手指按下
- GOTO PSWSET1
- CALL PSW_CHECK1
- IJNE R205,0x01,PSWSET1 ;如果密码无效,则重新开始等待按压
-
- PSWSET1_RET:
- RET
-
- ;******************************************************************************
- ;Fuction:抬手后进行密码长度判断
- ;******************************************************************************
- PSW_CHECK1:
- ;判断密码数是否小于4个
- LDWR R10,DATA_PWD_LEN
- JS R140,R10,PSW_BAD
- PSW_OK: ;密码合法
- LDBR R205,1,1 ;密码有效标志位
- LDWR R0,ADDR_UNLOCK
- LDWR R2,ADDR_PWDSET1
- MOVXX 10 ;把刚才设定的密码暂存起来
- LDWR R10,PAGE_PSWSET2 ;由R10指定页面ID
- CALL JUMP_PICID ;跳转到指定页面
- GOTO PSW_CHECK_LATER
- PSW_BAD: ;密码无效
- LDBR R205,0,1 ;密码有效标志位
- ;第一次输入密码提示-不显示
- LDWR R0,ADDR_TIP_SET1_P ;文本显示的指针
- CALL TEXT_SHOW_NONE
- ;解锁图案错误提示-显示
- LDWR R0,ADDR_TIP_ERROR1_P ;文本显示的指针
- CALL TEXT_SHOW
- LDBR R203,DATA_SINGLE_0,1 ;记录500ms
- XH_9: NOP
- IJNE R203,3,XH_9 ;等待1s后再去清除数据
- PSW_CHECK1_RET:
- CALL PSW_CHECK_LATER
- RET
- ;******************************************************************************
- ;Fuction:确认解锁密码之前的初始化
- ;******************************************************************************
- PSWSET2_INIT:
- ;第一次输入密码提示-显示
- LDWR R0,ADDR_TIP_SET2_P ;文本显示的指针
- CALL TEXT_SHOW
- ;解锁图案错误提示-不显示
- LDWR R0,ADDR_TIP_ERROR2_P ;文本显示的指针
- CALL TEXT_SHOW_NONE
-
- PSWSET2_INIT_RET:
- RET
-
- ;******************************************************************************
- ;Fuction:确认解锁密码流程
- ;******************************************************************************
- PSWSET2:
- CALL GET_PICID ;获取当前页面ID
- CALL GET_COOR ;获取坐标数据并显示
- ;判断按压状态
- IJNE R200,0x00,1 ;根据TP状态值,00=松开
- GOTO PSWSET2 ;重新开始等待按压
- IJNE R200,0x02,1 ;根据TP状态值,02=抬起
- GOTO FINGER_UP2 ;按压结束
- ;记录按压的数据
- CALL CALCU_XY_NUM ;根据坐标数据计算行列值和NUM值
- IJNE R201,0x01,PSWSET2 ;如果计算结果无效,则重新开始等待按压
- CALL RECORD ;记录NUM值,NUM值的个数,记录输入密码
- GOTO PSWSET2
-
- FINGER_UP2:
- IJNE R141,0,1 ;如果NUM的个数等于0,说明没有手指按下
- GOTO PSWSET2
- CALL PSW_CHECK2
- IJNE R206,0x01,PSWSET2 ;如果密码不同,则重新开始等待按压
- PSWSET2_RET:
- RET
- ;******************************************************************************
- ;Fuction:抬手后进行密码一致性判断
- ;******************************************************************************
- PSW_CHECK2:
- ;利用序列快速比较两组密码是否相同
- LDWR R0,ADDR_UNLOCK
- MOVXR R20,1,10
- LDWR R0,ADDR_PWDSET1
- MOVXR R40,1,10
- TESTS R20,R40,18 ;最多9个密码
- IJNE R0,0x00,PSW_DIFF
- PSW_SAME: ;密码一致
- LDBR R206,1,1 ;密码有效标志位
- LDWR R0,ADDR_UNLOCK
- LDWR R2,ADDR_PWDSET
- MOVXX 10 ;把设定的密码放置到数据库保存起来
- LDWR R0,ADDR_PWDSET
- INC R0,1,0x09
- LDWR R10,1
- MOVXR R10,0,1 ;给密码设置标志位置1,下次启动将不使用初始密码
- ; CALL NOR_FLASH_W
- CALL NAND_FLASH_W
- LDWR R10,PAGE_INDEX ;由R10指定页面ID
- CALL JUMP_PICID ;跳转到指定页面
- GOTO PSW_CHECK_LATER
- PSW_DIFF: ;密码不同
- LDBR R206,0,1 ;密码有效标志位
- ;第一次输入密码提示-不显示
- LDWR R0,ADDR_TIP_SET2_P ;文本显示的指针
- CALL TEXT_SHOW_NONE
- ;解锁图案错误提示-显示
- LDWR R0,ADDR_TIP_ERROR2_P ;文本显示的指针
- CALL TEXT_SHOW
- LDBR R203,DATA_SINGLE_0,1 ;记录500ms
- XH_10: NOP
- IJNE R203,3,XH_10 ;等待1s后再去清除数据
- PSW_CHECK2_RET:
- CALL PSW_CHECK_LATER
- RET
-
- ;******************************************************************************
- ;Fuction:九宫格解锁流程之前的初始化
- ;******************************************************************************
- UNLOCK_INIT:
- ;第一次输入密码提示-显示
- LDWR R0,ADDR_TIP_INPUT_P ;文本显示的指针
- CALL TEXT_SHOW
- ;解锁图案错误提示-不显示
- LDWR R0,ADDR_TIP_ERROR_P ;文本显示的指针
- CALL TEXT_SHOW_NONE
- ;获取解锁密码
- ; CALL NOR_FLASH_R
- CALL NAND_FLASH_R
-
- UNLOCK_INIT_RET:
- RET
-
- ;******************************************************************************
- ;Fuction:九宫格解锁流程
- ;******************************************************************************
- UNLOCK:
- CALL GET_PICID ;获取当前页面ID
- CALL GET_COOR ;获取坐标数据并显示
- ;判断按压状态
- IJNE R200,0x00,1 ;根据TP状态值,00=松开
- GOTO UNLOCK ;重新开始等待按压
- IJNE R200,0x02,1 ;根据TP状态值,02=抬起
- GOTO FINGER_UP ;按压结束
- ;记录按压的数据
- CALL CALCU_XY_NUM ;根据坐标数据计算行列值和NUM值
- IJNE R201,0x01,UNLOCK ;如果计算结果无效,则重新开始等待按压
- CALL RECORD ;记录NUM值,NUM值的个数,记录输入密码
- GOTO UNLOCK
-
- FINGER_UP:
- IJNE R141,0,1 ;如果NUM的个数等于0,说明没有手指按下
- GOTO UNLOCK
- CALL PSW_CHECK
- IJNE R204,0x01,UNLOCK ;如果解锁失败,则重新开始等待按压
-
- UNLOCK_RET:
- RET
-
- ;******************************************************************************
- ;Fuction:抬手后进行密码判断
- ;******************************************************************************
- PSW_CHECK:
- ;利用序列快速比较两组密码是否相同
- LDWR R0,ADDR_UNLOCK
- MOVXR R20,1,10
- LDWR R0,ADDR_PWDSET
- MOVXR R40,1,10
- TESTS R20,R40,18 ;最多9个密码
- IJNE R0,0x00,PSW_ERROR
- PSW_CURRECT: ;密码正确
- LDBR R204,1,1 ;解锁成功标志位
- LDWR R10,PAGE_INDEX ;由R10指定页面ID
- CALL JUMP_PICID ;跳转到指定页面
- GOTO PSW_CHECK_LATER ;清除数据
- PSW_ERROR: ;密码错误
- LDBR R204,0,1 ;解锁成功标志位
- ;第一次输入密码提示-不显示
- LDWR R0,ADDR_TIP_INPUT_P ;文本显示的指针
- CALL TEXT_SHOW_NONE
- ;解锁图案错误提示-显示
- LDWR R0,ADDR_TIP_ERROR_P ;文本显示的指针
- CALL TEXT_SHOW
- LDBR R203,DATA_SINGLE_0,1 ;记录500ms
- XH_4: NOP
- IJNE R203,3,XH_4 ;等待1s后再去清除数据
-
- PSW_CHECK_LATER:
- LDWR R138,DATA_DOUBLE_0 ;保留上次的的NUM值
- LDWR R140,DATA_DOUBLE_0 ;记录NUM值的个数
- LDWR R142,ADDR_UNLOCK ;地址进行过自加,需要重新设置存储解锁密码的地址
- LDWR R144,DATA_DOUBLE_0 ;9个密码的位标志
-
- LDBR R10,0,20
- LDWR R0,ADDR_ICON
- MOVXR R10,0,10 ;清除图标变量显示
- LDWR R0,ADDR_UNLOCK
- MOVXR R10,0,10 ;清除密码
-
- LDWR R0,ADDR_PRESS ;按压点1
- LDWR R20,8 ;共8个连线界面,循环8次
- LDBR R10,0,8
- INC R0,1,3 ;地址偏移3位
- XH_5:
- MOVXR R10,0,4
- INC R0,1,ADDR_PRESS_OFFSET
- DJNZ R20,1,XH_5
- PSW_CHECK_RET:
- RET
- ;******************************************************************************
- ;Fuction:记录NUM值,NUM值的个数,记录输入密码
- ;******************************************************************************
- RECORD:
- ;判断是否重复区域
- CJNE R137,R139,1 ;如果本次计算的NUM和上一次的NUM相同,则不计入密码
- GOTO RECORD_RET
- ;判断是否重复密码
- MOV R144,R10,2 ;获取当前密码的位标志
- MOV R136,R12,2 ;获取当前的NUM密码
- IJNE R13,1,1 ;如果当前密码值为1,说明不需要移位
- GOTO PSW_BIT_CHECK
- DEC R12,0x0001,1
- XH_2:
- SHR R10,2,1
- DJNZ R12,1,XH_2 ;将位标志移位到首位,用于判断
- PSW_BIT_CHECK:
- LDWR R20,0x01
- AND R11,R21,1
- IJNE R11,1,1 ;如果本次计算的NUM已经计入密码,则不再计入密码
- GOTO RECORD_RET
-
- ;设置变量图标
- LDBR R30,0,50 ;临时变量数据清空
- LDWR R32,ADDR_ICON ;获取变量图标的起始地址
- MOV R136,R42,2
- ADD R30,R40,R50 ;根据NUM计算需要显示的位置
- MOV R56,R0,2 ;重新指定变量图标的地址
- LDWR R10,DATA_ICON_SHOW
- MOVXR R10,0,1 ;显示变量图标
- ;存储输入密码
- MOV R142,R0,2 ;获取存储解锁密码的地址
- MOVXR R42,0,1 ;存储密码
- INC R142,1,1 ;密码地址增加1次
- ;记录本次的NUM值和次数
- MOV R136,R138,2 ;保存本次的NUM结果,用于下次比对
- INC R140,1,1 ;NUM值的个数增加1次
- ;给密码位置记录1,标记此密码已经被记录
- LDWR R10,0x0001
- MOV R136,R12,2
- IJNE R13,1,1
- GOTO PSW_BIT_CALCU
- DEC R12,0x0001,1
- XH_3:
- SHL R10,2,1
- DJNZ R12,1,XH_3
- PSW_BIT_CALCU:
- OR R144,R10,2
-
- ;记录第一次按压时的行列值
- IJNE R141,0x01,3 ;绘制连接线需要上一次的坐标数据
- MOV R128,R132,2
- MOV R130,R134,2
- GOTO RECORD_RET
- CALL DRAW_LINE ;根据按压的位置,绘制连接线
-
- RECORD_RET:
- RET
-
- ;******************************************************************************
- ;Fuction:根据按压的位置,绘制连接线
- ;******************************************************************************
- DRAW_LINE:
- ;坐标X1 = DATA_NUM1_X + DATA_COOR_OFFSET*(行数-1)
- LDBR R10,DATA_SINGLE_0,50
- MOV R132,R10,2 ;获取上次的行数据
- DEC R10,1,1 ;自减1,用于计算坐标
- LDWR R20,DATA_COOR_OFFSET
- SMAC R10,R20,R30
- LDWR R42,DATA_NUM1_X
- ADD R30,R40,R50
- MOV R56,R80,2 ;保留X1坐标
-
- ;坐标Y1 = DATA_NUM1_Y + DATA_COOR_OFFSET*(列数-1)
- LDBR R10,DATA_SINGLE_0,50
- MOV R134,R10,2 ;获取上次的行数据
- DEC R10,1,1 ;自减1,用于计算坐标
- LDWR R20,DATA_COOR_OFFSET
- SMAC R10,R20,R30
- LDWR R42,DATA_NUM1_Y
- ADD R30,R40,R50
- MOV R56,R82,2 ;保留Y1坐标
-
- ;坐标X2 = DATA_NUM1_X + DATA_COOR_OFFSET*(行数-1)
- LDBR R10,DATA_SINGLE_0,50
- MOV R128,R10,2 ;获取上次的行数据
- DEC R10,1,1 ;自减1,用于计算坐标
- LDWR R20,DATA_COOR_OFFSET
- SMAC R10,R20,R30
- LDWR R42,DATA_NUM1_X
- ADD R30,R40,R50
- MOV R56,R84,2 ;保留X2坐标
-
- ;坐标Y2 = DATA_NUM1_Y + DATA_COOR_OFFSET*(列数-1)
- LDBR R10,DATA_SINGLE_0,50
- MOV R130,R10,2 ;获取上次的行数据
- DEC R10,1,1 ;自减1,用于计算坐标
- LDWR R20,DATA_COOR_OFFSET
- SMAC R10,R20,R30
- LDWR R42,DATA_NUM1_Y
- ADD R30,R40,R50
- MOV R56,R86,2 ;保留Y2坐标
-
- LDWR R0,ADDR_PRESS ;组合成基本图形数据包,一起发送
- MOV R140,R10,2
- DEC R10,1,2
- LDWR R12,1
- JS R10,R12,2
- XH_1:
- INC R0,1,ADDR_PRESS_OFFSET
- DJNZ R10,1,XH_1
- INC R0,1,3 ;地址偏移3位
- MOVXR R80,0,4
-
- DRAW_LINE_RET:
- MOV R128,R132,2
- MOV R130,R134,2
- RET
-
- ;******************************************************************************
- ;Fuction:根据坐标数据计算行列值和NUM值
- ;******************************************************************************
- CALCU_XY_NUM:
- ;计算X值-列
- CALCU_X:
- JS R100,R104,CALCU_INVALID
- JS R106,R100,2
- LDWR R128,1 ;九宫格起始值X=1
- GOTO CALCU_Y
- JS R100,R108,CALCU_INVALID
- JS R110,R100,2
- LDWR R128,2 ;九宫格起始值X=2
- GOTO CALCU_Y
- JS R100,R112,CALCU_INVALID
- JS R114,R100,2
- LDWR R128,3 ;九宫格起始值X=3
- GOTO CALCU_Y
- GOTO CALCU_INVALID
- ;计算Y值-行
- CALCU_Y:
- JS R102,R116,CALCU_INVALID
- JS R118,R102,2
- LDWR R130,1 ;九宫格起始值Y=1
- GOTO CALCU_NUM
- JS R102,R120,CALCU_INVALID
- JS R122,R102,2
- LDWR R130,2 ;九宫格起始值Y=2
- GOTO CALCU_NUM
- JS R102,R124,CALCU_INVALID
- JS R126,R102,2
- LDWR R130,3 ;九宫格起始值Y=3
- GOTO CALCU_NUM
- GOTO CALCU_INVALID
- ;计算NUM值-数字
- CALCU_NUM:
- ;根据X和Y值计算需要记录的NUM = (y-1)*3+x
- LDBR R30,0,50 ;临时变量数据清空
- MOV R128,R32,2 ;提取列数X
- MOV R130,R40,2 ;提取行数Y
- DEC R40,1,1 ;y-1
- LDWR R50,0x0003 ;乘法器需要16bit数据,得到32bit数据
- SMAC R40,R50,R60 ;(y-1)*3
- ADD R60,R30,R70 ;(y-1)*3+x
- MOV R76,R136,2 ;把计算的最终结果赋值给NUM
-
- CALCU_XY_NUM_RET:
- LDBR R201,0x01,1 ;计算结果有效
- RET
- CALCU_INVALID:
- LDBR R201,0x00,1 ;计算结果无效
- RET
-
- ;******************************************************************************
- ;Fuction:获取坐标数据并显示
- ;******************************************************************************
- GET_COOR:
- ;从TP状态寄存器读取按压状态和实时坐标
- LDWR R0,ADDR_TP_STATUS ;获取TP的状态数据
- MOVXR R10,1,4 ;【R10~R17】8个字节数据
- MOV R11,R200,1 ;记录按压状态
- MOV R12,R100,2 ;实时坐标X轴-坐标0
- MOV R14,R102,2 ;实时坐标Y轴-坐标0
-
- ;在界面上显示XY轴当前坐标值
- LDWR R0,ADDR_COX ;显示实时坐标X轴
- MOVXR R100,0,1
- LDWR R0,ADDR_COY ;显示实时坐标Y轴
- MOVXR R102,0,1
-
- ;使用交叉红线定位坐标位置
- ;显示竖线
- MOV R100,R20,2 ;起点X-提取实时坐标X
- LDWR R22,0x0000 ;起点Y-最小值0
- MOV R100,R24,2 ;终点X-提取实时坐标X
- LDWR R26,DATA_PIXEL_Y ;终点Y-最大值854
- LDWR R0,ADDR_GRAPSHOW0 ;组合成基本图形数据包,一起发送
- INC R0,1,3 ;地址偏移3位
- MOVXR R20,0,4
- ;显示横线
- LDWR R20,0x0000 ;起点X-最小值0
- MOV R102,R22,2 ;起点Y-提取实时坐标Y
- LDWR R24,DATA_PIXEL_X ;终点X-最大值480
- MOV R102,R26,2 ;终点Y-提取实时坐标Y
- LDWR R0,ADDR_GRAPSHOW1 ;组合成基本图形数据包,一起发送
- INC R0,1,3 ;地址偏移3位
- MOVXR R20,0,4
-
- GET_COOR_RET:
- RET
- ;******************************************************************************
- ;Fuction:切换到指定页面ID-由调用函数前的 R10寄存器 指定
- ;******************************************************************************
- JUMP_PICID:
- LDWR R20,0x5A01
- MOV R10,R22,2
- LDWR R0,0084H
- MOVXR R20,0,2 ;页面切换
- XH_7: NOP
- LDWR R0,ADDR_PIC_NOW
- MOVXR R20,1,1
- CJNE R21,R11,XH_7
-
- JUMP_PICID_RET:
- RET
-
- ;******************************************************************************
- ;Fuction:获取当前页面ID
- ;******************************************************************************
- GET_PICID:
- LDWR R0,ADDR_PIC_NOW
- MOVXR R196,1,1
- ;判断当前页面与上一次的页面是否相同,不同:跳转到START重新开始
- CJNE R196,R198,2
- CJNE R197,R199,1
- GOTO GET_PICID_RET
- MOV R196,R198,2
- GOTO START
-
- GET_PICID_RET:
- RET
-
- ;******************************************************************************
- ;Fuction:中断处理程序
- ;******************************************************************************
- ;T0INT: NOP ;T0中断处理程序
- ;
- ;T0INT_RET:
- ; RETI ;必须使用RETI结束,不能使用RET
- T2INT: NOP ;T2中断处理程序
- INC R203,0,1
-
- T2INT_RET:
- RETI
-
- [/size]