单片机源程序精华包
源代码在线查看: 程序清单与注释.txt
;按键为常开按键,按键抬起时,单片机管脚为高电平;按键按下,单片机管脚为低电平
;低电平所对应的LED将被点亮,由硬件连接方式决定
.include "m16def.inc" ;文件头,其中包含ATmega16芯片的硬件资源定义,针对ATmega16的
;程序一般需要有此指令。
.org $0000 ;org是一条伪指令,表示随后程序的起始位置。即表示下条指令
;"rjmp RESET"位于程序存储器的$0000地址
rjmp RESET ;单片机复位后从$0000开始执行程序,在这里放一条跳转指令,
;跳转到主程序开始的地址
.org $0020 ;$0000地址之后是中断向量区,跳过中断区。中断与中断向量将在
;以后解释,可以参考光盘中ATmega16的数据手册。
RESET:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND) ;设置堆栈,一般将堆栈设置到RAM的结尾。
out SPL,r16 ;在自己编写程序时,可以使用以上代码
ldi r16,0b11111111
out DDRA,r16
out DDRC,r16
out DDRD,r16 ;设置PA,PC,PD端口全部为输出
ldi r16,0b11111110;
out DDRB,r16 ;设置PB0为输入,PB0管脚连接按键
ldi r16,0b11111111;
out PORTA,r16 ;PA端口全部输出高电平,LED熄灭
out PORTC,r16
out PORTD,r16 ;PC端口,PD端口输出高电平
out PORTB,r16 ;PB1~PB7输出高电平,PB0为输入,且打开内部上拉
;端口的初始化完成。
sec ;置进位C为1,为LED移位做准备
MAIN:
ldi r16,0b11111111
out PORTA,r16 ;关闭所有的LED
ldi r20,0b11111110 ;低电平点亮LED;r20用来存储输出状态
in r16,PINB
sbrc r16,0 ;判断PB0是否为低电平,即按键是否按下
rjmp MAIN ;按键没有被按下,继续检测PB0
LEDPLAY:
out PORTA,r20 ;按键被按下,点亮相应的LED
call DELAY ;点亮持续一段时间
rol r20 ;r20往左循环一位,即下一位LED亮的状态
in r16,PINB ;继续检测开关状态,
sbrc r16,0 ;判断PB0是否为低电平,即按键是否按下
rjmp MAIN ;没有按下,说明按键已经抬起,回到初始状态
rjmp LEDPLAY ;按键按下,继续循环点亮
;延时子程序
DELAY:
ldi r17,0x03 ;设置延时子程序参数
ldi r18,0xff
ldi r19,0xff
DELAY1:
dec r18 ;r18减去1
brne DELAY1 ;不为0转DELAY1;为0按顺序执行
dec r19 ;r19减去1
brne DELAY1 ;不为0转DELAY1;为0按顺序执行
dec r17 ;r17减去1
brne DELAY1 ;不为0转DELAY1;为0按顺序执行,延时程序结束,返回主程序
ret ;子程序返回