汇编语言51单片机怎么实现用KEY 1控制数码管上显示的数字加1 KEY2控制数码管上显示数字减1?

供稿:hz-xin.com     日期:2025-01-13
单片机怎么实现用KEY 1控制数码管上显示的数字加1 KEY2控制数码管上显示数字减1?

C_BUFFER EQU 32H
KEY1 BIT P1.0
KEY2 BIT P1.1
COUNT EQU 33H
BT0 BIT 20H.0

ORG 0000H
LJMP START
ORG 000BH
LJMP TIMER

START: MOV P1,#0FFH
MOV P2,#0FFH
MOV TMOD,#01H
MOV DPTR,#65536-10000
MOV DPH,TH0
MOV DPL,TL0
SETB EA
SETB ET0
SETB TR0
MOV 20H,#00H

MAIN: ACALL KEY_SCAN
ACALL DIS_PLAY
MOV PCON,#01H
JMP MAIN
KEY_SCAN:
MOV A,P1
CJNE A,#0FFH,NEXT
MOV C_BUFFEF,#0FFH
LJMP RET1
NEXT: CJNE A,C_BUFFER,M00
JB BT0,RET1
SETB BT0
CJNE A,#0FEH,KEY2
INC COUNT
MOV A,COUNT
CJNE A,#100,RET1
MOV COUNT,#00H
LJMP RET1
KEY2: CJNE A,#0FDH,RET1
DEC COUNT
CJNE A,#-1,RET1
MOV COUNT,#99
LJMP RET1
M00: MOV C_BUFFER,A
RET1: CLR BT0
RET
DIS_PLAY:
MOV DPTR,#TAB
MOV A,COUNT
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P2,A
SETB P1.7
CLR P1.6
ACALL DEL_1MS
MOV P2,#0FFH

MOV A,B
MOVC A,@A+DPTR
MOV P2,A
SETB P1,6
CLR P1.7
ACALL DEL_1MS
MOV P2,#0FFH
RET

TIMER: MOV DPTR,#65536-10000
MOV DPH,TH0
MOV DPL,TL0
RETI
DEL_1MS:
MOV R7,#2
D1: MOV R6,#250
DJNZ R6,$
DJNZ R7,D1
RET
TAB: DB ; 自己去查数码管0~9的代码;共阳的
这是51单片机的,12MHz晶振
再给你补个C的,我这的按键可以做实际产品的,无偿给你咯,共享,呵呵!愿你努力学习 啊!
#include
#define uchar unsigned char
#define uint unsigned int
#define DATAPORT P0
#define KEY P1
sbit DX=P2^2;
sbit WX=P2^3;
bit bdata flag;
uchar TEMP,num,i;
uchar code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
void key_scan();
void dis_play();
void delay(uint t)
{
uint x,y;
for(x=0;x<t;x++)
for(y=122;y>0;y--);
}
void init()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
EA=1;
ET0=1;
}
void main()
{flag=0;
init();
while(1)
{
key_scan();
dis_play();
}
}
void key_scan()
{
if(KEY!=0xff)
{
if(KEY==TEMP)
{
if(flag==0)
{
flag=1;
sw
}
}
else
TEMP=KEY;
}
else
flag=0;
//TEMP=0xff;
}
void dis_play()
{
uchar m,n;
m=duanma[num/10];
n=duanma[num%10];
DATAPORT=0xfe;
WX=1;
WX=0;
DATAPORT=m;
DX=1;

DX=0;
delay(5);
DATAPORT=0xfd;
WX=1;
WX=0;
DATAPORT=n;
DX=1;

DX=0;
delay(5);
}
void timer0(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;

i++;
if(i==100)
{
i=0;
num++;
if(num==100)
num=0;
}
}
C语言没有按你的要求,以前课堂上写的!但差不多,自己看明白了往里面加就是咯 !显示部分自己改成你的,我不做说明了

第二个到底要实现什么,没看懂!
第一个如下
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT_0
ORG 0030H
MAIN: MOV R3,#0
MOV DPTR,#TAB
SETB EA
SETB IT0
SETB EX0
SJMP $
INT_0: CLR EA
MOV A,R3
LCALL DISP
MOV A,R3
CJNE A,#9,LP
MOV R3,#0
SJMP RETURN
LP: INC R3
RETURN:SETB EA
RETI
DISP: MOVC A,@A+DPTR
MOV P2,A

RET
TAB: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
END

原有key1为P3.4,添加个key2键为P3.5;

1、按你显示程序的逻辑,对TAB修改如下:

TAB:DB 00H,3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H

即数据的首尾为0(这是个标记而已),中间才是七段码 0--F 的显示数据;

2、对CK1、CK2键盘按下及松开程序做了修改;

3、显示程序也进行了修改,唯独延时程序不用修改;

代码如下:

MAIN:

  MOV DPTR,#TAB 

  MOV R4,#00H 

  MOV R5,#01H 

  CLR A 

  LCALL DISPLAY

LOOP: 

  LCALL KEYDOWN

  LCALL DISPLAY 

  SJMP LOOP


KEYDOWN:

  JB P3.4,CK11    ;key1没有按下则转到key2

  LCALL DS1MS    ;P3.4=0表示Key1按下

  JB P3.4,CK11    ;key1还不能松开

  MOV R5,#01H

  INC R4      ;key1按下为加

  RET

CK11:

  JB P3.5,KEYDOWN   ;key2没有按下则转到key1

  LCALL DS1MS     ;P3.5=0表示Key2按下

  JB P3.4,KEYDOWN   ;key2还不能松开

  MOV R5,#10H

  DEC R4       ;key2按下为减

  RET


D1::

  MOV R4,R5

DISPLAY:

  MOV A,R4 

  MOVC A,@A+DPTR 

  JZ D1 //累加器(A)=0转

  MOV P0,A 

  SETB P2.6 

  CLR P2.6 

  MOV P0,#0FEH 

  SETB P2.7 

  CLR P2.7 

  LCALL DS1MS   ;延时

  LCALL KEYUP

  RET


KEYUP:

  JNB P3.4,KEYUP    ;P3.4=0转

  JNB P3.5,KEYUP    ;等待松开按键

  LCALL DS1MS 

  JNB P3.4,KEYUP

  JNB P3.5,KEYUP

  RET 


TAB:DB 00H,3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H


END



汇编语言51单片机怎么实现用KEY 1控制数码管上显示的数字加1 KEY2控制...
1、按你显示程序的逻辑,对TAB修改如下:TAB:DB 00H,3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H 即数据的首尾为0(这是个标记而已),中间才是七段码 0--F 的显示数据;2、对CK1、CK2键盘按下及松开程序做了修改;3、显示程序也进行了修改,唯独延...

51单片机汇编语言编程独立按键
KEY3 BIT P3.2 KEY4 BIT P3.3 按键处理程序如下:READ_KEY:JB KEY1, K2 CALL DELAY JB KEY1, K2 JNB KEY1,PUSH ACC INC 75H MOV A, 75H CJNE A, #10, ZINT01 MOV 75H, #0 ZINT01:POP ACC JMP K_EXIT K2:JB KEY2, K3 CALL DELAY JB KEY2, K3 JNB KEY2,PUSH ACC I...

用汇编语言编写一个按钮控制8个流水灯的亮灭
51单片机汇编语言程序设计如下,实现通过按键控制8个流水灯的亮灭功能:KEY被定义为P3.2端口,LED被定义为P1端口。程序起始地址为0000H,跳转到主程序MAIN。主程序MAIN从0030H地址开始:清除00H单元的内容。将0FEH的值送入累加器A。进入循环LOOP。检查P3.2端口的状态,如果为低电平,跳转到LOOP1。如...

单片机51按下按键key1流水灯从上到下亮3次代码怎么写
可以采用以下步骤:1、要定义按键输入口和流水灯输出口。使用单片机51的P1和P2口,分别定义按键输入口和流水灯输出口。2、要初始化按键输入口为低电平。当按键没有被按下时,按键输入口就处于低电平状态。3、在主函数中,使用一个无限循环,不断检查按键输入口是否被按下。按下按键,则点亮第一个灯...

51单片机如何实现key1或key2按下 会把key3key4锁住 反过来同样可以_百度...
方法很简单,设一个标志量初值为0 这时key1到key4都起作用 一旦key1或key2按下,标志位置1 key3或key4按下 标志位置2 在判断key1或key2之前要判断标志位确保不是2 在判断key3 key4之前要判断标志位确保不是1 if(flag1!=2){if(key1==0)……flag=1 if1key2==0)……} if(flag!=1...

Keil编程:51单片机键盘控制LED
}main(){unsigned int i;led1=0xfe;led2=0xfc;while(1){P0=0x55;if(key1==0){P0=led1;led1=_crol_(led1,1);delay(200);}if(key2==0){P0=led2;led1=_crol_(led1,2);delay(200);}if(key3==0){for(i=1;i<500;i++){P0=0xff;delay(i);P0=0x00;delay(500-i);...

51单片机C语言编程如何实现长按按键实现数值的累加
这个可以用定时器来做,比如检查某键,按键时间超过2秒后一个变量开始累加知道键释放为止。实现方法如下:include<reg51.h> define uint unsigned int define uchar unsigned char uint v=0,time=0;sbit key=P1^0;void t0isr() interrupt 1 { TH0=(65536-50000)\/256;TL0=(65536-50000)%256;ti...

c语言编程由开关k1控制四盏灯的亮灭
下面以51单片机为例,P1^0接按键到地,P0^0~3以灌电流驱动方式分别接led1~led4。用Kei uVisionl编译。1.控制四盏灯一起亮灭 include<reg51.h> sbit key1 = P1^0;sbit led1 = P0^0;sbit led2 = P0^1;sbit led3 = P0^2;sbit led4 = P0^3;unsigned int count;void delay...

单片机怎么实现用KEY 1控制数码管上显示的数字加1 KEY2控制数码管上...
MAIN: ACALL KEY_SCAN ACALL DIS_PLAY MOV PCON,#01H JMP MAIN KEY_SCAN:MOV A,P1 CJNE A,#0FFH,NEXT MOV C_BUFFEF,#0FFH LJMP RET1 NEXT: CJNE A,C_BUFFER,

在51单片机中用c语言keil写程序实现用一个按键控制8个灯的亮和灭(按...
sbit key = P1^0;\/\/按键 void delay(unsigned int time){ unsigned int i,j;for(i=0; i<time; i++)for(j=0; j<1000; j++){;} } void mian(){ unsigned int temp =0x00;while(1){ if(key == 0){ delay(20);\/\/适当延时,消除按键抖动,自己看实际情况修改时间 if(key ==...