任务:
1. 屏幕界面屏保;
2. 批量烧录软件;
上午
前两天都在学VS学Qt,项目上没什么进展;
主要内容都记在学习笔记上了;
查资料找到了一个关于迪文屏OS开发和C51开发的解释,贴过来记录一下:
关于屏保和密码:
找到的资料是DWIN_OS操作,也就是说要用DWIN自定义的汇编代码来编写;
好在论坛上直接给了例程,只需要读懂代码再修改即可;
这么一看迪文的体系确实做的很完善;
贴上原例程汇编代码:
; DWIN OS
;0001H,0002H 密码录入
;0003H,0004H 新建密码
;0005H,0006H 再次录入
;0007H 重建密码
;0008H,0009H os交换占用DGUS地址
;初始密码没有写入flash部分,可以先启用超级密码,然后更改所需要的密码,而超级密码可以做一个保险密码,防止用户忘记密码后有补救.
;超级密码:142536,记忆办法1到6交叉记忆
;先明白数据库读写文档上面,以 800*480 的屏为例,设置要保存的变量地址 0000 ,0001这两个地址的数据, 假设历程有 50 张图片,计算数据库最小首地址:
;{(50*3)-128}*64*1024=1572864,这里得到的地址是10进制地址
;即最小首地址只要大于 1572864=0X0018 0000都可。密码存放在次位置
;上面是用到存放图片的flash位置,我们把他那个部分当成数据库部分,注意不要用字库读写这个功能,未来的内核可能会去掉该功能
;如果能弄懂上面的密码程序,第三个屏保的程序也不难理解,注意一种情况键盘录入的时候长时间不动的时候,进入动画后也应该需要关闭键盘录才人性化一些。
;Francesco,20151016
CALL Password
CALL Change_password
CALL Screensaver
END
;=====================================
Password:
LDWR R0,0X0001 ;读密码框
MOVXR R10,1,2
LDBR R14,0,1
OR R14,R10,1
OR R14,R11,1
OR R14,R12,1
OR R14,R13,1
IJNE R14,0,DATA>0 ;密码框不为0
GOTO GEND
DATA>0:
LDWR R4,0018H ;0X0018 0000
LDWR R6,0000H
LDWR R0,0X0008 ;读数据库密码到缓冲区0X0008 0X0009
MOVXL 2,2
MOVXR R16,1,2 ;读数据库密码到R16-R19
TESTS R10,R16,4 ;密码比较
IJNE R0,0,MA_ERR
MA_OK:
LDWR R10,7 ;密码ok切换到07界面
MOVRD R10,3,2
LDWR R0,0X0001 ;清空密码输入框
LDBR R10,0,4 ;
MOVXR R10,0,2
GOTO GEND
MA_ERR:
LDWR R20,0002H ;密码和原始密码不对,先比较是否为 超级密码142536
LDWR R22,2CC8H
TESTS R10,R20,4 ;是超级密码就进入密码OK界面
IJNE R0,0,MA_ERR1
GOTO MA_OK
MA_ERR1:
LDBR R10,0,4 ;密码err
LDWR R0,0X0001 ;清空密码输入框
MOVXR R10,0,2
LDWR R10,2 ;密码错误切换到02界面
MOVRD R10,3,2
GEND: RET
;===========================================================
Change_password:
LDWR R0,0X0007 ;
MOVXR R10,1,1 ;
IJNE R11,5AH,Go_End ;重建密码码确认键是否按下
LDWR R0,0X0003 ;读新建密码框
MOVXR R10,1,2
LDBR R14,0,1
OR R14,R10,1
OR R14,R11,1
OR R14,R12,1
OR R14,R13,1
IJNE R14,0,DATA1>0 ;密码框不为0
LDWR R0,0X0005 ;读再次输入密码框
MOVXR R10,1,2
LDBR R14,0,1
OR R14,R10,1
OR R14,R11,1
OR R14,R12,1
OR R14,R13,1
IJNE R14,0,DATA1>0 ;密码框不为0
LDWR R0,0x0003 ;
LDBR R240,0,10
MOVXR R240,0,5 ;清空密码输入框 按键
GOTO Go_End
DATA1>0:
LDWR R0,0003H
MOVXR R20,1,2 ;将第一次输入的新密码读到R20,R21,R22,R23
LDWR R0,0005H
MOVXR R30,1,2 ;将第二次输入的新密码读到R30,R31,R32,R33
CJNE R20,R30,M_O_ERR ;
CJNE R21,R31,M_O_ERR ;
CJNE R22,R32,M_O_ERR ;
CJNE R23,R33,M_O_ERR ;判断两次密码是否相同,相同则继续执行,不同则跳转
GOTO SAVE_M
M_O_ERR:
LDWR R10,5 ;切换到第5页两次密码不一致。
MOVRD R10,3,2 ;
LDWR R0,0x0003 ;
LDBR R240,0,10
MOVXR R240,0,5 ;清空密码输入框 清空确认键
GOTO Go_End
SAVE_M: LDWR R4,0018H ;0X0018 0000
LDWR R6,0000H
LDWR R0,0X0003 ;
MOVXL 3,2 ;新密码写入数据库
LDWR R0,0x0003 ;
LDBR R240,0,10
MOVXR R240,0,5 ;清空密码输入框 清空确认键
LDWR R10,6 ;切换到第06页两次密码一样新密码成功,牢记密码。
MOVRD R10,3,2
Go_End:
RET
;===========================================================
Screensaver:
IJNE R100,0,Saver_Page
LDBR R100,1,1 ;先定时,
Set_Time:
LDBR R110,13H,1 ;定时20秒左右,1338H=5000,5000*4=20000MS
LDBR R111,38H,1
MOVRD R110,4AH,2
GOTO Screensaver_End
Saver_Page:
MOVDR 03H,R112,2 ;记录当前页R40,R41=当前页
LDWR R114,8,
JS R112,R114,Page_main ;判断是否在动画页面, 动画页面是从第8页开始的,页面>=8往下执行
TX_Only_once:
IJNE R171,0,TX_Once_End
LDBR R171,1,1
LDWR R10,0 ;强制关闭当前输入法 不进行任何页面切换
EXIT R10,R10;这指令的用法不会自己翻下文档
TX_Once_End:
MOVDR 05H,R126,1 ;如果DGUS寄存器05=5A触摸屏坐标有更新
IJNE R126,5AH,Screensaver_End ;判断在动画页面是否有触摸动作
LDWR R70,0 ;
MOVRD R70,05H,2 ;清零记录触摸动作的寄存器
MOVRD R150,03H,2 ;返回之前进入动画的那个页面
LDWR R150,0 ;清空记录的页面数
LDBR R100,0,1
Page_main:
LDBR R171,0,1 ;一次标志位写0 这里是说强制关闭当前输入法只有一次 避免重复运行
MOVDR 05H,R250,1 ;记录在正常显示页面触摸屏是否有按下
IJNE R250,5AH,Screensaver_Page
LDWR R70,0
MOVRD R70,05H,2 ;清空记录触摸动作的寄存器
LDBR R100,0,1
GOTO Screensaver_End
Screensaver_Page:
MOVDR 4AH,R160,2 ; 判断计时器中的数据是否为零,否,计时
IJNE R160,0,Screensaver_End
IJNE R161,0,Screensaver_End
MOVDR 03H,R150,2 ;记录进入动画前的页面
LDWR R30,8 ;切换到动画界面
MOVRD R30,03H,2
LDWR R20,0
MOVRD R20,05H,2 ;清空记录触摸动作的寄存器
Screensaver_End:
RET
;==================================================
常用汇编命令解释:
-
LDWR
注意寄存器为8bit,也就是说是转载的是一个寄存器组,而且是立即数; -
LDBR
注意:若num大于1,则存储在连续的寄存器里;以及清零操作 LDBR R0, 0, 0;且都是将数据写入; -
MOVRD
-
MOVDR
从指令名可以区分,RD即是从寄存器到接口寄存器,而DR是从接口寄存器到寄存器;
接口寄存器的值可能是控件值,也就是记录DGUS Tool操作的值; -
MOVXR
-
JS
这个比较指令和汇编的指令很像了,其余的两个也一起贴; -
JU / IJNE
-
RET
-
TESTS
注意:最后对比值是返回给R0的;
下午
指令中的各个寄存器应该是有特定功能的,应该先弄清楚;查资料得:
基于 T5L 的 DWIN OS 一共有 2048 个寄存器,分成 8 页来访问,每页 256 个寄存器,对应 R0-R255;
基于 T5L 的 DWIN OS 有一个接口寄存器页,DR开头,一共有 256 个接口寄存器,用于对硬件资源的快速访问接口;
指令中 R#表示 DWIN OS 当前寄存器页内,任意 256 个寄存器之任意一个或一组,R0-R255;而页面的控制由接口寄存器 DR0 来控制;
看汇编代码有点乱呀,寄存器的值并不是所需要的值呀;
MOVXR交换的变量到底是哪个变量;
仔细看了一下指令说明:
数据变量指针由 R0:R1R0:R1 寄存器定义。R0R0、R1R1 可以看做是特殊可以看做是特殊专门用于变量地址存放的 os 寄存器,只要是涉及到要调用变量地址的处理的,先要把变量地址值给到 R0、R1,再使用指令MOVXR 或 MOVXX
也就是说当前操作变量默认存放在寄存器R0, R1中;
这样一来密码部分的代码就好懂了;
但是这屏保着实没看懂,寄存器的使用也太随便了;
将屏保改成亮度休眠了,只需修改CFG参数即可;
将休眠时亮度调成了1,相当于黑屏;
这样应该可以延长屏幕使用的寿命;
但有帖子说有发热现象,明天测试一下;
今日工作结束;