- 壹零零单片机©版权所有 2008-2025 粤ICP备17151077号
Powered by
xinfuke
5.2.5 ©2008-2025
www.100mcu.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;93c46的时钟接atw8p56的portb7
;93c46的数据输入接atw8p56的portb6
;93c46的数据输出接atw8p56的portb5
;93c46的片选通接atw8p56的portb0
;以16bit读写
;文件名:93c46.asm
;日期: 2006-11-27
;mcu: 8P53/56
;eeprom:93c46
;FSYS: 4mhz
;oscd: 4t
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
c equ 00h ;进位标志位
z equ 02h ;零标志位
indf equ 00h ;间接寻址
tmr0 equ 01h ;定时器0
pcl equ 02h ;程序计数器
status equ 03h ;状态寄存器
fsr equ 04h ;间接寻址地址寄存器
porta equ 05h ;
portb equ 06h ;端口数据寄存器
pcon equ 08h ;电源控制寄存器
wucon equ 09h ;唤醒/电平变化中断控制寄存器
pchbuf equ 0ah ;程序高位寄存器
pdcon equ 0bh ;下拉电阻
odcon equ 0ch ;开漏极输出
phcon equ 0dh ;上拉电阻
int_en equ 0eh ;中断控制
intflag equ 0fh ;中断标志
address equ 11h ;地址
data0 equ 12h ;数据
data1 equ 13h ;数据
temp equ 14h ;临时寄存器
temp1 equ 15h ;临时寄存器
bit equ 16h ;数据个数
sk equ 7 ;时钟
di equ 6 ;数据输入
do equ 5 ;数据输出
cs equ 0 ;ic选通
read equ 10000000b;控制命令
ewen equ 00110000b
erase equ 11000000b
write equ 01000000b
eral equ 00100000b
wral equ 00010000b
ewds equ 00000000b
org 00 ;绝对地址
call initial ;初始化ic
goto main
org 08h
retfie ;退出中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;in register address 地址寄存器
;in register data0 数据寄存器
;in register data1 数据寄存器
;out register temp 数据寄存器
;out register temp1 数据寄存器
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:
movia 0a0h ;数据
movar data0
movia 0ah ;数据
movar data1
movia 00h ;地址
movar address
call write93c46 ;写93c46
movia 00h ;地址
movar address
call read93c46 ;读93c46
movr temp,0
subar data0,0
btrss status,z ;检查数据是否正确
goto main ;错误重写
movr temp1,0
subar data1,0
btrss status,z
GOTO main ;错误重写
complete:
goto complete ;写入完成
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;in register address 地址寄存器
;in register data0 数据寄存器
;in register data1 数据寄存器
;out register
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
write93c46:
bcr portb,cs
call ewen93c46 ;允许读写
call write_93c46 ;写93c46
bcr portb,cs
call busy_test ;检查是否写完成
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;in register address 地址寄存器
;in register data0 数据寄存器
;in register data1 数据寄存器
;buffer register bit 数据个数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
write_93c46: ;写入数据
movia 2
movar bit
bsr portb,cs
call st_93c46 ;开始信号
movia write
call transfor
movia 6 ;发送六位地址
movar bit
rlr address,0
movar temp
rlr temp,0
call transfor
movia 8 ;发送八位数据
movar bit
movr data1,0
call transfor
movia 8 ;发送八位数据
movar bit
movr data0,0
call transfor
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;检测写入是否完成
;in register
;out register
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
busy_test:
bsr portb,cs
call delay4us
busy_test1:
btrss portb,do ;是否写入完成
goto busy_test1
bcr portb,cs ;完成
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;允许写操作
;in register
;out register
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ewen93c46: ;写入允许
bsr portb,cs
call st_93c46
movia 8
movar bit
movia ewen
call transfor
call cs_clr
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;read data from 93c46 从93c46读数据
;in register address 地址寄存器
;out register temp 数据寄存器
;out register temp1 数据寄存器
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
read93c46:
bcr portb,cs
call read_93c46 ;读93c46
call cs_clr ;命令结束
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;in register address 地址寄存器
;out register temp 数据寄存器
;out register temp1 数据寄存器
;buffer register bit 数据个数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
read_93c46:
bsr portb,cs ;允许操作
movia 2
movar bit
call st_93c46 ;开始信号
movia read ;发送读命令
call transfor
movia 6 ;发送六位地址
movar bit
rlr address,0
movar temp
rlr temp,0
call transfor
call byte_read ;读数据
bcr portb,cs ;完成
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;in register
;out register temp 数据寄存器
;out register temp1 数据寄存器
;buffer register bit 数据个数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
byte_read: ;读16bit
movia 16
movar bit
byte_read1:
bsr portb,sk
call delay4us
bcr portb,sk
bcr status,c ;时钟下降沿读取数据
btrsc portb,do
bsr status,c
rlr temp,1
rlr temp1,1
decrsz bit,1
goto byte_read1
nop
bcr portb,sk
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;操作完成信号
;in register
;out register
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cs_clr: ;操作完成
bcr portb,cs
call delay4us
bsr portb,cs
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;in register temp 数据
;buffer register bit 数据个数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
transfor: ;发送八位数据
movar temp
transfor1:
bcr portb,sk
btrsc temp,7 ;检测数据
goto set_di
bcr portb,di
goto out_data
set_di:
bsr portb,di
goto out_data
out_data:
nop
rlr temp,1
bsr portb,sk
decrsz bit,1
goto transfor1
nop ;发送完成
bcr portb,sk
bcr portb,di
nop
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;开始信号
;in register
;out register
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
st_93c46: ;开始信号
bcr portb,sk
call delay2us
bsr portb,di
call delay2us
bsr portb,sk
call delay2us
bcr portb,sk
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;延迟4微秒
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay4us:
nop
nop
nop
nop
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;延迟2微秒
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay2us:
return
initial:
movia 020h ;打开lvd
movar pcon
movia 000h ;关闭portb口电平变化唤醒
movar wucon
movia 0ffh ;关闭下拉电阻
movar pdcon
movia 00h ;关闭开漏极输出
movar odcon
movia 0ffh ;关闭上拉电阻
movar phcon
movia 000h ;分频器给time0
option
movia 00h ;端口设为输出
iost porta
movia 20H ;端口设为输出
iost portb
movia 00h ;输出低电平
movar porta
movia 00h ;输出低电平
movar portb
movia 00h ;关闭中断功能
movar int_en
return