- 积分
- 792
- 在线时间
- 8183 小时
- 最后登录
- 2024-6-19
- 阅读权限
- 120
- 精华
- 0
 
- UID
- 9409
- 帖子
- 658
- 精华
- 0
- 经验
- 792 点
- 金钱
- 323 ¥
- 注册时间
- 2006-5-15
|

楼主 |
发表于 2007-8-16 14:04
|
显示全部楼层
显示屏扫描子程序
;每一毫秒调用一次
;江文正,2007-08-15
.include "eZ8.inc"
segment code
xref _readbut ;读取按键
xref _DigCtr ;位数计
xref _DplDuty ;亮度占空比
xref _DplFlag ;bit0 = 闪烁, bit1 = 自动音量, bit2 = 切换, bit3 = 测试,bit4 = 设置遥控码
xref _FuncNr ;功能选择
xref _Volume ;音量
xref _ChNr ;输入切换号码
xdef _shiftdpl ;移位刷屏
;=================================================
; 引脚定义
data1 equ PBOUT ort B
data1_0 equ 11111110B B0
data1_1 equ 00000001B B0
stb1 equ PBOUT ort B
stb1_0 equ 11111101B B1
stb1_1 equ 00000010B B1
clk1 equ PCOUT ort C
clk1_0 equ 01111111B C7
clk1_1 equ 10000000B C7
minus_0 equ 00010000B ;-0
minus_1 equ 00111000B ;-1
;7 段显示笔画定仪表指针
seg_ptr:; FABGCD.E
.BYTE 11101101B ;0
.BYTE 00101000B ;1
.BYTE 01110101B ;2
.BYTE 01111100B ;3
.BYTE 10111000B ;4
.BYTE 11011100B ;5
.BYTE 11011101B ;6
.BYTE 01101000B ;7
.BYTE 11111101B ;8
.BYTE 11111100B ;9
.BYTE 11111001B ;A
.BYTE 11000101B ;C
.BYTE 00111101B ;d
.BYTE 10010101B ;t
.BYTE 10101101B ;U
.BYTE 10100100B ;V
SegBuf equ R5
DigPos equ R4
;======================================
_shiftdpl:
CP _DigCtr,#05
JR ULT,$F
inc _DplDuty
cp _DplDuty,#4 ;此数用于调节亮度
JR ugt,$F
ret
$$: clr _DplDuty
; call __readbut
push R0 ;如果只有 C 语言调用此子程序,进栈和退栈部分可以抹掉
push R1 ;
push R2 ;
push R3
push R4
push R5 ;
LD DigPos,#00000001B
CPX _DigCtr,#05
JR ULT,NX_DIG
LDX _DigCtr,#0
NX_DIG ADDX _DigCtr,#1
LDX R0,_DigCtr
$$: RR DigPos
djnz R0,$B
LDX SegBuf,_Volume
cpx _DigCtr,#03
jr ult,$F
LDX SegBuf,_ChNr
$$:
TMX _DigCtr,#1
JR NZ,LSD
SWAP SegBuf ;若是偶数,左右四比特对换
LSD AND SegBuf,#0FH ;淹没左四比特
LD R0, #high(seg_ptr) ;画段指针
LD R1, #low(seg_ptr) ;
ADD R1,SegBuf ;加上错位
ADC R0,#0
LDC SegBuf,@RR0 ;从画段表获取数据
cpx _FuncNr,#0
jr ne,$F
cpx _DigCtr,#3 ;显示音量时第三位数空白
jr eq,blank
$$: cpx _DigCtr,#05
jr ult,$F
blank clr SegBuf ;灭显示
$$:
LD R3,SegBuf ;输出画段
COM R3 ;低电平驱动
CALL OUT_BYTE
LD R3,DigPos ;输出位数
CALL OUT_BYTE
ORX stb1,#stb1_1 ;转移数据
NOP
NOP
NOP
ANDX stb1,#stb1_0
ANDX data1,#data1_0
andx _DplFlag,#%FE ;标记处理完毕
pop R5 ;如果只有 C 语言调用此子程序,进栈和退栈部分可以抹掉
pop R4
pop R3
pop R2
pop R1
pop R0
RET
OUT_BYTE ;串移数据
LD R2,#08 ;8 比特
SFT_LP
ANDX data1,#data1_0
RL R3
JR NC,CLKING
ORX data1,#data1_1
CLKING ;输出一个时钟脉冲
NOP
NOP
NOP
ORX clk1,#clk1_1
NOP
NOP
NOP
ANDX clk1,#clk1_0
DJNZ R2,SFT_LP
RET
;-------------------------------------------- |
|