📄 25aa640.asm
字号:
#include ht46r47.inc
cs equ pa.3
SO equ pa.2
SI equ pa.1
CLK equ pa.0
SO_C equ pac.2
data .section 'data'
data1 db ? ;写状态寄存器指令值
data2 db ? ;8位数据赋值
data3 db ? ;32位数据赋值
data4 db ? ;7f位数据赋值
sheetdata db ? ;数据表位数
count1 db ? ;定义计数1变量,时间延时用
count2 db ? ;定义计数2变量,时间延时用
win_address db ? ;要写入的地址值
win_data db ? ;要写入的数据值
rout_address db ? ;要读出的地址值
rout_data db ? ;要读出数据存储器中的数据值(包括状态寄存器中的数据值)
WAIT_WRITE MACRO ;为了给写足够的时间,25AA640=5MS ;延时 (2*R2+3)*R1+2=(2*27+3)*98+2=6000us 约6ms
LOCAL R1,R2
mov a,27
mov count1,a
R1:
mov a,98
mov count2,a
R2:
sdz count2
jmp R2
sdz count1
jmp R1
ENDM
code .section 'code'
org 00h
jmp star
star:
set cs
clr pac ;设PA口为输出
CLR SO_C ;设SO口为输出
;-----------------------------------------------
;;;;;;;设置写状态寄存器指令
clr cs
mov a,01h
call wdata
mov a,00h ;写入前状态寄存器值00
call wdata
nop
set cs
nop
;-----------------------------------------------
;;;;;;;;;设置写使能
; clr cs
; mov a,06h
; call wdata
; set cs
; nop
;------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;设置写失效
; clr cs
; mov a,04h
; call wdata
; set cs
; nop
;-------------------------------------------------
;;;;;;;;;;;;设置读状态寄存器指令
; clr cs
; mov a,05h
; call wdata
; nop
; call rdata ;读出目前状态寄存器值
; nop
; set cs
; nop
; mov a,routdata ;将状态寄存器值放入ACC
;---------------------------------------------------
MAIN:
mov a,00h ;要写入数据的开始地址值
mov win_address,a
call page_write ;页写
mov a,79h ;要写入数据的地址值
mov win_address,a
mov a,06h ;要写入的数据
mov win_data,a
; CALL BYTE_WRITE ;字节写
mov a,001h ;要读出数据的地址值
mov rout_address,a
call read
MOV A,rout_data ;可以检验读出的值是否和写入的值一样
;=======================================================
byte_write: ;;;;;;;;;;;;;;;;;;;字节写(向存储器中写入1个数据)
clr cs
mov a,06h ;设置写使能
call wdata
set cs
nop
clr cs
mov a,02h ;设置写指令
call wdata
mov a,00h ;设置写入的前8位地址数据
call wdata
mov a,win_address ;设置写入的后8位地址数据
call wdata
mov a,win_data ;要写入数据的值
call wdata
set cs
WAIT_WRITE ;给写至少5MS的时间
ret
;=======================================================
page_write: ;;;;;;;;;;;页写(最多向存储器中写入连续32个数据)
mov a,00h
mov sheetdata,a ;指定载入数据存储器700H位置的数
pageloop:
clr cs
mov a,06h ;设置写使能
call wdata
set cs
nop
clr cs
mov a,02h ;设置写指令
call wdata
mov a,00h ;设置写入的前8位地址数据
call wdata
mov a,win_address ;指定写入数据的开始地址位置
call wdata
mov a,32 ;页写最多32个数据(25AA640内部规定)
mov data3,a
loop3:
mov a,sheetdata
mov tblp,a ;指定载入数据存储器7xxH位置的数
tabrdl acc ;读入ACC(TBLP,A 所指定的数)
call wdata
inc sheetdata
inc win_address ;地址加一,若不考虑写地址从00开始,可以跟SHEETDATA用一样的.
;----------------------------
mov a,083h ;判断写数据的个数 ‘83h’表示连续写00h-82h的值) 此值可以随意,跟下面的有区别
sub a,sheetdata
sz acc
jmp DL32
jmp extout
DL32:
sdz data3
jmp loop3
out:
set cs
wait_write
jmp pageloop
extout:
set cs
wait_write
ret
;----------------------------
; sdz data3
; jmp loop3
; set cs
; WAIT_WRITE ;给写至少5MS的时间
; mov a,080h ;判断写数据的个数 ‘80h’表示连续写00H-7F的值,此值可以为 20H,40H,60H 80H A0H C0H E0H
; sub a,sheetdata
; sz acc
; jmp pageloop
; ret
;==============================================
read: ;;;;;;;;;;;;;;;;;;;读出存储器中的值
clr rout_data ;清除
clr cs
mov a,03h ;读指令
call wdata
mov a,00h ;写入读出数据的前8位地址
call wdata
mov a,rout_address ;写入读出数据的后8位地址
call wdata
call rdata ;读出上面地址中的数据
set cs
ret
;==============================================
;delay: ;低指令
; set count1
; set count2
;dloop:
; sdz count1
; jmp dloop
; sdz count2
; jmp dloop
; ret
;====================================================
wdata: ;;;;;;;;;;;;;;;;;;;;;;;;;写寄存器
mov data1,a
mov a,8
mov data2,a
wloop:
clr clk
clr si
sz data1.7
set si
nop
set clk
rl data1
sdz data2
jmp wloop
ret
;====================================================
rdata: ;;;;;;;;;;;;;;;;;;;;;;;;;读寄存器
mov a,8
mov data2,a
SET SO_C ; SET PAC.2 设SO口为输入
rloop:
clr clk
rl rout_data
clr rout_data.0
sz so
set rout_data.0
set clk
nop
sdz data2
jmp rloop
nop
ret
;====================================================
org 700h
; 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
dc 006h,0ffh,0ffh,000h,040h,000h,001h,000h,000h,040h,00fh,02ch,044h,010h,028h,006h ;0x00h------0x0fh
dc 01ch,034h,04ch,018h,030h,048h,014h,02ch,044h,010h,028h,040h,00ch,024h,03ch,008h ;0x10h------0x1fh
dc 020h,038h,04eh,01eh,036h,04eh,01ah,032h,04ah,016h,02eh,046h,012h,02ah,042h,00eh ;0x20h------0x2fh
dc 026h,03eh,00ah,022h,03ah,001h,013h,005h,000h,048h,000h,038h,098h,038h,0a2h,034h ;0x30h------0x3fh
dc 085h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,003h,030h,000h,000h ;0x40h------0x4fh
dc 000h,000h,000h,002h,001h,002h,040h,021h,000h,003h,000h,000h,000h,099h,000h,000h ;0x50h------0x5fh
dc 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x60h------0x6fh
dc 000h,000h,000h,082h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x70h------0x7fh
dc 000h,000h,000h ;0x80h------0x8fh
;=====================================================
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -