我使用的第三方控件是WINIO,并口上,SCL是pin2,SDA的写是pin3,SDA读是pin13
delay(): 延时函数
sclhigh(): SCL置1
scllow(): SCL置0
sdahigh(): SDA置1
sdalow(): SDA置0
I2C启动函数
Sub I_start()
Call sclhigh
Call delay
Call sdalow
Call delay
Call scllow
Call delay
End Sub
停止函数
Sub I_stop()
Call sdalow
Call delay
Call sclhigh
Call delay
Call sdahigh
Call delay
Call scllow
Call delay
End Sub
Function I_clock() As Boolean
Dim sample As Boolean 'bit I_clock(void) {
Dim Result As Boolean 'bit sample;
Dim portVal As Long 'SCL = HIGH;
Dim a As Byte 'delay();
Call sclhigh 'sample = SDA;
Call delay 'SCL = LOW;
Result = GetPortVal(&H379, portVal, 1) 'delay();
a = portVal And &H10 'return(sample);
If a <> 0 Then '}
sample = 1
Else
sample = 0 '并口13脚是地址为379的状态位第4位
End If
Call scllow
Call delay
I_clock = sample
End Function
以下2个函数是向I2C发送8位数据
Sub judge(ByVal a As Byte)
Dim Result As Boolean
If a <> 0 Then
portValue = portValue Or &H2 '置SDA位为 portVaule = &H1 Or portVaule
Result = SetPortVal(&H378, portValue, 1)
Else
portValue = portValue And &HFD '置SDA位为0
Result = SetPortVal(&H378, portValue, 1)
End If
End Sub Function I_send(ByVal I_data As Byte) As Boolean '发送i_data数据
Dim j As Byte
Dim sample As Boolean 'bit I_send(byte I_data)
j = I_data And &H80 '{
judge (j) 'register byte i;
Call I_clock 'for(i=0;i<8;i++)
j = I_data And &H40 '{
judge (j) 'SDA = (bit)(I_data & 0x80);
Call I_clock 'I_data =I_data << 1;
j = I_data And &H20 'I_clock();
judge (j) '}
Call I_clock '/*请求应答信号ACK*/
j = I_data And &H10 'SDA=HIGH;
judge (j) ' return(~I_clock());
Call I_clock '}
j = I_data And &H8
judge (j)
Call I_clock
j = I_data And &H4
judge (j)
Call I_clock
j = I_data And &H2
judge (j)
Call I_clock
j = I_data And &H1
judge (j)
sample = I_clock
Call sdahigh
I_send = Not sample
End Function
发送地址
Sub E_address()
Dim i As Byte
addrlow = address And &HFF '取低8位
For i = 1 To 8
address = address \ 2
Next i
addrmiddle = address And &HFF
Call I_send(w)
Call I_send(addrmiddle)
Call I_send(addrlow)
End Sub
以上几个关键的时序程序望前辈们看下,是不是合理?我在对并口使用VB操作的时候,老是写不进去~郁闷啊,谢谢了啊!
delay(): 延时函数
sclhigh(): SCL置1
scllow(): SCL置0
sdahigh(): SDA置1
sdalow(): SDA置0
I2C启动函数
Sub I_start()
Call sclhigh
Call delay
Call sdalow
Call delay
Call scllow
Call delay
End Sub
停止函数
Sub I_stop()
Call sdalow
Call delay
Call sclhigh
Call delay
Call sdahigh
Call delay
Call scllow
Call delay
End Sub
Function I_clock() As Boolean
Dim sample As Boolean 'bit I_clock(void) {
Dim Result As Boolean 'bit sample;
Dim portVal As Long 'SCL = HIGH;
Dim a As Byte 'delay();
Call sclhigh 'sample = SDA;
Call delay 'SCL = LOW;
Result = GetPortVal(&H379, portVal, 1) 'delay();
a = portVal And &H10 'return(sample);
If a <> 0 Then '}
sample = 1
Else
sample = 0 '并口13脚是地址为379的状态位第4位
End If
Call scllow
Call delay
I_clock = sample
End Function
以下2个函数是向I2C发送8位数据
Sub judge(ByVal a As Byte)
Dim Result As Boolean
If a <> 0 Then
portValue = portValue Or &H2 '置SDA位为 portVaule = &H1 Or portVaule
Result = SetPortVal(&H378, portValue, 1)
Else
portValue = portValue And &HFD '置SDA位为0
Result = SetPortVal(&H378, portValue, 1)
End If
End Sub Function I_send(ByVal I_data As Byte) As Boolean '发送i_data数据
Dim j As Byte
Dim sample As Boolean 'bit I_send(byte I_data)
j = I_data And &H80 '{
judge (j) 'register byte i;
Call I_clock 'for(i=0;i<8;i++)
j = I_data And &H40 '{
judge (j) 'SDA = (bit)(I_data & 0x80);
Call I_clock 'I_data =I_data << 1;
j = I_data And &H20 'I_clock();
judge (j) '}
Call I_clock '/*请求应答信号ACK*/
j = I_data And &H10 'SDA=HIGH;
judge (j) ' return(~I_clock());
Call I_clock '}
j = I_data And &H8
judge (j)
Call I_clock
j = I_data And &H4
judge (j)
Call I_clock
j = I_data And &H2
judge (j)
Call I_clock
j = I_data And &H1
judge (j)
sample = I_clock
Call sdahigh
I_send = Not sample
End Function
发送地址
Sub E_address()
Dim i As Byte
addrlow = address And &HFF '取低8位
For i = 1 To 8
address = address \ 2
Next i
addrmiddle = address And &HFF
Call I_send(w)
Call I_send(addrmiddle)
Call I_send(addrlow)
End Sub
以上几个关键的时序程序望前辈们看下,是不是合理?我在对并口使用VB操作的时候,老是写不进去~郁闷啊,谢谢了啊!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货