sclk24 equ p3.4
sda24 equ p3.5
org 0000h
ajmp main
org 0030h
main:
mov dptr,#tab
mov a,#00h ;读2401时的地址放入a
lcall rd24
cjne a,#10,tt ;满10后,重新变为0,因为只显示0-9
mov a,#00h
tt:mov 30h,a
movc a,@a+dptr
clr p2.6 ;开数码管
mov p1,a ;送显示
mov a,30h
inc a
mov b,a ;开机次数放入b中
mov a,#00h; 写2401时的地址放入a
lcall wt24
ajmp $
tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h
rd24: push acc ;读24c02子程序。
call start24 ;启动
mov a,#0a0h ;写控制字放入a
call shift8 ;8位数据逐位移入sda24
call ack ;应答
pop acc ;弹出要读入的数据的地址
call shift8
call ack
call start24
mov a,#0a1h ;读控制字放入a
call shift8
call ack
mov r7,#8 ;接下来的这几行是把2401中的数据从sda24逐位移入a
clr a
rd00:rl a ;8个位
mov c,sda24
setb sclk24
clr sclk24
mov acc.0,c
djnz r7,rd00
ret
wt24:push acc;写入24c02程序:
call start24
mov a,#0a0h
call shift8
call ack
pop acc ;弹出要写入的数据的地址
call shift8
call ack
mov a,b
call shift8
call ack
call stop
call delay2
ret
start24:clr sda24;开始条件
setb sda24
setb sclk24
clr sda24
clr sclk24
ret
stop:clr sda24;停止条件
setb sclk24
setb sda24
ret
ack: setb sclk24;应答信号
clr sclk24
ret
shift8: mov r7,#8;读、写数据
sh01:rlc a
mov sda24,c
setb sclk24
clr sclk24
djnz r7,sh01
ret
delay2: nop
ret
end
上面这个就是我做2401试验时用的程序,实现的功能是数码管显示单片机复位的次数,有条件的可以做一下这个试验。我用的数码管是共阳极的,如果是共阴的,需把tab后的段码改一下。我在做试验时同时改动了加下划线的2行(读和写的地址),结果从0到255都可以,所以我想不通:为什么2401有256个地址呢?