共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 跳转至页
回复
打赏帖 | |
---|---|
嵌入式LinuxC语言程序调试和宏使用技巧被打赏50分 | |
让代码中包含最新的编译时间信息被打赏50分 | |
rtthread硬件加密--2crc加密分析被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】mcxa156使用低功耗定时器适配硬件RTC框架被打赏26分 | |
【STM32F769】AI之与本地deepseek对接被打赏50分 | |
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 |