 |
 |
培訓信息 |
|
|
|
 |
 |
贊助商 |
|
|
|
|
 |
 |
IIC總線模擬程序 |
|
|
| IIC總線模擬程序 |
| 作者:佚名 來源:不詳 錄入:Admin 更新時間:2008-7-26 19:57:28 點擊數(shù):3 |
【字體:
】 |
文件: PCF8563T.C 1 /**———————————————————— 2 〖說明〗I2C總線驅(qū)動程序(用兩個普通IO模擬I2C總線) 3 包括100Khz(T=10us)的標準模式(慢速模式)選擇, 4 和400Khz(T=2.5us)的快速模式選擇, 5 默認11.0592Mhz的晶振。 10 —————————————————————*/ 11 12 #ifndef SDA 13 #define SDA P0_0 14 #define SCL P0_1 15 #endif 16 17 extern uchar SystemError; 18 19 #define uchar unsigned char 20 #define uint unsigned int 21 #define Byte unsigned char 22 #define Word unsigned int 23 #define bool bit 24 #define true 1 25 #define false 0 26 27 #define SomeNOP(); _nop_();_nop_();_nop_();_nop_(); 28 29 /**-------------------------------------------------------------------------------- 30 調(diào)用方式:void I2CStart(void) ﹫2001/07/0 4 31 函數(shù)說明:私有函數(shù),I2C專用 32 ---------------------------------------------------------------------------------*/ 33 void I2CStart(void) 34 { 35 EA=0; 36 SDA=1; SCL=1; SomeNOP();//INI 37 SDA=0; SomeNOP(); //START 38 SCL=0; 39 } 40 41 /**-------------------------------------------------------------------------------- 42 調(diào)用方式:void I2CStop(void) ﹫2001/07/0 4 43 函數(shù)說明:私有函數(shù),I2C專用 44 ---------------------------------------------------------------------------------*/ 45 void I2CStop(void) 46 { 47 SCL=0; SDA=0; SomeNOP(); //INI 48 SCL=1; SomeNOP(); SDA=1; //STOP 49 EA=1; 50 } 51 52 /**-------------------------------------------------------------------------------- 53 調(diào)用方式:bit I2CAck(void) ﹫2001/07/0 4 54 函數(shù)說明:私有函數(shù),I2C專用,等待從器件接收方的應答 55 ---------------------------------------------------------------------------------*/ 56 bool WaitAck(void) 57 { 58 uchar errtime=255;//因故障接收方無ACK,超時值為255。 59 SDA=1;SomeNOP(); 60 SCL=1;SomeNOP(); 61 while(SDA) {errtime--; if (!errtime) {I2CStop();SystemError=0x11;return false;}} 62 SCL=0; 63 return true; 第1 頁 文件: PCF8563T.C 2001-11-27, 18:39:20 64 } 65 66 /**-------------------------------------------------------------------------------- 67 調(diào)用方式:void SendAck(void) ﹫2001/07/0 4 68 函數(shù)說明:私有函數(shù),I2C專用,主器件為接收方,從器件為發(fā)送方時,應答信號。 69 ---------------------------------------------------------------------------------*/ 70 void SendAck(void) 71 { 72 SDA=0; SomeNOP(); 73 SCL=1; SomeNOP(); 74 SCL=0; 75 } 76 77 /**-------------------------------------------------------------------------------- 78 調(diào)用方式:void SendAck(void) ﹫2001/07/0 4 79 函數(shù)說明:私有函數(shù),I2C專用,主器件為接收方,從器件為發(fā)送方時,非應答信號。 80 }**-------------------------------------------------------------------------------- 81 void SendNotAck(void) 82 { 83 SDA=1; SomeNOP(); 84 SCL=1; SomeNOP(); 85 SCL=0; 86 } 87 88 /**-------------------------------------------------------------------------------- 89 調(diào)用方式:void I2CSend(uchar ch) ﹫2001/07/0 5 90 函數(shù)說明:私有函數(shù),I2C專用 91 ---------------------------------------------------------------------------------*/ 92 void I2CSendByte(Byte ch) 93 { 94 uchar i=8; 95 while (i--) 96 { 97 SCL=0;_nop_(); 98 SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); 99 SCL=1; SomeNOP(); 100 } 101 SCL=0; 102 } 103 104 /**-------------------------------------------------------------------------------- 105 調(diào)用方式:uchar I2CReceive(void) ﹫2001/07/0 5 106 函數(shù)說明:私有函數(shù),I2C專用 107 ---------------------------------------------------------------------------------*/ 108 Byte I2CReceiveByte(void) 109 { 110 uchar i=8; 111 Byte ddata=0; 112 SDA=1; 113 while (i--) 114 { 115 ddata<<=1; 116 SCL=0;SomeNOP(); 117 SCL=1;SomeNOP(); 118 ddata|=SDA; 119 } 120 SCL=0; 121 return ddata; 122 } 123 124 125 //--------------------------------------------------------------------------- 126 //開始PCF8563T驅(qū)動程序 第2 頁 文件: PCF8563T.C 2001-11-27, 18:39:20 127 /**-------------------------------------------------------------------------------- 128 調(diào)用方式:void GetPCF8563(uchar firsttype,uchar count,uchar *buff) ﹫2001/08/0 7 129 函數(shù)說明:讀取時鐘芯片PCF8563的時間,設置要讀的第一個時間類型firsttype,并設置讀取 130 的字節(jié)數(shù),則會一次把時間讀取到buff中。順序是: 131 0x02:秒/0x03:分/0x04:小時/0x05:日/0x06:星期/0x07:月(世紀)/0x08:年 132 ---------------------------------------------------------------------------------*/ 133 void GetPCF8563(uchar firsttype,uchar count,uchar *buff) 134 { 135 uchar i; 136 I2CStart(); 137 I2CSendByte(0xA2); 138 WaitAck(); 139 I2CSendByte(firsttype); 140 WaitAck(); 141 142 I2CStart(); 143 I2CSendByte(0xA3); 144 WaitAck(); 145 146 for (i=0;i147 { 148 buff[i]=I2CReceiveByte(); 149 if (i!=count-1) SendAck();//除最后一個字節(jié)外,其他都要從MASTER發(fā)應答。 150 } 151 152 SendNotAck(); 153 I2CStop(); 154 } 155 156 157 /**-------------------------------------------------------------------------------- 158 調(diào)用方式:void SetPCF8563(uchar timetype,uchar value) ﹫2001/08/0 7 159 函數(shù)說明:調(diào)整時鐘。timetype是要改的時間類型,value是新設置的時間值(BCD格式)。 160 0x02:秒/0x03:分/0x04:小時/0x05:日/0x06:星期/0x07:月(世紀)/0x08:年 161 ---------------------------------------------------------------------------------*/ 162 void SetPCF8563(uchar timetype,uchar value) 163 { 164 I2CStart(); 165 I2CSendByte(0xA2); 166 WaitAck(); 167 I2CSendByte(timetype); 168 WaitAck(); 169 I2CSendByte(value); 170 WaitAck(); 171 I2CStop(); 172 } 173 174 /**-------------------------------------------------------------------------------- 175 調(diào)用方式:void SetAlarmHour(uchar count) ﹫2001/08/0 7 176 函數(shù)說明:設置報警鬧鐘在一天的第count點報警。例如:count=23,則在晚上11點報警。 177 ---------------------------------------------------------------------------------*/ 178 void SetAlarm(uchar alarmtype,uchar count) 179 { 180 SetPCF8563(0x01,0x02); 181 SetPCF8563(alarmtype,count); 182 } 183 184 /**-------------------------------------------------------------------------------- 185 調(diào)用方式:void CleanAlarm(void) ﹫2001/08/0 7 186 函數(shù)說明:清除所有報警設置。 187 ---------------------------------------------------------------------------------*/ 188 void CleanAlarm(void) 189 { 第3 頁 文件: PCF8563T.C 2001-11-27, 18:39:20 190 SetPCF8563(0x01,0x00); 191 SetPCF8563(0x09,0x80); 192 SetPCF8563(0x0A,0x80); 193 SetPCF8563(0x0B,0x80); 194 SetPCF8563(0x0C,0x80); 195 // SetPCF8563(0x0D,0x00); 196 // SetPCF8563(0x0E,0x03); 197 } 198 199 200 /*-------------------------------------------------------------------------------- 201 調(diào)用方式:uchar read1380(uchar command ) 202 函數(shù)說明:read1380()返回當前時間, command指要返回的時間類型。 203 秒:81H 分鐘:83H 小時:85H 日期:87H 星期:89H 星期幾:8BH 年:8D H 204 ---------------------------------------------------------------------------------*/ 205 uchar read1380 (uchar command) 206 { 207 uchar time; 208 GetPCF8563(command,1,&time); 209 return time; 210 } 211 212 /*-------------------------------------------------------------------------------- 213 調(diào)用方式:void write1380(uchar command ,uchar time ) 214 函數(shù)說明:write1380()往HT1380寫命令和數(shù)據(jù),command是命令字, time是后寫入的數(shù)據(jù) 215 ---------------------------------------------------------------------------------*/ 216 void write1380(uchar command ,uchar time) 217 { 218 SetPCF8563(command,time); 219 } 220 221 222 /*-------------------------------------------------------------------------------- 223 調(diào)用方式:void time_display(uchar x0,uchar y0 ) 224 函數(shù)說明:time_display()在指定的x0,y0坐標,以00:00:00格式顯示當前時間。 225 ---------------------------------------------------------------------------------*/ 226 //uchar time[]="00:11:11"; 227 228 void time_display(uchar x0,uchar y0,bit type) //液晶時間顯示 229 { 230 uchar time[]="00:00:00"; 231 uchar con[3]; 232 uchar time_type; 233 GetPCF8563(0x02,3,con); 234 235 time[0]=(con[2]>>4)+'0'; 236 time[1]=(con[2]&0x0f)+'0'; 237 time[3]=(con[1]>>4)+'0'; 238 time[4]=(con[1]&0x0f)+'0'; 239 time[6]=(con[0]>>4)+'0'; 240 time[7]=(con[0]&0x0f)+'0'; 241 242 time[8]=0; 243 if(type==1) 244 { 245 time_type=0xff; 246 } 247 else 248 { 249 time_type=0; 250 } 251 dipchar0(x0,y0,F57,1,time_type,time); 252 } |
|
|
發(fā)表評論 告訴好友 打印此文 收藏此頁 關閉窗口 返回頂部 |
|
|
 |
 |
網(wǎng)友評論:(只顯示最新5條。) |
|
|
|
|
|