[Atmel] 做个基于Atmel的数字钟(第三步)

[复制链接]
 楼主| ddllxxrr 发表于 2014-8-7 21:25 | 显示全部楼层 |阅读模式
程序:

  1. #include<REG2051.H>
  2. code senen_seg[10]={0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0};
  3. bit key1_enter=0,key2_enter=0,key3_enter=0,countdown_mark=0,stopwatch_mark=0,count_mark=0,bell_mark=0;
  4. unsigned char program=0,program_variable=0,count_bit=0,count=0;
  5. unsigned char hour=10,minute=10,second=0;
  6. unsigned char delayed_hour=22,delayed_minute=10,delayed_second=0;
  7. unsigned char count_hour=0,count_minute=0,count_second=0;
  8. unsigned int count_time=0,count_count=0;
  9. void delay(unsigned int t)
  10. {
  11. unsigned int i,j;
  12. for(i=0;i<t;i++)
  13. for(j=0;j<10;j++)
  14. ;
  15. }
  16. void time0_init(void){
  17. EA=0;
  18. TR0=0;
  19. TMOD=0x02;
  20. TH0=0x4;
  21. TL0=0x4;
  22. ET0=1;
  23. TR0=1;
  24. EA=1;
  25. }

  26. static void timer0_isr(void) interrupt TF0_VECTOR using 1
  27. {
  28. count_time++;
  29. if(count_time>=4020){
  30. count_time=0;
  31. second++;
  32. if(second>=60){
  33. second=0;
  34. minute++;
  35. if(minute>=60){
  36. minute=0;
  37. hour++;
  38. if(hour>=24)hour=0;
  39. }
  40. }
  41. }
  42. if(delayed_hour==hour && delayed_minute==minute && second<4) P3_7=0;
  43. else P3_7=1;
  44. if(countdown_mark==1){
  45. count_count++;
  46. if(count_count>=4000 && (count_second!=0|count_minute!=0|count_hour!=0)){
  47. count_count=0;
  48. count_second--;
  49. if(count_second>=60){
  50. count_second=59;
  51. count_minute--;
  52. if(count_minute>=60){
  53. count_minute=59;
  54. count_hour--;
  55. if(count_hour>=100) count_hour=99;
  56. }
  57. }
  58. }
  59. if(count_second==0&&count_minute==0&&count_hour==0&&count_count<=12000) P3_7=0;
  60. else P3_7=1;
  61. if(count_count>=15000) count_count=14000;
  62. }
  63. if(stopwatch_mark==1){ count_count++;
  64. if(count_count>=40){
  65. count_count=0;
  66. count_second++;
  67. if(count_second>=100){
  68. count_second=0;
  69. count_minute++;
  70. if(count_minute>=60){
  71. count_minute=0;
  72. count_hour++;
  73. if(count_hour>=60) count_hour=0;
  74. }
  75. }
  76. }
  77. }
  78. }
  79. unsigned char show_key (void){
  80. unsigned char x=0,y=0;
  81. switch (program){
  82. case 0: P1&=senen_seg[second%10];
  83. break;
  84. case 1: if(count_time>=2000) P1&=senen_seg[second%10];
  85. break;
  86. case 2: if(delayed_hour==24) P1=0xfe;
  87. else P1&=senen_seg[delayed_second%10];
  88. break;
  89. case 3: if(count_bit>=0) P1&=senen_seg[count_second%10];
  90. else P1=0xff;
  91. break;
  92. case 4: P1&=senen_seg[count_second%10];
  93. break;
  94. case 5: P1&=senen_seg[count_second%10];
  95. break;
  96. }
  97. P3_3=0;
  98. delay(10);
  99. if(P3_5==0){
  100. key1_enter=1;
  101. if(count<=254)count++;
  102. }
  103. if(P3_4==0) key2_enter=1;
  104. if(P3_2==0) key3_enter=1;
  105. P3_3=1;
  106. P1|=0xff;
  107. switch (program){
  108. case 0: P1&=senen_seg[second/10];
  109. break;
  110. case 1: if(count_time>=2000) P1&=senen_seg[second/10];
  111. break;
  112. case 2: if(delayed_hour==24) P1=0xfe;
  113. else P1&=senen_seg[delayed_second/10];
  114. break;
  115. case 3: if(count_bit>=1) P1&=senen_seg[count_second/10];
  116. else P1=0xff;
  117. break;
  118. case 4: P1&=senen_seg[count_second/10];
  119. break;
  120. case 5: P1&=senen_seg[count_second/10];
  121. break;
  122. }
  123. P3_1=0;
  124. delay(10);
  125. P3_1=1;
  126. P1|=0xff;
  127. switch (program){
  128. case 0: P1&=senen_seg[minute%10];
  129. break;
  130. case 1: if(count_time>=2000) P1&=senen_seg[minute%10];
  131. break;
  132. case 2: if(delayed_hour==24) P1=0xfe;
  133. else P1&=senen_seg[delayed_minute%10];
  134. break;
  135. case 3: if(count_bit>=2) P1&=senen_seg[count_minute%10];
  136. else P1=0xff;
  137. break;
  138. case 4: P1&=senen_seg[count_minute%10];
  139. break;
  140. case 5: P1&=senen_seg[count_minute%10];
  141. break;
  142. }
  143. P3_2=0;
  144. delay(10);
  145. P3_2=1;
  146. P1|=0xff;
  147. switch (program){
  148. case 0: P1&=senen_seg[minute/10];
  149. break;
  150. case 1: if(count_time>=2000) P1&=senen_seg[minute/10];
  151. break;
  152. case 2: if(delayed_hour==24) P1=0xfe;
  153. else P1&=senen_seg[delayed_minute/10];
  154. break;
  155. case 3: if(count_bit>=3) P1&=senen_seg[count_minute/10];
  156. else P1=0xff;
  157. break;
  158. case 4: P1&=senen_seg[count_minute/10];
  159. break;
  160. case 5: P1&=senen_seg[count_minute/10];
  161. break;
  162. }
  163. P3_5=0;
  164. delay(10);
  165. P3_5=1;
  166. P1|=0xff;
  167. switch (program){
  168. case 0: P1&=senen_seg[hour%10];
  169. break;
  170. case 1: if(count_time>=2000) P1&=senen_seg[hour%10];
  171. break;
  172. case 2: if(delayed_hour==24) P1=0xfe;
  173. else P1&=senen_seg[delayed_hour%10];
  174. break;
  175. case 3: if(count_bit>=4) P1&=senen_seg[count_hour%10];
  176. else P1=0xff;
  177. break;
  178. case 4: P1&=senen_seg[count_hour%10]; break;
  179. case 5: P1&=senen_seg[count_hour%10];
  180. break;
  181. }
  182. P3_0=0;
  183. delay(10);
  184. if(P3_4==1 && key2_enter==1){
  185. x=3; key2_enter=0;
  186. }
  187. P3_0=1;
  188. P1|=0xff;
  189. switch (program){
  190. case 0: P1&=senen_seg[hour/10]; break;
  191. case 1: if(count_time>=2000) P1&=senen_seg[hour/10]; break;
  192. case 2: if(delayed_hour==24) P1=0xfe; else P1&=senen_seg[delayed_hour/10];
  193. break;
  194. case 3: if(count_bit>=5)P1&=senen_seg[count_hour/10]; else P1=0xff;
  195. break;
  196. case 4: P1&=senen_seg[count_hour/10];
  197. break;
  198. case 5: P1&=senen_seg[count_hour/10]; break;
  199. }
  200. P3_4=0;
  201. delay(10);
  202. if(P3_5==1 && key1_enter==1){
  203. if(count>=127) x=1; else x=2; key1_enter=0;
  204. count=0;
  205. }
  206. if(P3_2==1 && key3_enter==1){
  207. x=4;
  208. key3_enter=0;
  209. }
  210. P3_4=1;
  211. P1|=0xff;
  212. if(program<=1 && count_time>=2000) P1&=0xff;
  213. if(program<=1 && count_time<=2000) P1&=0x7f;
  214. if(program==2) P1&=0x7f;
  215. if(program==3) P1&=0xff;
  216. if(program==4) P1&=0x7f;
  217. if(program==5) P1&=0xff;
  218. y=x;
  219. x=0;
  220. return y;
  221. }
  222. void main(){
  223. P1=0xff;
  224. P3=0xff;
  225. time0_init();
  226. while(1){
  227. switch(program){
  228. case 0: while(program==0){
  229. switch(show_key()){
  230. case 0: break;
  231. case 1: program=0;
  232. break;
  233. case 2: program=1;
  234. break;
  235. }
  236. }
  237. break;
  238. case 1: while(program==1){
  239. switch(show_key()){
  240. case 0: break;
  241. case 1: program=0;
  242. break;
  243. case 2: program=2;
  244. break;
  245. case 3: hour++;
  246. if(hour>=24)hour=0;
  247. break;
  248. case 4: minute++;
  249. if(minute>=60)minute=0;
  250. break;
  251. }
  252. }
  253. break;
  254. case 2: while(program==2){
  255. switch(show_key()){
  256. case 0: break;
  257. case 1: program=0;
  258. break;
  259. case 2: program=3;
  260. break;
  261. case 3: delayed_hour++;
  262. if(delayed_hour>=25)delayed_hour=0;
  263. break;
  264. case 4: delayed_minute++;
  265. if(delayed_minute>=60)delayed_minute=0;
  266. break;
  267. }
  268. }
  269. break;
  270. case 3: while(program==3){
  271. switch(show_key()){
  272. case 0: break;
  273. case 1: program=0;
  274. break;
  275. case 2: program=4;
  276. break;
  277. case 3: count_bit++;
  278. if(count_bit>=7)count_bit=0;
  279. break;
  280. case 4: switch(count_bit){
  281. case 0: count_second+=1;
  282. break;
  283. case 1: count_second+=10;
  284. break;
  285. case 2: count_minute+=1;
  286. break;
  287. case 3: count_minute+=10;
  288. break;
  289. case 4: count_hour+=1;
  290. break;
  291. case 5: count_hour+=10;
  292. break;
  293. case 6: break;
  294. }
  295. if(count_hour>=100) count_hour-=100;
  296. if(count_minute>=60) count_minute-=60;
  297. if(count_second>=60) count_second-=60;
  298. break;
  299. }
  300. if(count_bit==6) countdown_mark=1;
  301. else countdown_mark=0;
  302. }
  303. break;
  304. case 4: count_hour=0;
  305. count_minute=0;
  306. count_second=0;
  307. while(program==4){
  308. switch(show_key()){
  309. case 0: break;
  310. case 1: program=0;
  311. break;
  312. case 2: program=5;
  313. break;
  314. case 3: stopwatch_mark=~stopwatch_mark;
  315. break;
  316. case 4: if(stopwatch_mark==0){
  317. count_hour=0;
  318. count_minute=0;
  319. count_second=0;
  320. }
  321. break;
  322. }
  323. }
  324. break;
  325. case 5: count_hour=0;
  326. count_minute=0;
  327. count_second=0;
  328. while(program==5){
  329. switch(show_key()){
  330. case 0: break;
  331. case 1: program=0;
  332. break;
  333. case 2: program=0;
  334. break;
  335. case 3: count_second++;
  336. if(count_second>=100){
  337. count_second=0;
  338. count_minute++;
  339. if(count_minute>=100){
  340. count_minute=0;
  341. count_hour++;
  342. if(count_hour>=100)count_hour=0;
  343. }
  344. }
  345. break;
  346. case 4: count_hour=0;
  347. count_minute=0;
  348. count_second=0;
  349. break;
  350. }
  351. if(P3_7==0){
  352. while(P3_7==0) show_key();
  353. count_second++;
  354. if(count_second>=100){
  355. count_second=0;
  356. count_minute++;
  357. if(count_minute>=100){
  358. count_minute=0;


蔚蓝柳叶 发表于 2014-8-7 23:09 | 显示全部楼层
先收藏,到时单片机课程设计用得上,谢谢楼主分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部