单片机设计流水灯

s_jnwen   2010-3-16 20:51 楼主
刚刚学习单片机,老师留得作业使用ATmega16设计流水灯,A B C D 四口从低位向高位依次点亮,然后从高位向低位依次熄灭。如果只用一个口 PORTA 我会,但是不知道怎样写四个的

回复评论 (5)

按照PORTA的方式同样操作PORTB,PORTC,PORTD。
点赞  2010-3-16 21:37
用个循环。里面依次执行ABCD口的单独流水灯不就行了嘛,随便问下,你们学校有学开avr的可啊?以前我都在只学了51的
点赞  2010-3-16 21:52
回一楼:我觉得这样做挺长的,我们老师曾让我们看了下他的程序,很简单,没有那么多循环....不过我忘了他怎么做的
回二楼:我们直接学的ATmega128,没有学51
点赞  2010-3-16 22:03
给你下代码吧,

  1. #include
  2. #include

  3. void port_init(void)
  4. {
  5. PORTA = 0x00;
  6. DDRA  = 0x00;
  7. PORTB = 0x00;
  8. DDRB  = 0x02;
  9. PORTC = 0x00; //m103 output only
  10. DDRC  = 0x00;
  11. PORTD = 0x00;
  12. DDRD  = 0x00;
  13. }

  14. //call this routine to initialize all peripherals
  15. void init_devices(void)
  16. {
  17. //stop errant interrupts until set up
  18. CLI(); //disable all interrupts
  19. port_init();

  20. MCUCR = 0x00;
  21. GICR  = 0x00;
  22. TIMSK = 0x00; //timer interrupt sources
  23. SEI(); //re-enable interrupts
  24. //all peripherals are now initialized
  25. }


点赞  2010-3-16 22:29
具体主函数楼主参考我的代码自己修改下吧:

  1. #include
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. void delay(uint ticks);
  5. void main()
  6. {
  7. init_devices();
  8. while(1)
  9. {
  10.   PORTB^=0x02;//把IO口取反
  11.   delay(5000);
  12. }
  13. }

  14. void delay(uint ticks)
  15. {
  16. uchar i;
  17. while(ticks--)for(i=100;i!=0;i--);//约0.1mS
  18. }
点赞  2010-3-16 22:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复