?? 串行寫入數據控制led.c
字號:
/*先將數據0x01通過IIC寫入到AT24C02中,
再將其從AT24C02中讀出來付給P1口,期間
需要編寫延時、寫數據、讀數據、應答、起始、
結束這幾個子函數*/
#include<reg52.h>
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
uchar a;
void delay1()//短延時,用于讀寫操作模塊內的延時。
{ ; ; }
void delay2(uchar z)//長延時用于讀寫模塊間的延時。
{
uchar x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void start()//根據時序圖,在scl=1期間,sda有一個負跳變
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
void response()//應答信號,在第九個數據后scl=1期間sda為0時即為應答。
{
uchar i;
scl=1;
delay1();
while((sda==1)&&(i<250))i++;//這條的含義是:在scl=1期間sda=0即有應答了退出執行那個下面的程序,或者是老沒有應答,但是經過一點時間后認為受到了(用i控制)也就算有了應答了。
scl=0;
delay1();
}
void initial()
{
sda=1;
scl=1;
}
void write_byte(uchar dat)
{
uchar i,j;
j=dat;
for(i=0;i<8;i++)
{
j=j<<1;//將dat值左移一位,最高為進入PSW的CY位。
scl=0;
delay1();
sda=CY;
delay1();
scl=1;//寫入一位數據
delay1();
// scl=0;
// delay1();
}
scl=0;
delay1();
sda=1;//釋放總線,以讀取應答信號
delay1();
}
uchar read_byte()
{
uchar i,j,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<8;i++)
{
scl=1;
delay1();
j=sda;//將總線的一位數據給j
k=(k<<1)|j;
delay1();
scl=0;
delay1();
}
return k;
}
void stop()
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
void main()
{
initial();
start();
write_byte(0xa0);//寫器件地址,高四位1010,第四位全0.
response();
write_byte(3);//寫器件內部數據地址
response();
write_byte(0x55);
response();
stop();
//下面是從AT24C02中讀出數據給P1口。
delay2(100);
start();
write_byte(0xa0);//寫器件地址,高四位1010,第四位全0.
response();
write_byte(3);//寫器件內部數據地址
response();
start();
write_byte(0xa1);
response();
a=read_byte();
stop();
P1=a;
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -