单片机怎么实现用KEY 1控制数码管上显示的数字加1 KEY2控制数码管上显示数字减1?-
2024-08-27编辑:本站
关于单片机,proteus,问个很严肃的问题,如图,实现两个按键一个让数码管显示的数字加1,一个减1~
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<reg52.h>
#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语言没有按你的要求,以前课堂上写的!但差不多,自己看明白了往里面加就是咯 !显示部分自己改成你的,我不做说明了
这个简单啊 调用数组就可以了 比如 定义一个数组 uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x3e,0x70,0x00}; 这个是共阴极的 也就是高电平有效 先初始化uchar i=0; P2=TABLE[i];
if(KEY 1==0)
{
i++
};
if(KEY 2==0)
{
i--
};
大概就是这意思 具体的自己再摸索下
当KEY 1按下时 程序里声明一个数 然后将这个数加1 查对应的编码然后输出就可以了 KEY 2同样 只要将声明的数加1 然后查对应的编码 输出就可以了
vzxcvxzcbx
你把cnt定义成signed char即可。
如果是unsigned char,则0-1会变成255,里面的判断if cnt<0不成立。
这个很容易嘛,你先设置一个寄存器,然后一直扫描两个按键(假设K1按下为加,K2按下为减),假设检测到K1被按下,寄存器就加1,如果检测到K2被按下,寄存器就减1;然后再调用显示函数就OK了。、
C_BUFFER EQU 32HKEY1 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<reg52.h>
#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语言没有按你的要求,以前课堂上写的!但差不多,自己看明白了往里面加就是咯 !显示部分自己改成你的,我不做说明了
这个简单啊 调用数组就可以了 比如 定义一个数组 uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x3e,0x70,0x00}; 这个是共阴极的 也就是高电平有效 先初始化uchar i=0; P2=TABLE[i];
if(KEY 1==0)
{
i++
};
if(KEY 2==0)
{
i--
};
大概就是这意思 具体的自己再摸索下
当KEY 1按下时 程序里声明一个数 然后将这个数加1 查对应的编码然后输出就可以了 KEY 2同样 只要将声明的数加1 然后查对应的编码 输出就可以了
vzxcvxzcbx