下载贤集网APP入驻自媒体
汇编语言程序清单:
;************************************************************
.include “tn15def.inc”
.cseg ;代码段声明
.org 0 ;定义代码段开始存放地址
; LED作为测光传感器使用
main:
ldi r16,255 ;利用寄存器R16转存$FF
out DDRB,r16 ;设置端口PB为输出
ldi r16,0 ;利用R16转存$00
out PORTB,r16 ;设定端口PB送出低电平
ldi r19,1 ;利用R19设置最小延迟参数
rcall delay ;插入一个延时
ldi r19,1 ;再次设置R19最小延迟参数
new_main:
sbi DDRB,0 ;设置PB0引脚为输出脚
nop ;利用空操作延时
nop
sbi PORTB,1 ;定义引脚PB1输出高电平
cbi PORTB,0 ;定义PB0出低,LED加正偏,发光!
rcall delay ;插入一个延时
sbi PORTB,0 ;再定义引脚PB0输出高电平
cbi PORTB,1 ;定义PB1出低,LED加反偏,测光!
cbi DDRB,0 ;设置PB0脚为输入,LED电容放电
cbi PORTB,0 ;禁止上拉功能,设为高阻输入
ldi r19,1 ;在寄存器R19内设置最小延迟
wait_here:
sbis PinB,0 ;若引脚PB0为高,则跳过一行
rjmp its_one ;跳转到its_one去执行
rcall min_delay ;插入另一个延时
inc r19 ;延时参数加1
brne dont_inc_r20 ;无溢出,跳转到dont_inc_r20
rjmp over_flow ;有溢出,跳转到over_flow去执行
dont_inc_r20:
rjmp wait_here ;跳转到wait_here去执行
over_flow:
its_one:
in r16,PORTB ;读取端口PB状态到R16
ldi r17,0b00001000 ;仅仅设置R17的bit3为1
eor r16,r17 ;异或运算,仅反转PB3电平
out PORTB,r16 ;输出与光强成正比的频率
mov r2,r19 ;暂存R19内容
rcall delay ;插入一个延时
mov r19,r2 ;恢复R19内容
rjmp new_main ;返回主循环程序
;===========================================
delay:
ldi r20,0 ;清零R20,实为令R20=256
dec_r20:
dec r20 ;R20减1
brne dec_r20 ;不为0则跳回,循环
dec r19 ;否则再令R19减1
brne dec_r20 ;不为0则跳回,循环
ret ;子程序返回
;===========================================
min_delay:
in r0,SREG ;保护状态寄存器内容
ldi r18,200 ;设置循环次数,即令R18=200
not_over:
dec r18 ;R18减1
brne not_over ;不为0则跳回,循环
out SREG,r0 ;恢复状态寄存器内容
ret ;子程序返回
;*********************************************