📄 iic_pro.dt
字号:
;************************************************************
;* Tilte: IIC function for EM78x447 *
;* Description: IICaddress,IICdata is eeprom *
; xtal 4Mhz,4clock,enable watchdog *
;* Company: Elan microelectronics (sz) ltd. *
;* Author: HongXi.Tang *
;* Date: 13/05/2005 *
;* Version: v1.0 *
;************************************************************
include "EM78P447.inc"
include "clrEM78RamBank.inc"
;================================
i2port == 0x06
scl == 7
sda == 6
wrcfg == 10111111b ;eeprom write tri-state value
rdcfg == 01000000b ;eeprom read tri-state value
;================================
IICaddress == 0x08
IICdata == 0x09
tmp1 == 0x0a
tmp2 == 0x0b
IIC_Hi == 0x0c
IIC_Lw == 0x0d
cnt_hi == 0x0e
cnt_lw == 0x0f
;================================
org 0000h
reset:
jmp start
org 0010h
Led_dis:
tbl
retl 0b11000000 ;"0"
retl 0b11111001 ;"1"
retl 0b10100100 ;"2"
retl 0b10110000 ;"3"
retl 0b10011001 ;"4"
retl 0b10010010 ;"5"
retl 0b10000010 ;"6"
retl 0b11111000 ;"7"
retl 0b10000000 ;"8"
retl 0b10010000 ;"9"
;================================
;*以下是对IIC总线的操作子程序*
;*********启动总线***********************************
;The START condition precedes all commands to the *
;devices and is defined as a HIGH to LOW transition *
;of SDA when SCL is HIGH. *
;scl ____/~~~~\__ *
;sda __/~~~\____ *
;****************************************************
IICStart:
bc i2port,scl
bs i2port,sda
bs i2port,scl
jmp $+1
bc i2port,sda
jmp $+1
bc i2port,scl
ret
;*********停止IIC总线********************************
;The STOP condition is defined as a LOW to HIGH *
;transition of SDA when SCL is HIGH. *
;scl ____/~~~~ *
;sda ______/~~ *
;****************************************************
IICStop:
bc i2port,scl
bc i2port,sda
jmp $+1
bs i2port,scl
jmp $+1
bs i2port,sda
ret
;********检查应答位**********************************
;After a successful data transfer, each receiving *
;device is required to generate an acknowledge. *
;The Acknowledging device pulls down the SDA line. *
;****************************************************
IICRecAck:
ior i2port
or a,@rdcfg
iow i2port
bs i2port,scl
jmp $+1
jbc i2port,sda
jmp $-1
bc i2port,scl
jmp $+1
ior i2port
and a,@wrcfg
iow i2port
ret
;************************************
;**********不对IIC总线产生应答*******
;************************************
IICNoAck:
bc i2port,scl
jmp $+1
bs i2port,sda
jmp $+1
bs i2port,scl
jmp $+1
bc i2port,scl
ret
;**********************************
;*********向IIC总线写数据**********
;**********************************
IICSendByte:
mov tmp2,a
mov a,@8
mov tmp1,a
send_b:
rlc tmp2
jbc STATUS,C
jmp send_1
bc i2port,sda
jmp s_ret
send_1:
bs i2port,sda
jmp $+1
s_ret:
bs i2port,scl
jmp $+1
bc i2port,scl
jmp $+1
djz tmp1
jmp send_b
ret
;*********************************
;****从IIC总线上读数据子程序******
;*********************************
IICReceiveByte:
mov a,@8
mov tmp1,a
clr tmp2
ior i2port
or a,@rdcfg
iow i2port
rece_b:
bs i2port,scl
jmp $+1
jbc i2port,sda
jmp rece_1
bc STATUS,C
jmp r_ret
rece_1:
bs STATUS,C
jmp $+1
r_ret:
bc i2port,scl
jmp $+1
rlc tmp2
djz tmp1
jmp rece_b
ior i2port
and a,@wrcfg
iow i2port
ret
;=================================
WriteChar:
mov a,@0xa0
call IICStart
call IICSendByte
call IICRecAck
mov a,IICaddress
call IICSendByte
call IICRecAck
mov a,IICdata
call IICSendByte
call IICRecAck
call IICStop
call delay_5ms
ret
;=================================
ReadChar:
mov a,@0xa0
call IICStart
call IICSendByte
call IICRecAck
mov a,IICaddress
call IICSendByte
call IICRecAck
mov a,@0xa1
call IICStart
call IICSendByte
call IICRecAck
call IICReceiveByte
call IICNoAck
call IICStop
ret
;=================================
delay_5ms:
mov a,@5
mov tmp2,a
dly_1ms:
mov a,@250
mov tmp1,a
dly_4us:
wdtc ;1
djz tmp1 ;1
jmp dly_4us ;2
djz tmp2
jmp dly_1ms
ret
;=================================
tst_rtcc:
wdtc
jbs tcc,7 ;32ms
ret
bc tcc,7
inc cnt_lw
jbc status,z
inc cnt_hi
ret
;=================================
start:
m447ClrRamBank ;clear all ram
;System_init
mov a,@7
contw
clr R5
mov a,@0
iow IOC5 ;P5 port is output
mov a,@0xff
mov R6,a
mov a,@0x3f ;P6 port is input
iow IOC6
mov a,@0xff
mov R7,a
mov a,@0 ;P7 port is output
iow IOC7
mov a,@0xff ;disable P6 wake up function
iow IOCB
mov a,@0xb7 ;disable P74~5 wake up function,disable P76~7 open drain,enable wdt
iow IOCE
mov a,@0xf6 ;mask all interrpt
iow IOCF
disi
wdtc
mov a,0
mov IICaddress,a
call ReadChar
mov a,tmp2
mov IIC_Lw,a
inc IICaddress
call ReadChar
mov a,tmp2
mov IIC_Hi,a
mov a,IIC_Lw
sub a,@0x99
jbc status,c
jmp comp_hi_data
clr IIC_Lw
clr IIC_Hi
jmp pro_key_or_dis
comp_hi_data:
mov a,IIC_Hi
sub a,@0x99
jbc status,c
jmp pro_key_or_dis
clr IIC_Hi
pro_key_or_dis: ;keyscan
jbs port6,0
jmp IIC_Value_inc
jbs port6,1
jmp IIC_Value_dec
dis_data_pro : ;display function
mov a,IIC_Hi
jbs status,z
jmp execute_hi_dis
mov a,IIC_Lw
and a,@0xf0
jbs status,z
jmp execute_lw_dis
dis_lw_down:
mov a,IIC_Lw
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x10
mov port5,a
call delay_5ms
jmp pro_key_or_dis
execute_hi_dis:
mov a,IIC_Hi
and a,@0xf0
jbc status,z
jmp execute_hi_next
swapa IIC_Hi
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x80
mov port5,a
call delay_5ms
execute_hi_next:
mov a,IIC_Hi
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x40
mov port5,a
call delay_5ms
execute_lw_dis:
dis_lw_up:
swapa IIC_Lw
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x20
mov port5,a
call delay_5ms
jmp dis_lw_down
IIC_Value_inc:
idis_data_pro:
mov a,IIC_Hi
jbs status,z
jmp iexecute_hi_dis
mov a,IIC_Lw
and a,@0xf0
jbs status,z
jmp iexecute_lw_dis
idis_lw_down:
mov a,IIC_Lw
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x10
mov port5,a
call delay_5ms
jmp iexit_dis
iexecute_hi_dis:
mov a,IIC_Hi
and a,@0xf0
jbc status,z
jmp iexecute_hi_next
swapa IIC_Hi
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x80
mov port5,a
call delay_5ms
iexecute_hi_next:
mov a,IIC_Hi
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x40
mov port5,a
call delay_5ms
jmp idis_lw_up
iexecute_lw_dis:
idis_lw_up:
swapa IIC_Lw
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x20
mov port5,a
call delay_5ms
jmp idis_lw_down
iexit_dis:
call tst_rtcc
jbc port6,0
jmp enter_inc1
jbs cnt_hi,0 ;8s timer >8s is del 93c46 function
jmp IIC_Value_inc
erase_24c08:
bc cnt_hi,0
clr IICdata
clr IICaddress
call WriteChar
inc IICaddress
call WriteChar
wdtc
jbs port6,0
jmp $-2
jmp start
enter_inc1:
clr cnt_lw
clr cnt_hi
mov a,IIC_Lw
add a,@1
daa
mov IIC_Lw,a
jbs status,c
jmp save_value_to_24c08
mov a,IIC_Hi
add a,@1
daa
mov IIC_Hi,a
save_value_to_24c08:
clr IICaddress
mov a,IIC_Lw
mov IICdata,a
call WriteChar
call ReadChar
mov a,tmp2
xor a,IIC_Lw
jbs status,z
jmp start
inc IICaddress
mov a,IIC_Hi
mov IICdata,a
call WriteChar
call ReadChar
mov a,tmp2
xor a,IIC_Hi
jbs status,z
jmp start
jmp dis_data_pro
IIC_Value_dec:
sdis_data_pro:
mov a,IIC_Hi
jbs status,z
jmp sexecute_hi_dis
mov a,IIC_Lw
and a,@0xf0
jbs status,z
jmp sexecute_lw_dis
sdis_lw_down:
mov a,IIC_Lw
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x10
mov port5,a
call delay_5ms
jmp sexit_dis
sexecute_hi_dis:
mov a,IIC_Hi
and a,@0xf0
jbc status,z
jmp sexecute_hi_next
swapa IIC_Hi
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x80
mov port5,a
call delay_5ms
sexecute_hi_next:
mov a,IIC_Hi
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x40
mov port5,a
call delay_5ms
; jmp sdis_lw_up
sexecute_lw_dis:
sdis_lw_up:
swapa IIC_Lw
and a,@0x0f
call Led_dis
mov port7,a
mov a,@0x20
mov port5,a
call delay_5ms
jmp sdis_lw_down
sexit_dis:
call tst_rtcc
jbc port6,1
jmp enter_dec1
jmp IIC_Value_dec
enter_dec1:
mov a,@1
sub IIC_Lw,a
jbc status,c
jmp pro_lw_data
mov a,@0x99
mov IIC_Lw,a
mov a,@1
sub IIC_Hi,a
jbc status,c
jmp pro_hi_data
mov a,@0x99
mov IIC_Hi,a
jmp save_value_to_24c08
pro_lw_data:
mov a,IIC_Lw
and a,@0x0f
xor a,@0x0f
jbs status,z
jmp save_value_to_24c08
mov a,@6
sub IIC_Lw,a
jmp save_value_to_24c08
pro_hi_data:
mov a,IIC_Hi
and a,@0x0f
xor a,@0x0f
jbs status,z
jmp save_value_to_24c08
mov a,@6
sub IIC_Hi,a
jmp save_value_to_24c08
org 0fffh
jmp reset
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -