程序清单与注释.txt
Upload User: sophiecyc
Upload Date: 2007-10-14
Package Size: 14856k
Code Size: 2k
Category:

SCM

Development Platform:

C/C++

  1. ;按键为常开按键,按键抬起时,单片机管脚为高电平;按键按下,单片机管脚为低电平
  2. ;低电平所对应的LED将被点亮,由硬件连接方式决定
  3. .include "m16def.inc"   ;文件头,其中包含ATmega16芯片的硬件资源定义,针对ATmega16的
  4.                         ;程序一般需要有此指令。
  5. .org  $0000             ;org是一条伪指令,表示随后程序的起始位置。即表示下条指令
  6.                         ;"rjmp RESET"位于程序存储器的$0000地址
  7. rjmp RESET         ;单片机复位后从$0000开始执行程序,在这里放一条跳转指令,
  8.                       ;跳转到主程序开始的地址
  9. .org $0020             ;$0000地址之后是中断向量区,跳过中断区。中断与中断向量将在
  10.                         ;以后解释,可以参考光盘中ATmega16的数据手册。
  11. RESET:
  12. ldi r16,high(RAMEND) 
  13. out SPH,r16           
  14. ldi r16,low(RAMEND)  ;设置堆栈,一般将堆栈设置到RAM的结尾。
  15. out SPL,r16          ;在自己编写程序时,可以使用以上代码
  16. ldi r16,0b11111111   
  17. out DDRA,r16
  18. out DDRC,r16
  19. out DDRD,r16         ;设置PA,PC,PD端口全部为输出
  20. ldi r16,0b11111110;
  21. out DDRB,r16         ;设置PB0为输入,PB0管脚连接按键
  22. ldi r16,0b11111111;
  23. out PORTA,r16        ;PA端口全部输出高电平,LED熄灭
  24. out PORTC,r16        
  25. out PORTD,r16      ;PC端口,PD端口输出高电平
  26. out PORTB,r16        ;PB1~PB7输出高电平,PB0为输入,且打开内部上拉
  27.                      ;端口的初始化完成。
  28. sec                  ;置进位C为1,为LED移位做准备
  29. MAIN:
  30.   ldi r16,0b11111111
  31. out PORTA,r16        ;关闭所有的LED
  32. ldi r20,0b11111110   ;低电平点亮LED;r20用来存储输出状态
  33. in r16,PINB
  34. sbrc r16,0           ;判断PB0是否为低电平,即按键是否按下 
  35. rjmp MAIN            ;按键没有被按下,继续检测PB0   
  36. LEDPLAY:  
  37. out PORTA,r20        ;按键被按下,点亮相应的LED
  38. call DELAY           ;点亮持续一段时间
  39. rol r20              ;r20往左循环一位,即下一位LED亮的状态
  40. in r16,PINB          ;继续检测开关状态,
  41. sbrc r16,0           ;判断PB0是否为低电平,即按键是否按下 
  42.   rjmp MAIN            ;没有按下,说明按键已经抬起,回到初始状态
  43.   rjmp LEDPLAY         ;按键按下,继续循环点亮
  44.                      ;延时子程序
  45. DELAY:
  46.     ldi r17,0x03       ;设置延时子程序参数
  47.     ldi r18,0xff
  48.   ldi r19,0xff
  49. DELAY1:
  50.   dec r18             ;r18减去1
  51.     brne DELAY1         ;不为0转DELAY1;为0按顺序执行
  52.     dec r19           ;r19减去1
  53.     brne DELAY1         ;不为0转DELAY1;为0按顺序执行
  54.     dec r17           ;r17减去1
  55.     brne DELAY1         ;不为0转DELAY1;为0按顺序执行,延时程序结束,返回主程序
  56.     ret             ;子程序返回