📄 ad7730 spi serial convert.asm
字号:
;----------------------------------------------------------------------------
Delay3: mov R5,#100 ;1s delay
DELAY4: MOV R6,#50
DELAY5: MOV R7,#100
wait1: JNB RDY_,DELAYQ1
DJNZ R7,wait1
DJNZ R6,DELAY5
DJNZ R5,DELAY4
RET
DELAYQ1: setb p2.7
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:Clr CS_
MOV R7,#50
mov SPDR,A
SPI_Wait: Mov a,SPSR
ANL A,#10000000B
Jnz SPI_WaitQ
DJNZ R7,SPI_Wait
SPI_WaitQ: ;Clr AdDIN
Mov A,SPDR
SetB CS_
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
;--------------------------------------------------------------------------
;清内部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 InitSPI
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:
Ajmp MainLoop
;------------------------------------------------------
DoSec100:
Ajmp MainLoop
;------------------------------------------------------
DoSec10: Acall HdataToDis
Acall LdataToDis
Acall DisPlay
Acall ReadKey
Jbc keyGetF,DoKey
Ajmp MainLoop
;------------------------------------------------------
DoSecond: Cpl p2.7
;Cpl CD4097_A
Ajmp MainLoop
;------------------------------------------------------
DoKey: ;键值处理
Mov A,keycode
Mov DisBuf+7,A
;Cpl CD4097_A
Ajmp MainLoop
;-----------------------------------------------------------------------
;写模式寄存器 启动-80~+80mv范围单次转换
ADSingleWR:
CLR CS_
;setb p2.6
MOV A,#02H ;写通讯寄存器#02H 设置下一操作是写模式寄存器
ACALL SPI_ByteSR
MOV A,#0100000B ;启动单次转换模式
ACALL SPI_ByteSR
MOV A,#1011000B
ACALL SPI_ByteSR
SETB CS_
RET
;------------------------------------------------------------------------
;写模式寄存器 启动-80~+80mv范围连续转换
ADSConvert:
CLR CS_
MOV A,#02H
ACALL SPI_ByteSR
MOV A,#00100000B ;启动连续转换模式
ACALL SPI_ByteSR
MOV A,#10110000B
ACALL SPI_ByteSR
SETB CS_
RET
;------------------------------------------------------------------------
;Read7730: mov a, #11111110b
;Read7730Lp: clr Clk7730
; mov c, Dout7730
; rlc a
; setb Clk7730
; jc Read7730Lp
; ret
;===========================================================================
Org 1000H ;For 89C51:4KB
End
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -