目标
在编程软件的配合下,要求实现如下功能:
- 程序启动后,D处于熄灯、LED1处于黑屏状态;单击K1,可使D亮灯状态反转一次;单击K2,可使LED1显示值加1,并按十六进制数显示,达到F后重新从1开始。
所需芯片
- AT89C51
- CAP
- CAP-ELEC
- CRYSTAL
- LED-RED
- RES
- BUTTON
- 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) {
;
}
}
仿真结果
诗情画意
登飞来峰 王安石 飞来山上千寻塔,闻说鸡鸣见日升。 不畏浮云遮望眼,自缘身在最高层。