修改单片机按键程序,按键按下时数码管十位数处熄灭,请问该如何修改

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-01
单片机程序求修改,实现按键控制数码管0-9,急!!!

#include
unsigned int num,a;
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;

bit flag;

unsigned char code led_code[20] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void delay(unsigned char i)
{
unsigned char j;
for(;i>0;i--) for(j=110;j>0;j--);
}

void keyscan()
{
/*实现加法功能*/
if(key0==0) {
delay(7);
if(key0==0) {
num++;
if(num==10) num=0;
while(key0==0);
}
}

/*实现减法功能*/
if(key1==0) {
delay(7);
if(key1==0) {
num--;
if(num==-1) num=9;

while(key1==0);

}
}
/*实现清零功能*/
if(key2==0) {
delay(7);
if(key2==0) {
num=0;
while(key2==0);
}
}
/*实现定时器1方式1定时1S使得数码管加1显示功能*/
if(key3==0) {
delay(7);
if(key3==0) {
flag = ~flag;
while(key3==0);
}
}
}
void T1_ini()
{
TMOD=0X10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void timer1() interrupt 3
{
a++;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
void display()
{
P3=led_code[num];
}
void main()
{
T1_ini();
while(1)
{
keyscan();
display();
if(a >= 20 && flag) {
a = 0;
num++;
if(num==10) num=0;
}
}
}
试试看。

没有下拉电阻,如果没有下拉电阻,没有被按键时,引脚是高组态,这个时候不能用来读取数据,必须将用来读的引脚加上下拉电阻拉到地,这样才能读数据,所以你需要4个下拉电阻在键盘上。。。。 记住引脚悬空,又没有上拉或下拉电阻的时候不要读数据,这时候读的东西是不会出现你想要的结果,可能1,可能0 ,有上拉无输入时,是1,下拉式0,你这里面希望是无输入时引脚为0,所以用下拉。。。。

//如果你要在按键时灭数码管的话就直接在按键判断里面加个把段码全部关闭即可,
//你的程序里面好像没有限制数值
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit KEY = P3^4; //独立按键的T0

uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};

void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=110;x++);
}

void main()
{
uchar i = 0;
while(1)
{
P0 = table[i/10]; //显示10位数
P2 = 6;
Delay_1ms(5);
P0 = table[i%10]; //显示个位数
P2 = 7;
Delay_1ms(5);

if(KEY == 0)
{
Delay_1ms(20); //软件消抖,试验为20ms
if(KEY == 0)
{
i++;
if(i>99) //限制最大数
{
i=0;
}
while(!KEY);
}
}
}
}

P2=6
P2=7
这两处是错误的,是不是应该
P2=0x06
P2=0x07
如果按原来的赋值的话实际是将R6和R7的值赋给P2

先看看

  • 修改单片机按键程序,按键按下时数码管十位数处熄灭,请问该如何修改
    答://如果你要在按键时灭数码管的话就直接在按键判断里面加个把段码全部关闭即可,//你的程序里面好像没有限制数值 include<reg52.h> define uchar unsigned char define uint unsigned int sbit KEY = P3^4; //独立按键的T0 uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7...
  • 51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示
    答:1、首先,要把代码写好,点亮数码管。2、代码写完后,要确认原先写好的代码是不是正确的。3、确认代码无误后,进入下一步,就是在这一行代码(箭头所指)的地方,将这四个字删去。4、然后如图所示,四个字已经删去,只要改成数字相应的代码即可。5、这里改成的是代表数字0的代码,如图所示。6、最...
  • 51单片机用4个按键,每个按键被按下都会使数码管显示一个数值
    答:5. [问答题] [技能题画10配线图写出程序]按下按钮S1,数码管显示1;按下按钮S2,数码管显示2;按下按钮S3,数码管显示3;按下按钮S4,数码管显示4;能互相直接切换。按下停止按钮后,数码管熄灭。。
  • 如何让单片机按下键时数码管显示的值和点阵屏显示一致的数字_百度知 ...
    答:1、定义数码管和点阵屏的接口。2、定义按键和数码管、点阵屏驱动的接口。3、编写按键按下的处理函数。4、编写数码管和点阵屏驱动的函数。5、在主程序中调用按键按下的处理函数和数码管、点阵屏驱动的函数。
  • 51单片机中如何按下按键时数码管正常显示而不闪烁,并且实现长按连续
    答:k=1;//按键1短按 } } i=0;while(!KEY2)//如果按键2按下 { xianshi(neirong);//执行显示 delay_ms(1);//延时 i++;//每次i自加1 if(i>=1000){ k=21;//按键2长按 } else { k=2;//按键2短按 } } i=0;//在下一个按键按下之前清空i的值 while(!KEY3)//如果按键3按...
  • 单片机中数码管无论数码管显示多少,按键按下时数码管就显示零程序怎么写...
    答:1、写个按键扫描程序:监视某个IO口的电平(如按键按下IO口低电平),延时消抖,确认按键按下。2、写个数码管显示子程序 3、在主程序中调用按键扫描了程序,确认按键按下后调用数码管显示程序把“0”送显即可
  • 单片机程序求修改,实现按键控制数码管0-9,急!!!
    答:/*实现定时器1方式1定时1S使得数码管加1显示功能*/ if(key3==0) { delay(7);if(key3==0) { flag = ~flag;while(key3==0);} } } void T1_ini(){ TMOD=0X10;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET1=1;TR1=1;} void timer1() interrupt 3 { a++;...
  • 51单片机,怎样改以下程序可以实现按一下只输入一个数?请高手赐教。_百 ...
    答:while(KEY!=0x0f)//按键按下一直执行次循环 { X=KEY;//保存行扫描时有键按下的状态 KEY=0xf0;//列扫描 Y=KEY;//保存列扫描有键按下的状态 Z=X|Y;//取出键值 } } for(j=0;j<=15;j++)//按键释放之后开始查值送显 { if(Z==key_code[j])//查表得键值 { k=j;dis[5]...
  • ...控制数码管数字加减,为什么在按下独立按键的时候会出现闪烁?怎么回 ...
    答:因为你按键的时候影响了数码管刷新;数码管一般都是动态扫描的,利用人眼的视觉暂留做的,你按下按键的时候,肯定有延时消抖,延时的时候就影响了数码管显示,所以数码管刷新的慢了,人眼就能分辨出来亮和灭的状态...解决办法 1、改进按键扫描 2、改进数码管显示 3、用嵌入式系统 以上三选一即可解决 ...
  • 用单片机汇编语言怎样实现按下一个按键,数码管上显示出按下的具体时间...
    答:显示具体时间??你是说当时的时间??我知道如何让一个按键按下,显示你按的是几号键,ORG 0000H LOOP: LCALL L1 MOV DPTR,#WORDTAB MOVC A,@A+DPTR MOV P0,A LCALL DELAY SJMP LOOP L1: MOV R3,#0FEH MOV R1,#00H L2: MOV A,R3 MOV P1,A MOV A,P1 SWAP A MOV R...