单片机实验2
实验内容
利用I/O口连接8个流水灯、1个按键和1个LED数码管,流水灯循环闪烁,当按下按键后,流水灯按原来的顺序闪烁,但数码管显示按键按下的次数
单片机型号为AT89C51、用proteus8.9、keil5软件 汇编语言编写
代码
ORG 0000H
AJMP MAIN
//INT0中断地址入口
ORG 0003H
AJMP INTOSEL
ORG 0030H
MAIN:
MOV DPTR, #TAB
//开中断
SETB EX0 //开INT0中断
SETB IT0 //选择模式
SETB EA //开cpu中断
MOV R0, #0FEH //LED循环值
MOV R1,#1H //按键次数,超过9被重新赋0,这里给1
MOV P0,#0C0H //先让数码管显示0
//流水灯
//R0的作用,因为A要在中断里被调用,所以要把A左移以后的值赋给R0
LEDLOOP:
MOV A, R0
MOV P1, A
RL A
MOV R0, A
LCALL DELAY
AJMP LEDLOOP
//中断函数
INTOSEL:
MOV A, R1 //把数码管值赋给累加器A
MOVC A, @A+DPTR
MOV P0, A
INC R1
CJNE R1, #0AH,RET1
MOV R1, #0H
RETI
RET1:
RETI //返回中断点
//延迟函数,三重循环
DELAY:
MOV R2 , #03H
LOOP:
MOV R3 , #0FFH
LOOP1:
MOV R4 , #0FFH
DJNZ R4 , $
DJNZ R3 , LOOP1
DJNZ R2 , LOOP
RET
//共阳极数码管,给P0口的数值如下
TAB:
DB 0C0H , 0F9H , 0A4H , 0B0H , 99H , 92H , 82H , 0F8H , 80H , 90H
END