📄 93c46.asm
字号:
;MICROWIRE 总线读写操作
;AT93C46
F_DI BIT P1.0
F_DO BIT P1.1
F_SK BIT P1.2
F_CS BIT P1.3
BYTE_ADDR DATA 20H ;指定地址
BYTE_DATA DATA 21H ;指定数据
ORG 0000H
AJMP MAIN
;
;***************************************************************
; /*主程序*/ *
;***************************************************************
;
ORG 0030H
MAIN: MOV P1,#11110010B
CALL F_ERASE ;擦除芯片
CALL F_EWRITE ;写使能
MOV R1,#80H
MOV BYTE_ADDR,#00H
MOV BYTE_DATA,#00H
MAIN1: CALL F_WRITE ;在指定的地址中写入数据
INC BYTE_ADDR
INC BYTE_DATA
DJNZ R1,MAIN1
MOV BYTE_ADDR,#00H
MAIN2: CALL F_READ ;从指定的地址中读出数据
MOV R0,BYTE_DATA
CALL DISP ;显示
CALL DELAY
INC BYTE_ADDR
DJNZ R1,MAIN2
JMP MAIN2
DISP: MOV A,R0 ;低位
ANL A,#0FH
ACALL DSEND ;显示
MOV A,R0
SWAP A
ANL A,#0FH ;高位
ACALL DSEND ;显示
RET
DSEND: MOV DPTR,#SGTB1
MOVC A,@A+DPTR ;取字符
MOV SBUF,A ;发送字符
JNB TI,$ ;等待串口发送完
CLR TI
RET
;
;***************************************************************
; /* 从指定的地址中读出数据 1 10 A6~A0* D7~D0 */ *
;***************************************************************
;
F_READ: SETB F_CS ;片选为 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
SETB F_DI ;起始位 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
SETB F_DI ;操作码 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
CLR F_DI ;操作码 '0'
NOP
SETB F_SK ;时钟
CLR F_SK
MOV A,BYTE_ADDR ;地址段 'A6~A0 X'
RLC A
MOV R0,#07H
F_READ1: RLC A
MOV F_DI,C
SETB F_SK ;时钟
CLR F_SK
DJNZ R0,F_READ1
CLR F_DI
MOV R0,#08H ;数据段
F_READ2: SETB F_SK ;时钟
CLR F_SK
MOV C,F_DO
RLC A
DJNZ R0,F_READ2
MOV BYTE_DATA,A
CLR F_CS ;片选为 '0'
RET
;
;***************************************************************
; /* 写使能 1 00 11XXXXX */ *
;***************************************************************
;
F_EWRITE: SETB F_CS ;片选为 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
SETB F_DI ;起始位 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
CLR F_DI ;操作码 '0'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
CLR F_DI ;操作码 '0'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
MOV A,#11111111B ;地址段 '11XXXXX'
MOV R0,#07H
F_EWRITE1: RLC A
MOV F_DI,C
SETB F_SK ;时钟
CLR F_SK
DJNZ R0,F_EWRITE1
CLR F_DI
CLR F_CS ;片选为 '0'
RET
;
;***************************************************************
; /* 写禁止 1 00 00XXXXX */ *
;***************************************************************
;
F_DWRITE: SETB F_CS ;片选为 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
SETB F_DI ;起始位 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
CLR F_DI ;操作码 '0'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
CLR F_DI ;操作码 '0'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
MOV A,#00111111B ;地址段 '00XXXXX'
MOV R0,#07H
F_DWRITE1: RLC A
MOV F_DI,C
SETB F_SK ;时钟
CLR F_SK
DJNZ R0,F_DWRITE1
CLR F_DI
CLR F_CS ;片选为 '0'
RET
;
;***************************************************************
; /* 写数据到指定的地址中 1 01 A6~A0 D7~D0 */ *
;***************************************************************
;
F_WRITE: SETB F_CS ;片选为 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
SETB F_DI ;起始位 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
CLR F_DI ;操作码 '0'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
SETB F_DI ;操作码 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
MOV A,BYTE_ADDR ;地址段 'A6~A0 X'
RLC A
MOV R0,#07H
F_WRITE1: RLC A
MOV F_DI,C
SETB F_SK ;时钟
CLR F_SK
DJNZ R0,F_WRITE1
MOV A,BYTE_DATA ;数据段
MOV R0,#08H
F_WRITE2: RLC A
MOV F_DI,C
SETB F_SK ;时钟
CLR F_SK
DJNZ R0,F_WRITE2
CLR F_DI
CLR F_CS ;片选为 '0'
setb f_do
setb f_cs
setb f_sk
NOP
f_write4: JB F_DO,F_WRITE3 ;等待写完毕
clr f_sk
setb f_sk
ajmp f_write4
F_WRITE3: clr f_sk
clr f_cs
RET
;
;***************************************************************
; /* 擦除芯片 1 00 10XXXXX */ *
;***************************************************************
;
F_ERASE: SETB F_CS ;片选为 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
SETB F_DI ;起始位 '1'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
CLR F_DI ;操作码 '0'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
CLR F_DI ;操作码 '0'
NOP
SETB F_SK ;时钟
CLR F_SK
NOP
MOV A,#10111111B ;地址段 '10XXXXX'
MOV R0,#07H
F_ERASE1: RLC A
MOV F_DI,C
SETB F_SK ;时钟
CLR F_SK
DJNZ R0,F_ERASE1
CLR F_DI
CLR F_CS ;片选为 '0'
NOP
setb f_do
setb f_cs
setb f_sk
f_erase4: JB F_DO,F_erase3 ;等待写完毕
setb f_sk
clr f_sk
ajmp f_erase4
F_erase3: clr f_cs
RET
;F_ERASE2: JNB F_DO,F_ERASE2 ;等待擦除完毕
; RET
;
;***************************************************************
; /*延时子程序*/ *
;***************************************************************
;
DELAY: MOV R6,#250 ;延时
DELAY1: MOV R7,#250
DJNZ R7,$
DJNZ R6,DELAY1
RET
;
;***************************************************************
; /*字符编码*/ *
;***************************************************************
;
SGTB1: DB 03H ;0
DB 9FH ;1
DB 25H ;2
DB 0DH ;3
DB 99H ;4
DB 49H ;5
DB 41H ;6
DB 1FH ;7
DB 01H ;8
DB 09H ;9
DB 11H ;A
DB 0C1H ;B
DB 63H ;C
DB 85H ;D
DB 61H ;E
DB 71H ;F
DB 00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -