📄 ad7730试验0(采用模拟spi单次转换)_ok.asm
字号:
DJNZ R5,DELAY4
RET
DELAYQ1: setb p2.7
ret
;------------------------------------------------------------------------
;要写入的数据在A中
Write7730: mov b, #8
Clr CS_
Write7730Lp: clr AdSCK
rlc a
mov AdDIN,c
setb AdSCK
djnz b,Write7730Lp
Clr AdDIN ; 避免意外复位
setb CS_
ret
;------------------------------------------------------------------------
Read7730: mov a, #11111110B
Clr CS_
Clr AdDIN
Read7730Lp: clr SCK
mov c,AdDOUT
rlc a
setb SCK
jc Read7730Lp
setb CS_
ret
;---------------------------------------------------------------------------
InitKey: CLR KeyGetF
CLR KeyPress
Ret
;---------------------------------------------------------------------------
keyscan: Mov keyport,#00001111b
Mov A,KeyPort
Cpl A
Anl A,#00001111b
keyQ: Ret
;--------------------------------------------------------------------------
ReadKey: ACALL keyscan
jnz ReadKey1
Clr keypress
Ret
ReadKey1: Jb Keypress,keyQ
Mov R2,#11101111b
MOV R4,#0
ReadkeyLP: Mov KeyPort,R2
Mov A,KeyPort
Mov B,#0
Jnb Acc.0,keyfind ;ray 1=0,find key
Mov B,#4
jnb Acc.1,keyfind ;ray 2=0,find key
mov B,#8
jnb Acc.2,keyfind ;ray 3=0,find key
MOV B,#12
Jnb Acc.3,keyfind ;ray 4=0,find key
Mov A,R2
Rl A
MOV R2,A
INC R4
CJNE R4,#4,ReadkeyLP
AJmp keyQ
keyfind: MOV A,R4
ADD A,B
Mov Dptr,#KeyTab
MOVC A,@A+DPTR
MOV keycode,A
SETB KeyPress
Setb keyGetF
Ret
;-----------------------------------------------------------------------------
;Key
;Old Scan Code 01 02 03 04 05 06 07 08 09 00 10 11 12 13 14 15
KeyTab: DB 01h,02h,03H,04h,05h,06h,07h,08h,09h,00H,0AH,0BH,0CH,0DH,0EH,0FH
;---------------------------------------------------------------------------
Init_7219: ;初始化7219
MOV SDisbuf,#SHUT_DOWN ;开启正常工作模式(#01h)
MOV SDisbuf+1,#01H
CALL WRITE_7219
MOV SDisbuf,#DISPLAY_TEST ;选择工作模式(#00h)
MOV SDisbuf+1,#00H
CALL WRITE_7219
MOV SDisbuf,#DECODE_MODE ;译码寄存器地址
MOV SDisbuf+1,#00H ;选择全译码方式
CALL WRITE_7219
MOV SDisbuf,#SCAN_LIMIT ;扫描界限寄存器地址
MOV SDisbuf+1,#07H ;选择8个LED
CALL WRITE_7219
MOV SDisbuf,#INTENSITY ;亮度控制寄存器地址
MOV SDisbuf+1,#04H ;设置LED亮度
CALL WRITE_7219
RET
;---------------------------------------------------------------------------
DISPLAY: ;7219_DISPLAY
MOV Dptr,#DisTab
MOV R7,#8
MOV R0,#DISBUF ;根据DisBuf中的值去查DisTab,找字模
MOV SDisbuf,#01H ;先送要显示的位
DIsPLAY1: MOV A,@R0
Movc A,@A+Dptr
MOV SDisbuf+1,A ;后送要显示的数据
CALL WRITE_7219 ;真正送要显示的位和数据
INC SDisbuf ;下一位
INC R0
DJNZ R7,DIsPLAY1 ;显示8个数码管
RET
;--------------------------------------------------------------------------
WRITE_7219: ;7219数据接收从高到低,第一字节为地址,第二字节为数据
CLR LOAD
Mov R1,#SDisbuf
Mov R2,#2
W7219_LOOP1: MOV R3,#8
MOV A,@R1
W7219_LOOP: CLR CLK
RLC A
MOV DIN,C
SETB CLK
DJNZ R3,W7219_LOOP
INC R1
DJNZ R2,W7219_LOOP1
SETB LOAD
RET
;---------------------------------------------------------------------------
DisTab:
; char: "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
; Index: 0 1 2 3 4 5 6 7 8 9
db 07eH,030H,06dH,079H,033H,05bH,05fH,070H,07fH,07BH
; char: "A" "b" "c" "d" "E" "F" " " "-" "P"
; Index 0AH 0bH 0cH 0dH 0eH 0fH 10H 11H 14H
DB 077H,01FH,04EH,03DH,04fH,047H,00H, 01H, 067H,
;---------------------------------------------------------------------------
;SPI单字节发收
SPI_ByteSR:MOV R7,#50
mov SPDR,A
SPI_Wait: Mov a,SPSR
ANL A,#10000000B
Jnz SPI_WaitQ
DJNZ R7,SPI_Wait
SPI_WaitQ: Mov A,SPDR
RET
;---------------------------------------------------------------------------
;高位AD数据送显示
HdataToDis:
Mov A,AD_DataBuf+0
Mov R1,#DisBuf+2
Mov B,A
Anl A,#0FH
Mov @R1,A
Inc R1
Mov A,B
swap A
Anl A,#0FH
Mov @R1,A
Ret
;---------------------------------------------------------------------------
;低位AD数据送显示
LdataToDis:
Mov A,AD_DataBuf+1
Mov R1,#DisBuf+0
Mov B,A
Anl A,#0FH
Mov @R1,A
Inc R1
Mov A,B
swap A
Anl A,#0FH
Mov @R1,A
Ret
;---------------------------------------------------------------------------
;高位AD数据送显示
HdataToDis1:
Mov A,AD_DataBuf+2
Mov R1,#DisBuf+6
Mov B,A
Anl A,#0FH
Mov @R1,A
Inc R1
Mov A,B
swap A
Anl A,#0FH
Mov @R1,A
Ret
;---------------------------------------------------------------------------
;低位AD数据送显示
LdataToDis1:
Mov A,AD_DataBuf+3
Mov R1,#DisBuf+4
Mov B,A
Anl A,#0FH
Mov @R1,A
Inc R1
Mov A,B
swap A
Anl A,#0FH
Mov @R1,A
Ret
;---------------------------------------------------------------------------
CH1CntToDis:
Mov A,CH1Cnt
Mov R1,#DisBuf+0
Mov B,A
Anl A,#0FH
Mov @R1,A
Inc R1
Mov A,B
swap A
Anl A,#0FH
Mov @R1,A
Ret
;---------------------------------------------------------------------------
CH2CntToDis:
Mov A,CH2Cnt
Mov R1,#DisBuf+4
Mov B,A
Anl A,#0FH
Mov @R1,A
Inc R1
Mov A,B
swap A
Anl A,#0FH
Mov @R1,A
Ret
;---------------------------------------------------------------------------
;清内部RAM
CLRRAM: POP DPH
POP DPL
MOV R0,#0FFH
CLRGO: MOV @R0,#00H
DJNZ R0,CLRGO
MOV @R0,#00H
CLR A
JMP @A+DPTR
;=================================== Main ==================================
Main: Mov Sp,#SysStack
ACALL CLRRAM
ACall InitSystem
ACall Initled
ACall InitKey
ACall Init_7219
ACall InitDisplay
ACall InitCD4097
ACall InitAD7730
ACALL InitCTC0
;---------------------------------------------------------------------------
MainLoop: Jbc Sec250F,DoSec250 ;0.0025s
Jbc Sec100F,DoSec100 ;0.01s
Jbc Sec10F,DoSec10 ;0.1s
Jbc SecF,DoSecond ;1s
Ajmp MainLoop
;---------------------------------------------------------------------------
DoSec250: Acall DisPlay
Ajmp MainLoop
;------------------------------------------------------
DoSec100:
Ajmp MainLoop
;------------------------------------------------------
DoSec10: Acall ReadKey
Jbc keyGetF,DoKey
Jb CloseF,DisQuit
Acall HdataToDis
Acall LdataToDis
Acall HdataToDis1
Acall LdataToDis1
;Acall DisPlay
Ajmp MainLoop
DisQuit: ACALL InitDisplay
ACALL CH1CntToDis
ACALL CH2CntToDis
;Acall DisPlay
Ajmp MainLoop
;------------------------------------------------------
DoSecond:
Cpl p2.7
SETB CloseF
Clr EX0
Ajmp MainLoop
;------------------------------------------------------
DoKey: ;键值处理
Mov A,keycode
Mov DisBuf+7,A
Ajmp MainLoop
;------------------------------------------------------
;===========================================================================
Org 1000H ;For 89C51:4KB
End
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -