xjlfh 发表于 2024-4-29 10:19:10

关于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



乘风飞扬 发表于 2024-4-29 10:40:46

使用官方头文件,或者参考官方头文件方法定义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

xjlfh 发表于 2024-4-29 11:15:49

乘风飞扬 发表于 2024-4-29 10:40
使用官方头文件,或者参考官方头文件方法定义P5试试:

{:handshake:}{:4_201:}{:lol:}官方头文件加载后会一直报错端口重复设置A10错误,把你发的这个复制加载到端口设置后可以正常编译通过了,实际烧写后测试24C复制也是正常工作的。原来主要是用89C和12C 及15系列的,8G和8H的最近才开始用,发现这个端口设置真的非常重要,设置不正确根本不要想用,不想原来的那些基本默认是双向口。{:4_167:}

xjlfh 发表于 2024-4-29 11:28:35



页: [1]
查看完整版本: 关于STC15F104W程序移植到STC8G1K08A提示地址设置无效的问题