单片机怎么实现用KEY 1控制数码管上显示的数字加1 KEY2控制数码管上显示数字减1?
KEY1连P1.0KEY2连P1.1ABCDEFGDP连P2.0-P2.71、2连P1.6P1.7谢哦~...
KEY 1连P1.0 KEY 2连 P1.1 ABCDEFG DP 连P2.0-P2.7 1、2连P1.6 P1.7 谢哦~
展开
4个回答
展开全部
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<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语言没有按你的要求,以前课堂上写的!但差不多,自己看明白了往里面加就是咯 !显示部分自己改成你的,我不做说明了
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--
};
大概就是这意思 具体的自己再摸索下
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 然后查对应的编码 输出就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询