?? pc并口模擬iic.c
字號(hào):
// 在微機(jī)上模擬I2C總線的設(shè)計(jì)中,用并行口的D0(PIN2)模擬SCL信號(hào),用D1(PIN3)模擬SDA信號(hào)。根據(jù)IIC總線的電平規(guī)范,程序如下:
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <bios.h>
#define DELAY_TIME 10
#define FALSE 0
#define TRUE 1
const unsigned char SCL_PIN=0x01;
const unsigned char SDA_OIN=0x02;
static void SET_SCL(void)
{
asm{
mov dx,0x378
in ax,dx
or ax,SCL_PIN //將SCL置1
out dx,ax
}
}
static void CLR_SCL(void)
{
asm{
mov dx,0x378
in ax,dx
or ax,0xff-SCL_PIN //將SCL置0
out dx,ax
}
}
static void SET_SDA(void)
{
asm{
mov dx,0x378
in ax,dx
or ax,SDA_PIN //將SDA置1
out dx,ax
}
}
static void CLR_SDA(void)
{
asm{
mov dx,0x378
in ax,dx
or ax,0xff-SDA_PIN //將SDA置0
out dx,ax
}
}
void DELAY(int t=DELAY_TIME) //延時(shí)子程序
{
for(int i=0;i<t;i++);
}
void IIC_Start(void) //啟動(dòng)I2C總線
{
//在SCL為高電平時(shí),使SDA出現(xiàn)一個(gè)負(fù)跳變
SET_SDA();
SET_SCL();
DELAY();
CLR_SDA();
DELAY();
CLR_SCL();
DELAY();
}
void IIC_Stop(void) //終止I2C總線
{
//在SCL為高電平時(shí),使SDA出現(xiàn)一個(gè)正跳變
CLR_SDA();
SET_SCL();
DELAY();
SET_SDA();
DELAY();
CLR_SCL();
DELAY();
}
void SEND_0(void) //發(fā)送BIT0
{
//在SCL為高電平時(shí),使SDA保持低電平
CLR_SDA();
SET_SCL();
DELAY();
CLR_SCL();
DELAY();
}
void SEND_1(void) //發(fā)送BIT1
{
//在SCL為高電平時(shí),使SDA保持高電平
SET_SDA();
SET_SCL();
DELAY();
CLR_SCL();
DELAY();
}
int Check_Acknowledge(void)
{
//發(fā)送完每個(gè)字節(jié)檢查SLAVE的應(yīng)答信號(hào)
SET_SDA(); //主器件釋放SDA線
SET_SCL();
DELAY(DELAY_TIME/2);
unsigned char b=inportb(0x378); //采樣信號(hào)線
DELAY(DELAY_TIME/2);
CLR_SCL();
DELAY();
if(b&0xSDA_PIN) //SALVE返回1
return FLASE;
return TRUE;
}
使用上述代碼,你可以在PC上用并行口模擬I2C,進(jìn)行實(shí)驗(yàn)、監(jiān)控和調(diào)試。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -