EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 885|回复: 2

[资料共享] avr单片机流水灯和 按键抗干扰,左右按键要松开才行 带仿...

[复制链接]

47

主题

3

回帖

430

E币

技术员

Rank: 2

积分
97
发表于 2017-5-15 15:36:18 | 显示全部楼层 |阅读模式
都是用的avr单片机ATMEGA16仿真。。有3个按键控制流水灯程序 和1个单片机按键抗干扰,左右按键要松开才行.
004546sc6c762232ztpdvt.png

单片机源码:
  1. #include <iom16v.h>
  2. void delay(unsigned int x)
  3. {
  4.   int i,j;
  5.   for(i=0;i<x;i++)
  6.     for(j=0;j<1141;j++);
  7. }

  8. void button(int i)
  9. {
  10. if((PINC&(1<<PC0))==0)
  11. {
  12. delay(20);
  13. if((PINC&(1<<PC0))==0)
  14. {
  15. up(i);
  16. }
  17. while((PINC&(1<<PC0))==0);
  18. }
  19. if((PINC&(1<<PC1))==0)
  20. {
  21. delay(20);
  22. if((PINC&(1<<PC1))==0)
  23. {
  24. down(i);
  25. }
  26. while((PINC&(1<<PC1))==0);
  27. }if((PINC&(1<<PC2))==0)
  28. {
  29. delay(20);
  30. if((PINC&(1<<PC2))==0)
  31. {
  32. left(i);
  33. }
  34. while((PINC&(1<<PC2))==0);

  35. }
  36. if((PINC&(1<<PC3))==0)
  37. {
  38. delay(20);
  39. if((PINC&(1<<PC3))==0)
  40. {
  41. right(i);
  42. }
  43. while((PINC&(1<<PC3))==0);
  44. }
  45. }

  46. void down(int i)
  47. {
  48. while(i<4)
  49. {
  50. int k = i;
  51. for(i+=4;i<8;i+=4)
  52. {
  53. PORTA = 1<<i;
  54. delay(50);
  55. PORTA = 0x00;
  56. button(i);
  57. }
  58. i-=4;
  59. for(i+=4;i<16;i+=4)
  60. {
  61. PORTB = 1<<(i-8);
  62. delay(50);
  63. PORTB=0x00;
  64. button(i);
  65. }
  66. i-=4;
  67. i=k;
  68. PORTA = 1<<i;
  69. delay(50);
  70. button(i);
  71. }
  72. while(i>3&&i<8)
  73. {
  74. for(i+=4;i<16;i+=4)
  75. {
  76. PORTB = 1<<(i-8);
  77. delay(50);
  78. PORTB=0x00;
  79. button(i);
  80. }
  81. i-=4;
  82. for(i-=12;i<8;i+=4)
  83. {
  84. PORTA=1<<i;
  85. delay(50);
  86. PORTA=0x00;
  87. button(i);
  88. }
  89. i-=4;
  90. }
  91. while(i>7&&i<12)
  92. {
  93. for(i+=4;i<16;i=+4)
  94. {
  95. PORTB=1<<(i-8);
  96. delay(50);
  97. PORTB=0x00;
  98. button(i);
  99. }
  100. i-=4;
  101. for(i-=12;i<8;i+=4)
  102. {
  103. PORTA=1<<i;
  104. delay(50);
  105. PORTA=0x00;
  106. button(i);
  107. }
  108. PORTB=1<<(i-8);
  109. delay(50);
  110. PORTB=0x00;
  111. button(i);
  112. }
  113. while(i<16&&i>11)
  114. {
  115. for(i-=12;i<8;i+=4)
  116. {
  117. PORTA=1<<i;
  118. delay(50);
  119. PORTA=0x00;
  120. button(i);
  121. }
  122. for( ;i<16;i+=4)
  123. {
  124. PORTB=1<<(i-8);
  125. delay(50);
  126. PORTB=0x00;
  127. button(i);
  128. }
  129. i-=4;
  130. }
  131. }


  132. void up(int i)
  133. {
  134. while(i<4)
  135. {
  136. PORTA=0x00;
  137. for(i+=12;i<16&&i>7;i-=4)
  138. {
  139. PORTB = 1<<(i-8);
  140. delay(50);
  141. button(i);
  142. }
  143. PORTB=0x00;
  144. i+=4;
  145. for(i-=4;i>=0&&i<8;i-=4)
  146. {
  147. PORTA=1<<i;
  148. delay(50);
  149. PORTA=0x00;
  150. button(i);
  151. }
  152. i+=4;
  153. }
  154. while(i>3&&i<8)
  155. {
  156. for(i-=4;i>=0;i-=4)
  157. {
  158. PORTA = 1<<i;
  159. delay(50);
  160. PORTA=0x00;
  161. button(i);
  162. }
  163. i=+4;
  164. for(i+=12;i<16&&i>7;i-=4)
  165. {
  166. PORTB=1<<(i-8);
  167. delay(50);
  168. PORTB=0x00;
  169. button(i);
  170. }
  171. PORTA=1<<i;
  172. delay(50);
  173. button(i);
  174. }
  175. while(i>7&&i<12)
  176. {
  177. for(i-=4;i<8&&i>=0;i=-4)
  178. {
  179. PORTA=1<<i;
  180. delay(50);
  181. PORTA=0x00;
  182. button(i);
  183. }
  184. i+=4;
  185. for(i+=12;i<16&&i>7;i-=4)
  186. {
  187. PORTB=1<<(i-8);
  188. delay(50);
  189. PORTB=0x00;
  190. button(i);
  191. }
  192. i+=4;
  193. }
  194. while(i>11&&i<16)
  195. {
  196. for(i-=4;i<16&&i>7;i=-4)
  197. {
  198. PORTB=1<<(i-8);
  199. delay(50);
  200. PORTB=0x00;
  201. button(i);
  202. }
  203. for( ;i<8&&i>=0;i-=4)
  204. {
  205. PORTA=1<<i;
  206. delay(50);
  207. PORTA=0x00;
  208. button(i);
  209. }
  210. i+=16;
  211. PORTB=1<<(i-8);
  212. delay(50);
  213. button(i);
  214. }
  215. }


  216. void right(int i)
  217. {
  218. while(i<4)
  219. {
  220. i-=1;
  221. for(i+=1;i>=0&&i<4;i+=1)
  222. {
  223. PORTA = 1<<i;
  224. delay(50);
  225. button(i);
  226. }
  227. i-=4;
  228. }
  229. while(i>3&&i<8)
  230. {
  231. i-=1;
  232. for(i+=1;i>3&&i<8;i+=1)
  233. {
  234. PORTA = 1<<i;
  235. delay(50);
  236. button(i);
  237. }
  238. i-=4;
  239. }
  240. while(i>7&&i<12)
  241. {
  242. i-=1;
  243. for(i+=1;i>7&&i<12;i+=1)
  244. {
  245. PORTA = 1<<(i-8);
  246. delay(50);
  247. button(i);
  248. }
  249. i-=4;
  250. }
  251. while(i>11&&i<16)
  252. {
  253. i-=1;
  254. for(i+=1;i>11&&i<16;i+=1)
  255. {
  256. PORTA = 1<<(i-8);
  257. delay(50);
  258. button(i);
  259. }
  260. i-=4;
  261. }
  262. }

  263. void left(int i)
  264. {
  265. while(i<4)
  266. {
  267. i+=1;
  268. for(i-=1;i>=0&&i<4;i-=1)
  269. {
  270. PORTA = 1<<i;
  271. delay(50);
  272. button(i);
  273. }
  274. i+=4;
  275. }
  276. while(i>3&&i<8)
  277. {
  278. i+=1;
  279. for(i-=1;i>3&&i<8;i-=1)
  280. {
  281. PORTA = 1<<i;
  282. delay(50);
  283. button(i);
  284. }
  285. i+=4;
  286. }
  287. while(i>7&&i<12)
  288. {
  289. i+=1;
  290. for(i-=1;i>7&&i<12;i-=1)
  291. {
  292. PORTA = 1<<(i-8);
  293. delay(50);
  294. button(i);
  295. }
  296. i+=4;
  297. }
  298. while(i>11&&i<16)
  299. {
  300. i+=1;
  301. for(i-=1;i>11&&i<16;i-=1)
  302. {
  303. PORTA = 1<<(i-8);
  304. delay(50);
  305. button(i);
  306. }
  307. i+=4;
  308. }
  309. }


  310. void main()
  311. {
  312. int i;
  313. DDRA = 0xFF;
  314. DDRB = 0xFF;
  315. PORTC|=(1<<PC0);
  316. PORTC|=(1<<PC1);
  317. PORTC|=(1<<PC2);
  318. PORTC|=(1<<PC3);
  319. while(1)
  320. {
  321. for(i=0;i<4;i++)
  322. {
  323. PORTA = 1<<i;
  324. delay(50);
  325. button(i);
  326. }
  327. }
  328. }
复制代码


捕获.PNG

下载:

流水灯和按键.zip (60.58 KB, 下载次数: 0)
积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-20 19:55 , Processed in 0.073914 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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