程序状态字PSW是8位寄存器,用于存放程序运行的状态信息,PSW中各位状态通常是在指令执行的过程中自动形成的,但也可以由用户根据需要采用传送指令加以改变。各个标志位的意义如下:
PSW.7(Cy):进位标志位。
PSW.6(AC):辅助进位标志位,又称为半进位标志位。
PSW.5(F0):用户标志位。
PSW.4、PSW.3(RS1和 RS0):寄存器组选择位。
PSW.2(OV):溢出标志位。
PSW.1(空缺位):此位未定义。
PSW.0(P):奇偶校验位
1 /* I2C通信流程 2 a、初始化I2C总线; 3 b、发送起始信号; 4 c、发送目标地址;(芯片的硬件地址) 5 d、等待应答; 6 e、发送或接收数据,这取决于c中目标地址中最后一位的设置; 7 f、应答; 8 g、从c-f循环; 9 h、发送终止信号; 10 */ 11 12 13 #include <reg51.h> 14 #define uchar unsigned char 15 #define uint unsigned int 16 17 void delay() 18 { 19 for(;;) 20 ; 21 } 22 23 //I2C的初始化 24 void init() 25 { 26 SDA = 1; 27 delay(); 28 SCL = 1; 29 delay(); 30 } 31 32 //发送起始信号 33 void start() 34 { 35 SDA = 0; 36 delay(); 37 } 38 、 39 //发送目标地址 40 //发送函数,发送目标地址可以调用发送函数即可 41 void write(uchar content) 42 { 43 uchar i; 44 uchar temp = content; 45 46 for(i=0;i<8;i++) 47 { 48 temp=temp<<1; //左移一位 移出的一位在CY中,涉及程序状态字PSW 49 SCL = 0; 50 delay(); 51 SDA = CY; 52 delay(); 53 SCL = 1; 54 delay(); 55 } 56 57 SCL = 0; 58 delay(); 59 SDA = 1; 60 delay(); 61 } 62 63 //等待应答 ACK 64 /* 65 从机应答,在SCL为高电平时,将SDA拉低;即产生应答信号; 66 */ 67 void respons() 68 { 69 uchar i; 70 SCL=1; 71 delay(); 72 while((SDA==1)&&(i<250))//没收到应答,我等!~~ 73 i++; //等了250次没收到就不管他了,就当他收到了-_- 74 //其实没收到的话可以结束程序的 75 SCL=0; 76 } 77 78 //接收数据;发送、接收数据,取决于前面地址字的最后一位。读/写 79 uchar read() 80 { 81 uchar k, i = 0; 82 for(i=0;i<8;i++) 83 { 84 SCL=1; 85 delay(); 86 k=(k<<1)|SDA;//先左移一位,再在最低位接受当前位 87 SCL=0; 88 delay(); 89 } 90 return k; 91 } 92 93 void finish() 94 { 95 SCL = 1; 96 delay() 97 SDA = 0; 98 delay(); 99 SDA = 1; 100 delay(); 101 }