单片机仿真指示灯数码管的中断控制

目标

在编程软件的配合下,要求实现如下功能:

  • 程序启动后,D处于熄灯、LED1处于黑屏状态;单击K1,可使D亮灯状态反转一次;单击K2,可使LED1显示值加1,并按十六进制数显示,达到F后重新从1开始。

所需芯片

  1. AT89C51
  2. CAP
  3. CAP-ELEC
  4. CRYSTAL
  5. LED-RED
  6. RES
  7. BUTTON
  8. RESPACK-8

开始动手

流程图

流程图

仿真图

仿真图

源代码

汇编
    ORG     0000H
    LJMP    START
    ORG     0003H
    LJMP    INT_0
    ORG     0013H
    LJMP    INT_1

START:
    MOV     P2, 00000000B
    SETB	P0.4
    SETB    EA
    SETB    EX0
    SETB    EX1
    SETB    IT1
    SETB    IT0
	MOV     R1, #16
    MOV     R2, 00H
DLOOP:
    LJMP   DLOOP

INT_0:
    CLR     EA		;关中断
	PUSH	PSW		;保护现场
	PUSH	ACC
	SETB	EA		;开中断
    CPL     P0.4	;中断子程序段
    CLR     EA		;关中断
	POP		ACC		;恢复现场
	POP		PSW
    SETB    EA		;开中断
    RETI			;中断返回

INT_1:
    CLR     EA		;关中断
	PUSH	PSW		;保护现场
	PUSH	ACC
	SETB	EA		;开中断
    CJNE    R2, #16, CONTINUE
    MOV     R2, #00H
CONTINUE:
    MOV     DPTR, #TABLE
    MOV     A, R2
    MOVC    A, @A + DPTR
    MOV     P2, A
    INC     R2
    CLR     EA		;关中断
	POP		ACC		;恢复现场
	POP		PSW
    SETB    EA		;开中断
    RETI			;中断返回

TABLE: 
    DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH, 77H, 7CH, 58H, 5EH, 79H, 71H
END
C语言
#include <reg51.h>

unsigned char led_mod[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
                           0x7f, 0x6f, 0x77, 0x7c, 0x58, 0x5e, 0x79, 0x71};
unsigned char count = 0;
sbit P0_4 = P0 ^ 4;
													 
void INT_0SRV() interrupt 0 { P0_4 = ~P0_4; }

void INT_1SRV() interrupt 2 {
  count++;
  if (count == 16)
    count = 1;
  P2 = led_mod[count];
}
void main(void) {
  P2 = 0x00;
  P0_4 = 0x01;
  EA = 1;
  EX0 = 1;
  EX1 = 1;
  IT1 = 1;
  IT0 = 1;
  while (1) {
		;
	}
}

仿真结果

仿真结果

诗情画意

登飞来峰
王安石
飞来山上千寻塔,闻说鸡鸣见日升。
不畏浮云遮望眼,自缘身在最高层。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值