共2条
1/1 1 跳转至页
问
;为什么红色的地方有错的?难道这样的间址方式不对?请指点.
很急啊!!!!!!!!!!!!
org 0000h
ajmp star
org 0020h
star: ;初始化把所有的位全部清零
mov a,#00h
mov 20H,a
mov 21H,a
mov 22H,a
mov 23H,a
mov 24H,a
mov 25H,a
stlop: acall display ;调用显示
jnb p3.2,we ;监测键盘,如果p3.2按下那么执行显示
jnb p3.3,wc
jb p3.2,stlop
wc: acall display
acall dims
jnb p3.3,wc
acall RK
we: acall display ;显示保持!
acall dims ;延时1ms避免键盘误动作
nb p3.2,we ;如果p3.2还没有放开继续延时
ljmp WK
count: ;计算数据部分
inc a_bit ;个位加1
mov a,a_bit
cjne a,#10,stlop ;如果在10以内显示
mov a_bit,#00h ;如果到了10则清除
inc b_bit ;10位加1
mov a,b_bit
cjne a,#10,stlop ;如果在10以内显示
mov b_bit,#00h ;如果到了10则清除
inc c_bit ;百位加1
mov a,c_bit
cjne a,#10,stlop
mov c_bit,#00h
inc d_bit
mov a,d_bit
cjne a,#10,stlop
mov d_bit,#00h
inc e_bit
mov a,e_bit
cjne a,#10,stlop
mov e_bit,#00h
inc f_bit
mov a,f_bit
cjne a,#10,stlop
mov f_bit,#00h
ajmp stlop
display: ;显示
mov dptr,#numtab ;送数据表
mov a,a_bit ;送个位数据
MOVC A,@A+DPTR ;查表
mov p0,a ;送p0口显示
clr p2.6 ;选中第一个数码管
acall dims ;显示1ms
setb p2.6 ;关闭显示
mov a,b_bit ;送10位数据
MOVC A,@A+DPTR ; 查表
mov p0,a ;送p0口显示
clr p2.5 ;选中第二个数码管
acall dims ;显示1ms
setb p2.5 ;关闭显示
mov a,c_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.4
acall dims
setb p2.4
mov a,d_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.3
acall dims
setb p2.3
mov a,e_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.2
acall dims
setb p2.2
mov a,f_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.1
acall dims
setb p2.1
ret
dims: ;数码管延时1MS
MOV R7,#2
DJNZ R7,$
RET
;数码管代码表
numtab: db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
;0 1 2 3 4 5 6 7 8 9
WK:
CLR P3.7
MOV R1,#6H
MOV R2,#20H
IIC_write:
SETB P1.0 ;先使IIC总线处于空闲状态
SETB P1.1
NOP
CLR P1.1 ;启动IIC总线
NOP
CLR P1.0
MOV A,#0A0H ;AT24C02七位地址码1010000和一位写信号0
LCALL write_byte ;调用写一个字节数据子程序
MOV A,R2 ;选中AT24C02的20元
LCALL write_byte
KK: MOV A,@R2 ;向AT24C02的20H写数据@R2
LCALL write_byte
INC R2
DJNZ R1,KK
CLR P1.0 ;停止IIC总线,使其处于空闲状态
NOP
CLR P1.1
NOP
SETB P1.0
NOP
SETB P1.1
NOP
SETB P3.7
RET
Write_byte:
MOV R7,#08 ;一个字节分8次写
GO1: NOP
CLR P1.0
NOP
RLC A
MOV P1.1,C
SETB P1.0
DJNZ R7,GO1
CLR P1.0 ;发第9个时钟脉冲,准备接收应答信号
NOP
SETB P1.0
NOP
WAIT:JB P1.1,WAIT ;应答信号有效,数据传送成功就返回
CLR P1.0
RET
RK:
CLR P3.7
MOV R1,#6H
MOV R2,#20H
IIC_read:
SETB P1.0 ;使IIC总线处于空闲状态
SETB P1.1
NOP
CLR P1.1 ;启动IIC总线
NOP
CLR P1.0
MOV A,#0A0H ;AT24C02七位地址码1010000和一位写信号0
LCALL write_byte
MOV A,R2 ;选中AT24C02的10H单元
LCALL write_byte
SETB P1.0 ;再次启动IIC总线
SETB P1.1
NOP
CLR P1.1
NOP
CLR P1.0
MOV A,#0A1H ;AT24C02七位地址码1010000和一位读信号1
LCALL write_byte ;调用写一个字节数据子程序
F1:
LCALL read_byte ;从AT24C02的10H单元读数据
MOV @R2,A ;保存读的一个字节数据
INC R2
DJNZ R1,F1
CLR P1.0 ;停止IIC总线,使其处于空闲状态
NOP
CLR P1.1
NOP
SETB P1.0
NOP
SETB P1.1
NOP
SETB P3.7
RET
Read_byte:
MOV R7,#08 ;一个字节分8次读
GO 2: CLR P1.0
NOP
SETB P1.0
NOP
MOV C,P1.1
RLC A
DJNZ R7,GO2
CLR P1.0
NOP
SETB P1.1 ;第9个时钟脉冲,8031发送非应答信号,通知AT24C02停止发送数据
SETB P1.0
RET
END
答 1: 当然有错!!!间接寻址中的Rn的n只能是0或1。 答 2: 请教您一下:“很稳啊”是什么意思啊?好像和这个主题很难切入! 答 3: 是啊!!感谢楼上!!我很久没有写单片机程序了,把这点忘了!
谢谢! 答 4: 不客气!不过我建议你在对E2PROM的操作(读和写)间隔时间要大于10ms。比如在连续写时,调用写操作之前或之后要加延时!不然是无法写进的。页操作也是如此!
很急啊!!!!!!!!!!!!
org 0000h
ajmp star
org 0020h
star: ;初始化把所有的位全部清零
mov a,#00h
mov 20H,a
mov 21H,a
mov 22H,a
mov 23H,a
mov 24H,a
mov 25H,a
stlop: acall display ;调用显示
jnb p3.2,we ;监测键盘,如果p3.2按下那么执行显示
jnb p3.3,wc
jb p3.2,stlop
wc: acall display
acall dims
jnb p3.3,wc
acall RK
we: acall display ;显示保持!
acall dims ;延时1ms避免键盘误动作
nb p3.2,we ;如果p3.2还没有放开继续延时
ljmp WK
count: ;计算数据部分
inc a_bit ;个位加1
mov a,a_bit
cjne a,#10,stlop ;如果在10以内显示
mov a_bit,#00h ;如果到了10则清除
inc b_bit ;10位加1
mov a,b_bit
cjne a,#10,stlop ;如果在10以内显示
mov b_bit,#00h ;如果到了10则清除
inc c_bit ;百位加1
mov a,c_bit
cjne a,#10,stlop
mov c_bit,#00h
inc d_bit
mov a,d_bit
cjne a,#10,stlop
mov d_bit,#00h
inc e_bit
mov a,e_bit
cjne a,#10,stlop
mov e_bit,#00h
inc f_bit
mov a,f_bit
cjne a,#10,stlop
mov f_bit,#00h
ajmp stlop
display: ;显示
mov dptr,#numtab ;送数据表
mov a,a_bit ;送个位数据
MOVC A,@A+DPTR ;查表
mov p0,a ;送p0口显示
clr p2.6 ;选中第一个数码管
acall dims ;显示1ms
setb p2.6 ;关闭显示
mov a,b_bit ;送10位数据
MOVC A,@A+DPTR ; 查表
mov p0,a ;送p0口显示
clr p2.5 ;选中第二个数码管
acall dims ;显示1ms
setb p2.5 ;关闭显示
mov a,c_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.4
acall dims
setb p2.4
mov a,d_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.3
acall dims
setb p2.3
mov a,e_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.2
acall dims
setb p2.2
mov a,f_bit
MOVC A,@A+DPTR
mov p0,a
clr p2.1
acall dims
setb p2.1
ret
dims: ;数码管延时1MS
MOV R7,#2
DJNZ R7,$
RET
;数码管代码表
numtab: db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
;0 1 2 3 4 5 6 7 8 9
WK:
CLR P3.7
MOV R1,#6H
MOV R2,#20H
IIC_write:
SETB P1.0 ;先使IIC总线处于空闲状态
SETB P1.1
NOP
CLR P1.1 ;启动IIC总线
NOP
CLR P1.0
MOV A,#0A0H ;AT24C02七位地址码1010000和一位写信号0
LCALL write_byte ;调用写一个字节数据子程序
MOV A,R2 ;选中AT24C02的20元
LCALL write_byte
KK: MOV A,@R2 ;向AT24C02的20H写数据@R2
LCALL write_byte
INC R2
DJNZ R1,KK
CLR P1.0 ;停止IIC总线,使其处于空闲状态
NOP
CLR P1.1
NOP
SETB P1.0
NOP
SETB P1.1
NOP
SETB P3.7
RET
Write_byte:
MOV R7,#08 ;一个字节分8次写
GO1: NOP
CLR P1.0
NOP
RLC A
MOV P1.1,C
SETB P1.0
DJNZ R7,GO1
CLR P1.0 ;发第9个时钟脉冲,准备接收应答信号
NOP
SETB P1.0
NOP
WAIT:JB P1.1,WAIT ;应答信号有效,数据传送成功就返回
CLR P1.0
RET
RK:
CLR P3.7
MOV R1,#6H
MOV R2,#20H
IIC_read:
SETB P1.0 ;使IIC总线处于空闲状态
SETB P1.1
NOP
CLR P1.1 ;启动IIC总线
NOP
CLR P1.0
MOV A,#0A0H ;AT24C02七位地址码1010000和一位写信号0
LCALL write_byte
MOV A,R2 ;选中AT24C02的10H单元
LCALL write_byte
SETB P1.0 ;再次启动IIC总线
SETB P1.1
NOP
CLR P1.1
NOP
CLR P1.0
MOV A,#0A1H ;AT24C02七位地址码1010000和一位读信号1
LCALL write_byte ;调用写一个字节数据子程序
F1:
LCALL read_byte ;从AT24C02的10H单元读数据
MOV @R2,A ;保存读的一个字节数据
INC R2
DJNZ R1,F1
CLR P1.0 ;停止IIC总线,使其处于空闲状态
NOP
CLR P1.1
NOP
SETB P1.0
NOP
SETB P1.1
NOP
SETB P3.7
RET
Read_byte:
MOV R7,#08 ;一个字节分8次读
GO 2: CLR P1.0
NOP
SETB P1.0
NOP
MOV C,P1.1
RLC A
DJNZ R7,GO2
CLR P1.0
NOP
SETB P1.1 ;第9个时钟脉冲,8031发送非应答信号,通知AT24C02停止发送数据
SETB P1.0
RET
END
答 1: 当然有错!!!间接寻址中的Rn的n只能是0或1。 答 2: 请教您一下:“很稳啊”是什么意思啊?好像和这个主题很难切入! 答 3: 是啊!!感谢楼上!!我很久没有写单片机程序了,把这点忘了!
谢谢! 答 4: 不客气!不过我建议你在对E2PROM的操作(读和写)间隔时间要大于10ms。比如在连续写时,调用写操作之前或之后要加延时!不然是无法写进的。页操作也是如此!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |