- 打卡等级:以坛为家II
 
				- 打卡总天数:519
 
				
				
				- 最近打卡:2025-11-04 08:34:29
 
				  
  已绑定手机 
金牌会员 
 
 
	- 积分
 - 2242
 
 
 
 
 | 
 
 
我有原来用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 
 
 
 
 |   
 
 
 
 |