Advertisement
sanpai

RTC interfacing

Mar 31st, 2014
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.01 KB | None | 0 0
  1. #include <reg51.h>
  2.  
  3.  
  4. #define I2C_SPEED_FACTOR 1 // Low value means low i2c frequency
  5. #define Crystal_Value 12 // MHz
  6. #define HalfBitDelay (500*Crystal_Value)/(12*I2C_SPEED_FACTOR)
  7.  
  8. #define lcddata P1
  9. sbit SDA= P0^0;
  10. sbit SCL= P0^1;
  11. sbit RS = P2^0;
  12. sbit RW = P2^1;
  13. sbit EN = P2^2;
  14. sbit BSY = P1^7;
  15.  
  16. /* delay for the clock */
  17. void I2cdelay(unsigned int d)
  18. {
  19. unsigned int i, limit;
  20. limit = d/15;
  21. for(i=0;i<limit;i++);
  22. }
  23.  
  24. static void delay(unsigned int);
  25.  
  26.  
  27. /* initialize the i2c */
  28. static void I2CInit()
  29. {
  30. SDA = 1;
  31. SCL = 1;
  32. }
  33.  
  34. //I2c start
  35. static void I2CStart()
  36. {
  37. SCL = 1;
  38. SDA = 1;
  39. I2cdelay(HalfBitDelay);
  40. SDA = 0;
  41. I2cdelay(HalfBitDelay);
  42.  
  43. }
  44. /* STOP signal to complete the transmission */
  45. static void I2CStop()
  46. {
  47. SCL = 0;
  48. I2cdelay(HalfBitDelay/2);
  49. SDA = 0;
  50. I2cdelay(HalfBitDelay/2);
  51. SCL = 1;
  52. I2cdelay(HalfBitDelay/2);
  53. SDA = 1;
  54. I2cdelay(HalfBitDelay/2);
  55. }
  56.  
  57. /* acknowledge after byte has been received */
  58. static void I2CAck()
  59. {
  60. SCL = 0;
  61. I2cdelay(HalfBitDelay/2);
  62. SDA = 0;
  63. I2cdelay(HalfBitDelay/2);
  64. SCL = 1;
  65. I2cdelay(HalfBitDelay);
  66.  
  67. }
  68.  
  69. /* send a no acknowledge to transmitter when all bytes have been received */
  70. static void I2CNak()
  71. {
  72. SCL = 0;
  73. I2cdelay(HalfBitDelay/2);
  74. SDA = 1;
  75. I2cdelay(HalfBitDelay/2);
  76. SCL = 1;
  77. I2cdelay(HalfBitDelay);
  78.  
  79. }
  80.  
  81. static void I2CRestart()
  82. {
  83. SCL = 0;
  84. I2cdelay(HalfBitDelay/2);
  85. SDA = 1;
  86. I2cdelay(HalfBitDelay/2);
  87. SCL = 1;
  88. I2cdelay(HalfBitDelay/2);
  89. SDA = 0;
  90. I2cdelay(HalfBitDelay/2);
  91. }
  92.  
  93. /* write data onto the bus */
  94.  
  95. static unsigned char I2CSend(unsigned char Data)
  96. {
  97. unsigned char i;
  98. for(i=0;i<8;i++)
  99. {
  100. /* The data should change on the low clock */
  101.  
  102. SCL = 0;
  103. I2cdelay(HalfBitDelay/2);
  104. if ((Data & 0x80) == 0)
  105. SDA = 0;
  106. else
  107. SDA = 1;
  108. I2cdelay(HalfBitDelay/2);
  109. /* keep SCL high for the valid data */
  110. SCL = 1;
  111. I2cdelay(HalfBitDelay);
  112. Data<<=1;
  113. }
  114.  
  115. SCL = 0;
  116. SDA = 1;
  117. I2cdelay(HalfBitDelay);
  118.  
  119. SCL = 1;
  120. I2cdelay(HalfBitDelay);
  121.  
  122. //return ack_bit;
  123. return SDA;
  124. }
  125. static unsigned char I2CRead()
  126. {
  127. unsigned char i, Data=0;
  128.  
  129. for(i=0;i<8;i++)
  130. {
  131. SCL = 0;
  132. SDA = 1;
  133. I2cdelay(HalfBitDelay);
  134. SCL = 1;
  135. I2cdelay(HalfBitDelay/2);
  136. if(SDA)
  137. Data |=0x01;
  138.  
  139. if(i<7)
  140. Data<<=1;
  141. I2cdelay(HalfBitDelay/2);
  142.  
  143. }
  144.  
  145.  
  146.  
  147. //SCL = 1;
  148. return Data;
  149. }
  150.  
  151.  
  152.  
  153.  
  154.  
  155. static void lcd_ready()
  156. {
  157. //make BSY pin as input
  158. BSY=1;
  159. //Read out from register
  160. RS=0;
  161. //Read
  162. RW=1;
  163. while(BSY==1)
  164. {
  165. EN=0;
  166. delay(1);
  167. EN=1;
  168.  
  169. }
  170. }
  171.  
  172. // delay function
  173. static void delay(unsigned int tme)
  174. {
  175. unsigned int i,j;
  176. for(i=0;i<tme;i++)
  177. for(j=0;j<1275;j++);
  178. }
  179.  
  180. /*
  181. unsigned char strlen(char str[])
  182. {
  183. unsigned char len=0,i=0;
  184.  
  185. while(str[i++]!='\0')
  186. len++;
  187.  
  188. return len;
  189.  
  190. }
  191. */
  192. static void lcd_cmd(unsigned char val)
  193. {
  194. //check for busy flag
  195. lcd_ready();
  196. lcddata=val;
  197. RS=0;
  198. RW=0;
  199. EN=1;
  200. delay(2);
  201. EN=0;
  202. }
  203.  
  204. static void lcd_init()
  205. {
  206. //16x2 lcd
  207. lcd_cmd(0x38);
  208. //clear lcd
  209. lcd_cmd(0x01);
  210. //force the cursor to line 1
  211. lcd_cmd(0x80);
  212. //display on cursor blinking
  213.  
  214. lcd_cmd(0x0E);
  215. }
  216.  
  217. static void lcd_data(unsigned char datum)
  218. {
  219.  
  220. lcd_ready();
  221. lcddata=datum;
  222. RS=1;
  223. RW=0;
  224. EN=1;
  225. delay(1);
  226. EN=0;
  227.  
  228. }
  229.  
  230. static unsigned char convtime(unsigned char hour)
  231. {
  232. //check for 12 hour or 24 hour mode
  233. if(hour&0x40)
  234. {
  235. return (hour & 0x1F);
  236. }
  237. else
  238. {
  239. return (hour & 0x3F);
  240. }
  241.  
  242. }
  243.  
  244. static void bcdconv(unsigned char datum)
  245. {
  246. unsigned char x=0,y=0;
  247. x=datum&0x0f;
  248. x=x|0x30;
  249. y=datum&0xf0;
  250. y=y>>4;
  251. y=y|0x30;
  252. lcd_data(y);
  253. lcd_data(x);
  254.  
  255. }
  256.  
  257. /*
  258. void lcd_data(unsigned char datum[])
  259. {
  260. unsigned char len=0,i;
  261. len = strlen(datum);
  262. for(i=0;i<len;i++)
  263. {
  264. //check for busy flag
  265. lcd_ready();
  266. lcddata=datum[i];
  267. RS=1;
  268. RW=0;
  269. EN=1;
  270. delay(1);
  271. EN=0;
  272. }
  273. }
  274. */
  275.  
  276.  
  277. void main()
  278. {
  279.  
  280. unsigned char i, a[7],reg_addr=0;
  281. unsigned int j;
  282. I2CInit();
  283. lcd_init();
  284.  
  285. /* Writing on i2c */
  286. I2CStart();
  287. I2CSend(0xD0);
  288. I2CSend(0x00);
  289. I2CSend(0x00);
  290. I2CSend(0x10);
  291. I2CSend(0x52);
  292. I2CSend(0x07);
  293. I2CSend(0x29);
  294. I2CSend(0x03);
  295. I2CSend(0x14);
  296. I2CStop();
  297.  
  298. while(1)
  299. {
  300.  
  301. I2CInit();
  302. I2CStart();
  303. I2CSend(0xD0);
  304. I2CSend(0x00);
  305.  
  306. /* Actual read */
  307. I2CRestart();
  308.  
  309. I2CSend(0xD1);
  310. for(i=0;i<8;i++)
  311. {
  312. a[i]=I2CRead();
  313. if(i==6)
  314. I2CNak();
  315. else
  316. I2CAck();
  317. }
  318. I2CStop();
  319.  
  320.  
  321. //I2CStop();
  322. lcd_cmd(0x81);
  323. bcdconv(convtime(a[2]));
  324. lcd_data(':');
  325. bcdconv(a[1]);
  326. lcd_data(':');
  327. bcdconv(a[0]);
  328. lcd_cmd(0xC0);
  329. bcdconv(a[4]);
  330. lcd_data('-');
  331. bcdconv(a[5]);
  332. lcd_data('-');
  333. bcdconv(a[6]);
  334. for(j=65535;j>0;j--);
  335.  
  336. }
  337.  
  338. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement