单片机源程序精华包

源代码在线查看: 程序清单与注释.txt

软件大小: 5363 K
上传用户: ranzige
关键词: 单片机源程序
下载地址: 免注册下载 普通下载 VIP

相关代码

				;按键为常开按键,按键抬起时,单片机管脚为高电平;按键按下,单片机管脚为低电平
				;低电平所对应的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		            ;子程序返回		
							

相关资源