关于STC15F104W程序移植到STC8G1K08A提示地址设置无效的问题
我有原来用STC15F104W制作的一个24C串口存储器复制器,用STC15F104W一切正常,最近有学习8G和8H系列Stc芯片的应用,就想把这个程序移植到STC8G1K08A上看可不可以正常运行,结果发现只要复制开关和LED指示只要设置为P5.5和P5.4编译就会提示“stc15F104W 24C02存储器的示莞粗破髟闯绦?asm(35): error A17: INVALID BYTE BASE IN BIT ADDRESS EXPRESSION”,只要改为P3.5和P3.4就可以正常编译,可是8G1K08A-SOP8上没有这两个端口只有P5.5和P5.4,搞不清这个到底问题出在哪里,希望哪位大侠指点一下。
;==============================
;24C02存储器的数据复制器源程序
;STC8g1k08a
;11.0592M
;P3.3 SDA
;P3.2 SCL
;P5.4 LED
;P5.5 复制开关
;
;==============================
; $NOMOD51
;$INCLUDE (stc8g.h)
P0M0 DATA 094H
P0M1 DATA 093H
P1M0 DATA 092H
P1M1 DATA 091H
P2M0 DATA 096H
P2M1 DATA 095H
P3M0 DATA 0B2H
P3M1 DATA 0B1H
P4M0 DATA 0B4H
P4M1 DATA 0B3H
P5M0 DATA 0CAH
P5M1 DATA 0C9H
P6M0 DATA 0CCH
P6M1 DATA 0CBH
P7M0 DATA 0E2H
P7M1 DATA 0E1H
sda EQU p3.3
scl EQU p3.2
fz bit p5.5
led bit p5.4
address EQU 08H
i2cdate EQU 09H
org 0000H
ljmp start
;======================== 存储器写
i2c_write:
i2c_write_a:
lcall i2c_start
mov a,r6
lcall i2c_send
lcall i2c_ack
Jc i2c_write_a
mov a,address
lcall i2c_send
lcall i2c_ack
mov a,i2cdate
lcall i2c_send
lcall i2c_ack
lcall i2c_stop
ret
;========================存储器读
i2c_read:
i2c_read_a:
lcall i2c_start
mov a,r2
lcall i2c_send
lcall i2c_ack
Jc i2c_read_a
mov a,address
lcall i2c_send
lcall i2c_ack
i2c_read_b:
lcall i2c_start
mov a,r4
lcall i2c_send
lcall i2c_ack
Jc i2c_read_b
i2c_rece:
lcall i2c_receive
mov i2cdate,a
lcall i2c_ack
lcall i2c_stop
ret
;=======================总线启动
i2c_start:
setb scl
setb sda
lcall delay5us
nop
nop
nop
nop
nop
clr sda
lcall delay5us
nop
nop
nop
nop
nop
clr scl
ret
;=======================总线停止
i2c_stop:
clr sda
lcall delay5us
nop
nop
nop
nop
nop
setb scl
lcall delay5us
nop
nop
nop
nop
nop
setb sda
ret
;======================存储器应答
i2c_ack:
setb sda
lcall delay5us
nop
nop
nop
nop
nop
setb scl
Jb sda,i2c_ack0
clr c
sjmp i2c_ack_end
i2c_ack0:
setb c
i2c_ack_end:
lcall delay5us
nop
nop
nop
nop
nop
clr scl
ret
;=====================发送八位数据
i2c_send:
mov b,#08H
i2c_send1:
rlc a
mov sda,c
setb scl
lcall delay5us
nop
nop
nop
nop
nop
clr scl
djnz b,i2c_send1
ret
;====================接收八位数据
i2c_receive:
mov b,#08H
clr a
setb sda
i2c_receive_a:
setb scl
lcall delay5us
nop
nop
nop
nop
nop
mov c,sda
rlc a
clr scl
djnz b,i2c_receive_a
ret
;=======================延时程序
delay:
mov r1,#255
djnz r1,$
ret
;=======================延时程序
delay5us: ;@11.0592MHz
NOP
NOP
PUSH 30H
MOV 30H,#15
NEXT:
DJNZ 30H,NEXT
POP 30H
RET
;===============256字节数据复制程序
copy:
mov r5,#0
s:
mov r2,#10100010b
mov r4,#10100011b
call i2c_read
mov i2cdate,a
setb led
mov r6,#10100000b
call i2c_write
inc address
djnz r5, s
clr led
ret
;=========================主程序
start:
MOV SP, #5FH
MOV P0M0, #00H
MOV P0M1, #00H
MOV P1M0, #00H
MOV P1M1, #00H
MOV P2M0, #00H
MOV P2M1, #00H
MOV P3M0, #00H
MOV P3M1, #00H
MOV P4M0, #00H
MOV P4M1, #00H
MOV P5M0, #00H
MOV P5M1, #00H
mov p3,#255
clr led
mov address,#00H
wai:
jb fz,$
call delay
jnb fz,$
call copy
ljmp wai
end
使用官方头文件,或者参考官方头文件方法定义P5试试:
P5 DATA 0C8H
P50 BIT P5.0
P51 BIT P5.1
P52 BIT P5.2
P53 BIT P5.3
P54 BIT P5.4
P55 BIT P5.5 乘风飞扬 发表于 2024-4-29 10:40
使用官方头文件,或者参考官方头文件方法定义P5试试:
{:handshake:}{:4_201:}{:lol:}官方头文件加载后会一直报错端口重复设置A10错误,把你发的这个复制加载到端口设置后可以正常编译通过了,实际烧写后测试24C复制也是正常工作的。原来主要是用89C和12C 及15系列的,8G和8H的最近才开始用,发现这个端口设置真的非常重要,设置不正确根本不要想用,不想原来的那些基本默认是双向口。{:4_167:}
页:
[1]