找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

用GCC写的PCF8563和FM24C256程序,已经在MEGA8L调试通过

[复制链接]
慧龙 发表于 2010-5-15 00:14:32 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
  1. #include <AVR/io.h>
  2. #include <avr/twi.h>
  3. #include <avr/signal.h>
  4. #define fosc 7372800
  5. #define sla 0xa0
  6. #define slav 0xa2
  7. #define TW_WRITE 0
  8. #define TW_READ 1
  9. #define max 3
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. #define ulong unsigned long

  13. void Twi_Init( void )
  14. {
  15. TWBR = 0x20;//设置波特率
  16. TWSR &= 0xfc;//设置预分频因子,则SCL频率为92160Hz
  17. }

  18. /*----------------------------------------------------------------------
  19. 功 能:将读出的时间数据的无关位屏蔽掉
  20. 说 明:hym8563时钟寄存器的有些无关位的状态是不定的,所以应该将无效位屏蔽掉
  21. ----------------------------------------------------------------------*/
  22. void Datajust(void)
  23. {
  24. trdata[0]=trdata[0]&0x7f;
  25. trdata[1]=trdata[1]&0x7f;
  26. trdata[2]=trdata[2]&0x3f;
  27. trdata[3]=trdata[3]&0x3f;
  28. trdata[4]=trdata[4]&0x07;
  29. trdata[5]=trdata[5]&0x1f;
  30. trdata[6]=trdata[6]&0xff;
  31. }

  32. uchar FM24C256_Write( uint address,uchar write_data )
  33. {
  34. uchar twst,n=0x0,rv=0x1;
  35. restart:
  36. if(n++>=max)
  37. goto error;
  38. begin:
  39. TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送开始信号
  40. while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
  41. switch((twst = TW_STATUS))
  42. {
  43. case TW_REP_START://有可能出现
  44. case TW_START:
  45. break;
  46. case TW_MT_ARB_LOST:
  47. goto begin;
  48. default:
  49. goto error;
  50. }
  51. TWDR = sla | TW_WRITE;//发送SLA+W
  52. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  53. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  54. switch((twst = TW_STATUS))
  55. {
  56. case TW_MT_SLA_ACK:
  57. break;
  58. case TW_MT_SLA_NACK://器件忙,有可能处于内部写周期
  59. goto restart;
  60. case TW_MT_ARB_LOST:
  61. goto begin;
  62. default:
  63. goto error;
  64. }
  65. TWDR = address>>8;//传输地址高8位
  66. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  67. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  68. switch((twst = TW_STATUS))
  69. {
  70. case TW_MT_DATA_ACK:
  71. break;
  72. case TW_MT_DATA_NACK:
  73. goto quit;
  74. case TW_MT_ARB_LOST:
  75. goto begin;
  76. default:
  77. goto error;
  78. }
  79. TWDR = address;//传输地址低8位
  80. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  81. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  82. switch((twst = TW_STATUS))
  83. {
  84. case TW_MT_DATA_ACK:
  85. break;
  86. case TW_MT_DATA_NACK:
  87. goto quit;
  88. case TW_MT_ARB_LOST:
  89. goto begin;
  90. default:
  91. goto error;
  92. }
  93. TWDR = write_data;
  94. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  95. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  96. switch((twst = TW_STATUS))
  97. {
  98. case TW_MT_DATA_ACK:
  99. break;
  100. default:
  101. goto error;
  102. }
  103. quit:
  104. TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);//发送停止信号
  105. return rv;
  106. error:
  107. rv=0x0;
  108. goto quit;

  109. }

  110. uchar FM24C256_Read( uint address )
  111. {
  112. uchar twst,n=0x0,rv=0x1;
  113. restart:
  114. if(n++>=max)
  115. goto error;
  116. begin:
  117. TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送开始信号
  118. while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
  119. switch((twst = TW_STATUS))
  120. {
  121. case TW_REP_START://有可能出现
  122. case TW_START:
  123. break;
  124. case TW_MT_ARB_LOST:
  125. goto begin;
  126. default:
  127. goto error;
  128. }
  129. TWDR = sla | TW_WRITE;//发送SLA+W
  130. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  131. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  132. switch((twst = TW_STATUS))
  133. {
  134. case TW_MT_SLA_ACK:
  135. break;
  136. case TW_MT_SLA_NACK://器件忙,有可能处于内部写周期
  137. goto restart;
  138. case TW_MT_ARB_LOST:
  139. goto begin;
  140. default:
  141. goto error;
  142. }
  143. TWDR = address>>8;//传输地址高8位
  144. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  145. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  146. switch((twst = TW_STATUS))
  147. {
  148. case TW_MT_DATA_ACK:
  149. break;
  150. case TW_MT_DATA_NACK:
  151. goto quit;
  152. case TW_MT_ARB_LOST:
  153. goto begin;
  154. default:
  155. goto error;
  156. }
  157. TWDR = address;//传输地址低8位
  158. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  159. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  160. switch((twst = TW_STATUS))
  161. {
  162. case TW_MT_DATA_ACK:
  163. break;
  164. case TW_MT_DATA_NACK:
  165. goto quit;
  166. case TW_MT_ARB_LOST:
  167. goto begin;
  168. default:
  169. goto error;
  170. }
  171. TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送(重新)开始信号
  172. while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
  173. switch((twst = TW_STATUS))
  174. {
  175. case TW_REP_START://正确的状态
  176. break;
  177. case TW_MT_ARB_LOST:
  178. goto begin;
  179. default:
  180. goto error;
  181. }
  182. TWDR = sla | TW_READ;//发送SLA+R
  183. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  184. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  185. switch((twst = TW_STATUS))
  186. {
  187. case TW_MR_SLA_ACK:
  188. break;
  189. case TW_MR_SLA_NACK://器件忙,有可能处于内部写周期
  190. goto restart;
  191. case TW_MR_ARB_LOST:
  192. goto begin;
  193. default:
  194. goto error;
  195. }
  196. TWCR = _BV(TWINT) | _BV(TWEN) ;//清TWINT,开始传输
  197. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  198. switch((twst = TW_STATUS))
  199. {
  200. case TW_MR_DATA_NACK:
  201. rv = TWDR;
  202. break;
  203. default:
  204. goto error;
  205. }
  206. quit:
  207. TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);//发送停止信号
  208. return rv;
  209. error:
  210. rv=0x0;
  211. goto quit;
  212. }

  213. uchar SetHym8563(uchar suba,uchar *s,uchar no )
  214. {
  215. uchar twst,i,n=0x0,rv=0x1;
  216. restart:
  217. if(n++>=max)
  218. goto error;
  219. begin:
  220. TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送开始信号
  221. while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
  222. switch((twst = TW_STATUS))
  223. {
  224. case TW_REP_START://有可能出现
  225. case TW_START:
  226. break;
  227. case TW_MT_ARB_LOST:
  228. goto begin;
  229. default:
  230. goto error;
  231. }
  232. TWDR = slav | TW_WRITE;//发送SLAV+W
  233. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  234. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕

  235. switch((twst = TW_STATUS))
  236. {
  237. case TW_MT_SLA_ACK:
  238. break;
  239. case TW_MT_SLA_NACK://器件忙,有可能处于内部写周期
  240. goto restart;
  241. case TW_MT_ARB_LOST:
  242. goto begin;
  243. default:
  244. goto error;
  245. }
  246. TWDR = suba | TW_WRITE;//发送SUBA+W
  247. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  248. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕

  249. switch((twst = TW_STATUS))
  250. {
  251. case TW_MT_DATA_ACK:
  252. break;
  253. case TW_MT_DATA_NACK://器件忙,有可能处于内部写周期
  254. goto restart;
  255. case TW_MT_ARB_LOST:
  256. goto begin;
  257. default:
  258. goto error;
  259. }
  260. for(i=0;i<no;i++)
  261. {
  262. TWDR = *s | TW_WRITE;
  263. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  264. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  265. switch((twst = TW_STATUS))
  266. {
  267. case TW_MT_DATA_ACK:
  268. break;
  269. case TW_MT_DATA_NACK://器件忙,有可能处于内部写周期
  270. goto restart;
  271. case TW_MT_ARB_LOST:
  272. goto begin;
  273. default:
  274. goto error;
  275. }
  276. s++;
  277. }
  278. quit:
  279. TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);//发送停止信号
  280. return rv;
  281. error:
  282. rv=0x0;
  283. goto quit;
  284. }

  285. uchar GetHym8563(uchar suba,uchar *s,uchar no)
  286. {
  287. uchar twst,i,n=0x0,rv=0x1;
  288. restart:
  289. if(n++>=max)
  290. goto error;
  291. begin:
  292. TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送开始信号
  293. while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
  294. switch((twst = TW_STATUS))
  295. {
  296. case TW_REP_START://有可能出现
  297. case TW_START:
  298. break;
  299. case TW_MT_ARB_LOST:
  300. goto begin;
  301. default:
  302. goto error;
  303. }
  304. TWDR = slav | TW_WRITE;//发送SLAV+W
  305. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  306. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕

  307. switch((twst = TW_STATUS))
  308. {
  309. case TW_MT_SLA_ACK:
  310. break;
  311. case TW_MT_SLA_NACK://器件忙,有可能处于内部写周期
  312. goto restart;
  313. case TW_MT_ARB_LOST:
  314. goto begin;
  315. default:
  316. goto error;
  317. }
  318. TWDR = suba | TW_WRITE;//发送SUBA+W
  319. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  320. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕

  321. switch((twst = TW_STATUS))
  322. {
  323. case TW_MT_DATA_ACK:
  324. break;
  325. case TW_MT_DATA_NACK://器件忙,有可能处于内部写周期
  326. goto restart;
  327. case TW_MT_ARB_LOST:
  328. goto begin;
  329. default:
  330. goto error;
  331. }
  332. TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送(重新)开始信号
  333. while((TWCR & _BV(TWINT))==0x0);//等待发送完毕

  334. switch((twst = TW_STATUS))
  335. {
  336. case TW_REP_START://正确的状态
  337. break;
  338. case TW_MT_ARB_LOST:
  339. goto begin;
  340. default:
  341. goto error;
  342. }
  343. TWDR = slav | TW_READ;//发送SLAV+R
  344. TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
  345. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕

  346. switch((twst = TW_STATUS))
  347. {
  348. case TW_MR_SLA_ACK:
  349. break;
  350. case TW_MR_SLA_NACK://器件忙,有可能处于内部写周期
  351. goto restart;
  352. case TW_MR_ARB_LOST:
  353. goto begin;
  354. default:
  355. goto error;
  356. }
  357. for(i=0;i<no;i++)
  358. {
  359. if(i==(no-1))
  360. {
  361. TWCR = _BV(TWINT) | _BV(TWEN) ;//清TWINT,开始传输(无应答)
  362. }
  363. else
  364. {
  365. TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWEA) ;//清TWINT,开始传输(有应答)
  366. }
  367. while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
  368. switch((twst = TW_STATUS))
  369. {
  370. case TW_MR_DATA_NACK:
  371. case TW_MR_DATA_ACK:
  372. *s = TWDR;
  373. s++;
  374. break;
  375. default:
  376. goto error;
  377. }
  378. }
  379. quit:
  380. TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);//发送停止信号
  381. return rv;
  382. error:
  383. rv=0x0;
  384. goto quit;
  385. }
复制代码
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 06:34 , Processed in 0.048978 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表