节省空间的表格定义方式

[复制链接]
查看3618 | 回复0 | 2013-10-26 00:57:04 | 显示全部楼层 |阅读模式
节省空间的表格定义方式
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 里的值.
就这样,问题解决了.-----如果你也遇见此类空间"吃紧"问题,不妨一试.
仅供参考!


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

本版积分规则