整个程序结束.docx
《整个程序结束.docx》由会员分享,可在线阅读,更多相关《整个程序结束.docx(26页珍藏版)》请在冰豆网上搜索。
整个程序结束
;在拆字完后将要显示时,在这里插入键盘扫描程序段,来进行LCD极限压力的设置
;----------------------------------------------------------
Detectkey:
lcallKeyTest
MainReturn:
ljmploop1
;;;;;;;主程序结束;;;;;;
;------------------------------------------------------
;------------------------------------------------------
;下面为所有的子程序
;------------------------------------------------------
;-----------------------------------------------------
ManuSet:
pushPSW
pushacc
PUSHDPL
PUSHDPH
lcallUartModle0
POPDPH
POPDPL
popacc
popPSW
reti
;被测压力数据转换为BCD码
;-----------------------------------------------------
ad2display:
movr1,a
anla,#0fh
mov@r0,a
decr0
mova,r1
anla,#0f0h
swapa
mov@r0,a
ret
;二进制码转换为BCD码
Bin2Bcd:
movr5,#16
clra
movr3,a
movr4,a
TLoop:
mova,voltlow
rlca
movvoltlow,a
mova,volthigh
rlca
movvolthigh,a
mova,r3
addca,r3
daa
movr3,a
mova,r4
addca,r4
daa
movr4,a
djnzr5,TLoop
ret
Transfer:
movb,#2
mulab
movvolthigh,b
movvoltlow,a
callBin2Bcd
movvolthigh,r4
movvoltlow,r3
ret
Displayvolt2DisplayBuf:
movr1,#42h
mova,volthigh
movb,#10h
divab
mov@r1,a
incr1
mov@r1,b
incr1
mova,voltlow
movb,#10h
divab
mov@r1,a
incr1
mov@r1,b
ret
;-------------------------------------------------
;驱动喇叭,实现声音报警的子程序
;------------------------------------------------------
voicewarning:
movTH0,ToneHigh
movTL0,ToneLow
setbTR0
movr5,#100
lcallDelay1
clrTR0
setbp3.2
ret
;驱动喇叭,实现声音报警的中断子程序
;---------------------------------------------------------
Timer0Int:
pushPSW
pushacc
PUSHDPL
PUSHDPH
clrTR0
movTH0,ToneHigh
movTL0,ToneLow
setbTR0
cplP3.2
POPDPH
POPDPL
popacc
popPSW
reti
;------------------------------------------------------------------------
;正反转步进子程序
;--------------------------------
STEPS:
ANLStepState,#83HBy-gnksguybb
MOVA,StepState
JBACC.7,STPSC
MOVDPTR,#CTAB
AJMPSTPW
STPSC:
MOVDPTR,#FTAB
ANLA,#03H
STPW:
MOVCA,@A+DPTR
MOVP1,A
INCStepState
RET
DEL:
MOVR5,#0;延时子程序
DEL0:
DJNZR5,DEL0
RET
FTAB:
DB83H,86H,8CH,89H
CTAB:
DB79H,7cH,76H,73H
;-------------------------------------------------------
;KEY扫描有关的程序
;-------------------------------------------------------
KeyTest:
movdptr,#0e100h
mova,#03h
movx@dptr,a
callTestKey;有键入?
jnzgetkey0
ljmpKReturn;无键入,继续显示
getkey0:
callGetKey;读入键码
MOVR4,#04H
anla,#1fh;显示键码
MOVkPLAYTemp,A
movLEDBuf,a
;movLEDBuf+1,#11h
;movLEDBuf+2,#11h
;movLEDBuf+3,#11h
;movLEDBuf+4,#11h
;movLEDBuf+5,#11h
LOOPKPLAY:
LCALLDisplayLED
;LCALLDelay
MOVA,kPLAYTemp
DJNZR4,LOOPKPLAY
movTLCDkeyBuf,kPLAYTemp
setbrs0;存储键码以便lcd显示上、下限参数!
!
!
mov@r0,kPLAYTemp
decr0
clrrs0
mova,KEYCount
cjnea,#04h,pfjump0
ajmppfjump
pfjump0:
jcpfjump1
cjnea,#07h,pfjump2
ajmppfjump3
pfjump2:
jcpfjump1
pfjump3:
movColumnTemp,#112
movCOLUMN,ColumnTemp
movLCDcount,#08h
movb,#10h
MOVDPTR,#DDATB
MOVPAGE1,#02H
MOVCODE1,TLCDkeyBuf
LCALLCCW_PR
movr0,#LCDkeyBuf
movr1,#TemLCDkeyBuf
movr7,#04h
TLCDLOOP:
mova,@r0
anla,#0fh
swapa
mov@r1,a
decr0
mova,@r0
anla,#0fh
orla,@r1
mov@r1,a
decr0
decr1
djnzr7,TLCDLOOP
movr3,TemLCDkeyBuf-3
movr2,TemLCDkeyBuf-2
movr0,#47h;#LimitParameter0
movr7,#02h
TLCDLOOP1:
acallbcd2hex
movr0,#48h;incr0
movr3,TemLCDkeyBuf-1
movr2,TemLCDkeyBuf
djnzr7,TLCDLOOP1
setbrs0;存储键码以便lcd显示上、下限参数!
!
!
movr0,#LCDkeyBuf
clrrs0
movColumnTemp,#17H
movKEYCount,#00h
pushdpl
pushdph
lcallUartModle;完全显示,包括数据与字母
popdph
popdpl
ajmpKReturn
pfjump1:
mova,ColumnTemp
adda,#07h
movColumnTemp,a
ajmpLCDKdisplay
pfjump:
movColumnTemp,#91
LCDKdisplay:
movCOLUMN,ColumnTemp
movLCDcount,#08h
movb,#10h
MOVDPTR,#DDATB
MOVPAGE1,#02H
MOVCODE1,TLCDkeyBuf
LCALLCCW_PR
INCKEYCount
KReturn:
ret
;串口通讯子程序
;---------------------------------------------
UartModle:
movdptr,#UartTAB;通过串口传送TOPLIMIT:
movr1,#00h
movr7,#0bh
acallUartloop1
movr0,#LCDkeyBuf;传送数据TOPLIMIT
movr7,#04h
movr1,#TemLCDkeyBuf
acallBCD2ASC;将数据转换为ASC码
movr0,#TemLCDkeyBuf
movr7,#04h
acallUartloop
movdptr,#UartTAB;传送LOWLIMIT:
movr1,#0bh
movr7,#0bh
acallUartloop1
clrC
mova,#LCDkeyBuf
subba,#04h
movr0,a;;传送数据LOWLIMIT
movr7,#04h
movr1,#TemLCDkeyBuf
acallBCD2ASC;将数据转换为ASC码
movr0,#TemLCDkeyBuf
movr7,#04h
acallUartloop
movdptr,#UartTAB;传送CURRENT:
movr1,#22
movr7,#0ah
acallUartloop1
movr0,#42h;传送数据CURRENT
movr7,#04h
movr1,#TemLCDkeyBuf
acallBCD2ASC1;将数据转换为ASC码
movr0,#TemLCDkeyBuf
movr7,#04h
acallUartloop
mova,SystemState
jzUartDispNormal
movdptr,#UartTAB;传送WARRING!
movr1,#41
movr7,#0ah
acallUartloop1
ajmpUartReturn
UartDispNormal:
movdptr,#UartTAB;传送NORMAL
movr1,#32
movr7,#09h
acallUartloop1
UartReturn:
ret
;------------------------------------
UartModle0:
movdptr,#UartTAB;传送CURRENT:
movr1,#22
movr7,#0ah
acallUartloop1
movr0,#42h;传送数据CURRENT
movr7,#04h
movr1,#TemLCDkeyBuf
acallBCD2ASC1;将数据转换为ASC码
movr0,#TemLCDkeyBuf
movr7,#04h
acallUartloop
mova,SystemState
jzUartDispNormal0
movdptr,#UartTAB;传送WARRING!
movr1,#41
movr7,#0ah
acallUartloop1
ajmpUartReturn1
UartDispNormal0:
movdptr,#UartTAB;传送NORMAL
movr1,#32
movr7,#09h
acallUartloop1
UartReturn1:
ret
;-----------------------------------------
Uartloop:
;传送数字
mova,@r0
movsbuf,a
Uartwait:
jnbti,Uartwait
clrti
decr0
djnzr7,Uartloop
ret
;--------------------------------------------
Uartloop1:
;传送字符
mova,r1
movca,@a+dptr
movsbuf,a
Uartwait1:
jnbti,Uartwait1
clrti
incr1
djnzr7,Uartloop1
ret
;------------------------------------
BCD2ASC:
;转换为PC机的ASC码
mova,@r0
adda,#30h
mov@r1,a
decr0
decr1
djnzr7,BCD2ASC
ret
BCD2ASC1:
;转换为PC机的ASC码
mova,@r0
adda,#30h
mov@r1,a
incr0
decr1
djnzr7,BCD2ASC1
ret
UartTAB:
DB20h,54h,4fh,50h,4ch,49h,4dh,49h,54h,3ah,20h;;ASC--TOPLIMIT:
-11
DB20h,4ch,4fh,57h,4ch,49h,4dh,49h,54h,3ah,20h;;ASC--LOWLIMIT:
-11
DB20h,43h,55h,52h,52h,45h,4eh,54h,3ah,20h;;ASC--CURRENT:
-10
DB20h,4eh,4fh,52h,4dh,41h,4ch,1ah,0bh;;ASC--NORMAL*-9
DB20h,57h,41h,52h,52h,49h,4eh,47h,21h,0bh;;ASC--WARRING!
-10
;--------------------------------------------
;---------------------------------------------------------------
bcd2hex:
mova,r3
acallbcdh
movr3,a
mova,r2
acallbcdh
movb,#100
mulab
adda,r3
movr3,a
clra
addca,b
movr2,a
drr1:
mova,r2
rrca
movr2,a
mova,r3
rrca
mov@r0,a
ret
bcdh:
movb,#10h
divab
movr4,b
movb,#10
mulab
adda,r4
ret
Delay1:
;延时10ms子程序
movr7,#0ah
DL:
movr6,#0ffh
DL6:
djnzr6,DL6
djnzr7,DL
djnzr5,Delay1
ret
TestKey:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;输出线置为0
movdptr,#IN
movxa,@dptr;读入键状态
cpla
anla,#0fh;高四位不用
ret
KeyTable:
;数字键码定义
db00h,01h,04h,07h
db0fh,02h,05h,08h
db0eh,03h,06h,09h
db0dh,0ch,0bh,0ah
db10H,10H,10H,10H,10H
db10H,10H,10H,10H,10H
GetKey:
movdptr,#OUTBIT
movP2,dph
movr0,#Low(IN)
movr1,#00100000b
movr2,#6
KLoop:
mova,r1;找出键所在列
cpla
movx@dptr,a
cpla
rra
movr1,a;下一列
movxa,@r0
cpla
anla,#0fh
jnzKGoon1;该列有键入
djnzr2,KLoop
movr2,#0ffh;没有键按下,返回0ffh
sjmpKExit
KGoon1:
movr1,a;键值=列X4+行
mova,r2
deca
rla
rla
movr2,a;r2=(r2-1)*4
mova,r1;r1中为读入的行值
movr1,#4
KLoopC:
rrca;移位找出所在行
jcKExit
incr2;r2=r2+行值
djnzr1,KLoopC
KExit:
mova,r2;取出键码
movdptr,#KeyTable
movca,@a+dptr
movr2,a
KWaitRelease:
movdptr,#OUTBIT;等键释放
clra
movx@dptr,a
movr6,#10
callDelay
callTestKey
jnzKWaitRelease
mova,r2
ret
;--------------------------------------------------------
;AD查询转换有关程序
;-----------------------------------------------------------------------
Delay:
movr7,#0;延时子程序
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
ret
DisplayLED:
movr0,Buf
movr1,LEDCount;共6个八段管
movr2,LEDBitControll;从左边开始显示
Loop:
movdptr,#OUTBIT
mova,#00h
movx@dptr,a;关所有八段管
mova,@r0
movdptr,#LEDmap
movca,@a+dptr
movB,#8;送164
DLP:
rlca
movr3,a
movacc.0,c
ANLA,#0FDH
movdptr,#DAT164
movx@dptr,a
movdptr,#CLK164
orla,#02h
movx@dptr,a
anla,#0fDh
movx@dptr,a
mova,r3
djnzB,DLP
movdptr,#OUTBIT
mova,r2
movx@dptr,a;显示一位八段管
movr6,#1
callDelay
mova,r2;显示下一位
rra
movr2,a
incr0
djnzr1,Loop
movdptr,#OUTBIT
mova,#0
movx@dptr,a;关所有八段管
ret
LEDMAP:
;八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
db40H,00h
;-----------------------------------------------------
;LCD显示有关程序
;-----------------------------------------------------
CCW_PR:
;;确定字符字模块首地址
MOVA,CODE1;;取代码
;;字模块宽度为32或16个字节
MULAB;;代码X32或16
ADDA,DPL;;字符字模块首地址=字模库首地址+代码X32
MOVDPL,A
MOVA,B
ADDCA,DPH
MOVDPH,A
PUSHCOLUMN;;列地址入栈
PUSHCOLUMN;;列地址入栈
MOVCODE1,#00H;;代码寄存器借用为间址寄存器
CCW_1:
MOVCOUNT,LCDcount;;计数器设定为16
MOVA,PAGE1;;读页地址寄存器
ANLA,#03H
ORLA,#0B8H;;"或"页地址设置代码
MOVCOM,A;;写页地址设置指令
LCALLPR0
LCALLPR3
POPCOLUMN;;取列地址值
MOVA,COLUMN;;读列地址寄存器
CLRC
SUBBA,#PD1;;列地址-模块参数
JCCCW_2;;<0为左半屏显示区域(E1)
MOVCOLUMN,A;;≥0为右半屏显示区域(E2)
MOVA,PAGE1
SETBACC.3;;设置区域标志位
MOVPAGE1,A;;"0"为E1,"1"为E2
CCW_2:
MOVCOM,COLUMN;;设置列地址值
MOVA,PAGE1;;判区域标志以确定设置哪个