按键计数-汇编&C语言-51单片机

原创
2019/11/24 18:32
阅读数 272

汇编语言版

ORG 00H
START:
	MOV DPTR, #TABLE	; 数表进入寄存器
	MOV R0, #00H		; R0寄存器清零
	MOV P0, #0C0H		; 数码管由0开始显示
	MOV P2, #0F7H		; 选取最右侧的一个数码管

S1:
	INC R0				; R0+1
	CJNE R0, #10, S2	; 若R0不等于10时跳转到S2
	MOV R0, #00H		; R0清零

S2:
	JB P3.2, $			; p3.2=1时重复执行此命令,直到p3.2=0
	LCALL DELAY			; 调用延时函数防抖动,必须按住按钮超过100ms才可以
	JB P3.2, S2			; p3.2=1时调转到S2,否则执行下一条指令

S3:
	MOV A, R0			; 将R0的数据装载到累加器
	MOVC A, @A+DPTR	; 将查表数据送入A中
	MOV P0, A			; 将A中数据送入P0口,控制数码管显示

S4:
	JB P3.2, S1			; p3.2=1就跳转到S1,否则执行下一条命令
	JMP S4				; 跳转到S4

DELAY:
	MOV R5, #200		; 延时时间为 2us * 200 * 250 = 100ms
D1:
	MOV R6, #250
	DJNZ R6, $
	DJNZ R5, D1
	RET

TABLE:
	DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H

END

C语言版

#include <reg51.h>
sbit P3_2 = P3^2;
R0 = 0; // 初始化计数
// 定义数表
unsigned char table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};	


void main()
{
	EA  = 1;
	EX0 = 1;
	P2 = 0x01; // 选中1号数码管
	P0 = table[0]; // 数码管显示0
	while(1) {}

}
void click_button() interrupt 0
{
	while(!P3_2){}  // 防止抖动,有时你按的时间长了,就会不停的产生中断
	R0++;
	R0 = R0 % 10;
	P0 = table[R0];
}

针对C语言版的模拟电路

展开阅读全文
JMP
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部