节省空间的表格定义方式
SN 8 位单片机的 ROM 空间是 16 位长度的,而许多实际项目都会需要显示,显示无论液晶或数码管,都会有一个笔段码表格,例如使用"DB"定义:
;****************************************************************************
B_LEDBIN: ;共阳极数码管笔段码表格 ,查表数据在 A .
B0MOV Y,#TABLELED$M
MOV Z,#TABLELED$L
B_ADDZ:
ADD Z,A
BS0 FC ; 检查进位标志C
INCM Y
MOVC
RET
;--------------------------------------------------------
DB 0A0H;0
DB 0B7H;1
DB 064H;2
DB 025H;3
DB 033H;4
DB 029H;5
DB 028H;6
DB 0B5H;7
DB 020H;8
DB 021H;9
DB 030H;A
DB 02AH;b
DB 0E8H;C
DB 026H;d
DB 068H;E
DB 078H;F
DB 032H;H
DB 0EAH;L
DB 03EH;n
DB 02EH;o
DB 070H
DB 031H;q
DB 07EH;r
DB 06AH;t
DB 0A2H;U
DB 023H;y
DB 07FH;-
DB 0FFH;*
RET
; ******************************************************************************
这样,每查表一次, A 就得到一个具体数字的显示笔段码.
有时候,芯片空间就差一点点不够用,需要哪怕压缩几条指令的余地出来,我最近使用 SN8F26E61 做一个 3 传感器的温度表,就仅仅差 5 条指令,不能顺利编译,空间溢出了.
这时,可以考虑利用 SN 的 ROM 空间为 16 位的特点,把上面表格改用"DW"来定义.如:
;=========================================================
TABLELED: ;一次查表,得到 2 个笔段码,分别在"A"与"R"里.
DW 0A0B7H;0,1
DW 06425H;2,3
DW 03329H4,;5
DW 028B5H;6,7
DW 02021H;8,9
DW 0302AH;a,b
DW 0E826H;c,d
DW 06878H;e,F
DW 032EAH;H,L
DW 03E2EH;n,o
DW 07031H;p,q
DW 07E6AH;r,t
DW 0A223H;u,y
DW 07FFFH; - *
RET
;============================================================
很明显,表格空间节省了差不多一半! -------- 需要注意的是: 如果查表入口数是 奇数,查表后就使用 A 里的值,如果是偶数,则使用 R 里的值.
就这样,问题解决了.-----如果你也遇见此类空间"吃紧"问题,不妨一试.
仅供参考!
|