;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;93c46的时钟接atw8p56的portb7 ;93c46的数据输入接atw8p56的portb6 ;93c46的数据输出接atw8p56的portb5 ;93c46的片选通接atw8p56的portb0 ;以16bit读写 ;文件名:atw93c46.asm ;日期: 2006-11-27 ;mcu: atw8P53/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