共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |