怎么让单片机独立按键1个键位显示两个数码管

供稿:hz-xin.com     日期:2025-01-14
单片机可以实现一个独立按键控制数码管多个数字吗?

一个按键控制4个数码管显示4个数,最简单的方法是按一次键计一个数,最大数是9999,即可显示四位数。再简单点,按一次键开始自动计数,最大数还是9999,再按一次键停止计数。这样控制程序好写。长按和短按对于初学者有点难,当然了,要能写出程序来是最好啦。

#include
void Js_Scan(void);
void delay(int x);

sbit key=P2^2;

int code LED_Num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管扫描数组,共阴极
//int code LED_Num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极
int i=0,flag=0;

void main()
{
if(key==0&&flag==0)
{
i++;
flag=1;
}
if(key==1&&flag==1)
{
flag=0;
}
Js_Scan();
}
void Js_Scan() //数码管扫描函数
{
uchar j; //定义j数据类型
for(j=0;j<5;j++) //建立循环
{
P1=0x00;P0=LED_Num[i];delay(1); //扫描显示秒表小数位,点不显示,稍作延时
}
}
void delay(int x) //延时函数,防止数码管显示不稳定
{
int k;
while(x--)
for(k=0;k<125;k++);
}

你把显示1,2的程序放在按键识别过程中,只能是在按键的时候才显示,一旦松开按键就停在显示2了。就算是这个目的,你的程序也要修改才行,否则,就是你说的现象。把源程序发上来,帮你改,这截图没法改,不能照截图现敲代码吧。

让单片机独立按键1个键位显示两个数码管,你这个程序是不行的,从程序看,数码管显然是动态的,这样的数码管需要不断地扫描,才能依靠视觉暂留原理正常显示出来,否则只能正常显示最后一个送出的段码,如你程序这样。

// 单片机、数码管、按键,多个单片机,按键相互控制,可以参考。

#include <reg52.h>  // 主机

#define uchar unsigned char

#include <stdio.h> 

unsigned char* c;   

sbit  k0=P3^2;

sbit  k1=P3^3;  

sbit  k2=P3^4; 

sbit  k3=P3^5; 

sbit  k4=P3^7; 

sbit  led1=P1^7;

uchar  k;

bit  y0,y1,y2,y3,y4,y5;     

bit  t,s,ld;

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};

void SendOneChar(char c)  //发送字节到PC

{

TI=0;

SBUF = c;

while(!TI);

TI=0;

void SendString(char *st)  //发送字符串到PC

{

while(*st)

{

SendOneChar(*st++);

}

void main()

{

SCON = 0x50;    //SCON: mode 1, 8-bit UART, enable rcvr

TMOD = 0x20;    //TMOD: timer 1, mode 2, 8-bit reload

PCON = 0x80;     // 数据位8、停止位1。效验位无 (11.0592M) 

TH1 = 0xF4;     //TH1:  reload value for 2400@11.0592MHz

TR1 = 1;        //启动定时器1

ES = 1;         //允许串口中断位

EA = 1;         //允许总中断位

c=0;

s=1;

k=0;

P1 =~table[k];

while(1)

{

if(k0==0 && y0==0)

{

y0=1; 

c = "as";

SendString(c);              //发送字符串

}

if(k0==1 ) { y0=0; }

if(k1==0 && y1==0) 

{

y1=1; 

c = "bs";

SendString(c);              //发送字符串

}

if(k1==1 ) { y1=0; }

if(k2==0 && y2==0)

{

y2=1; 

c = "ds";

SendString(c);              //发送字符串

}

if(k2==1 ) { y2=0; }

if(k3==0 && y3==0) 

{

y3=1; 

c = "es";

SendString(c);              //发送字符串

}

if(k3==1 ) { y3=0; }

if(k4==0 && y4==0)

{

y4=1; 

c = "fs";

SendString(c);              //发送字符串

}

if(k4==1 ) { y4=0; }

//  for(i = 0; i < 4000; i++);  //延迟一小段时间

}

void chuankou(void) interrupt 4

{

if(RI==1)

{

RI = 0;

if(t==1)

{

if(SBUF=='z') { k++;ld=~ld; }

s=1; t=0;

if(k==10) { k=0;}

P1 =~table[k];

led1=ld;

}

if(SBUF=='a' && s==1) { t=1;s=0;}

}

}

*********************************************************

#include <reg51.h> // 分机1、分机2、---

#define uchar unsigned char

unsigned char* c; 

sbit   led1=P3^2;     //  接收 az  , P.2 输出低电平, P3.3  输出高电平。

sbit   led2=P3^3;     //  接收 aa  , P.2 输出高电平, P3.3   输出低电平。

sbit   k0=P3^5;

bit  y0,t,s;

uchar  k;

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};

void SendOneChar(char c)  //发送字节到PC

{

TI=0;

SBUF = c;

while(!TI);

TI=0;

void SendString(char *st)  //发送字符串到PC

{

while(*st)

{

SendOneChar(*st++);

}

void main (void)

{

SCON = 0x50;     // REN=1允许串行接受状态,串口工作模式1  

TMOD = 0x21;     // 定时器工作方式2  

PCON = 0x80;     // 数据位8、停止位1。效验位无 (11.0592M)  

TH1 = 0xF4;      // TH1 = 0xFD; 波特率 2400  

TH0=(65536-54253)/256;  // 50 mS

TL0=(65536-54253)%256;

TR1  = 1;  

ES   = 1;        // 开串口中断

EA   = 1;        // 开总中断

led1=1;led2=0;

//  ET0=1;

//  TR0=1;

s=1;

k=0;

P1 =~table[k];

while(1)

if(k0==0 && y0==0)

{

y0=1; 

c = "az";

SendString(c);              //发送字符串

}

if(k0==1 ) { y0=0; }

}

}

void chuankou(void) interrupt 4

{

if(RI==1)

{

RI = 0;

if(t==1)

{

if(SBUF=='s') {led1=~led1;led2=~led2; k++; }

//if(SBUF=='s') {led1=1;led2=0; k--; }

s=1; t=0;

if(k==10) { k=0;}

if(k==255) { k=9; }

P1 =~table[k];

}

if(SBUF=='a' && s==1) { t=1;s=0;}

}

}

void T0_time()interrupt 1

{

TH0=(65536-54253)/256;  // 50 mS

TL0=(65536-54253)%256;

k++;

if(k==10)  // 这里修改时间

{

k=0;

led1=1;

led2=1;

}

}



看不懂你的要求,从代码上看。最後只有samgduan[2],一直停留

怎么让单片机独立按键1个键位显示两个数码管
你把显示1,2的程序放在按键识别过程中,只能是在按键的时候才显示,一旦松开按键就停在显示2了。就算是这个目的,你的程序也要修改才行,否则,就是你说的现象。把源程序发上来,帮你改,这截图没法改,不能照截图现敲代码吧。

...修改单片机C语言程序:0~59秒计数器;1个独立按键控制,2个数码管显 ...
while(1){ while(!KEY){ delay(10);if(KEY){ flag++;{ if(flag==1)TR0=0;if(flag==2){ TR0=1;aa=0;num=0;num1=0;flag=0;TR0=1;} } } } if(aa==20){ aa=0;num++;if(num==10){ num=0;num1++;} if(num1==6)num1=0;P0=table[num1];P2=table[num];} } ...

51单片机用4个按键,每个按键被按下都会使数码管显示一个数值
5. [问答题] [技能题画10配线图写出程序]按下按钮S1,数码管显示1;按下按钮S2,数码管显示2;按下按钮S3,数码管显示3;按下按钮S4,数码管显示4;能互相直接切换。按下停止按钮后,数码管熄灭。。

stm32用一个按键控制两位数码管从00-99,代码怎么写
按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2 接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)\/\/ include<reg52.h> sbit P0_0=P0^0; \/\/个位数字 sbit P0_1=P0^1; \/\/十位数字 void delay(int k); \/\/Tab为数码管显示值,...

51单片机为什么要先按独立按键才能正常工作
51(开发板)中的数码管一次只能显示一位数,属于硬件限制,不能同时显示两位。在数码管上显示多位数只能靠高频率的刷新显示,在视觉上显示多位。所以可以定义一个变量i,按键i自加,然后用循环显示,循环次数为i。根据提供的函数,表明你的板子LED是共阳极连接的,即LED阳极接到一起,每个LED阴极接IO...

单片机可以实现一个独立按键控制数码管多个数字吗?
一个按键控制4个数码管显示4个数,最简单的方法是按一次键计一个数,最大数是9999,即可显示四位数。再简单点,按一次键开始自动计数,最大数还是9999,再按一次键停止计数。这样控制程序好写。长按和短按对于初学者有点难,当然了,要能写出程序来是最好啦。

单片机 怎样用两个独立按键控制一位数码管显示,就是按下其中一个按键...
MAIN;JB P3.0 ,S1 MOV A, AA INC A MOV AA,A S1:JB P3.1 ,MAIN MOV A, AA DEC A MOV AA,A JMP MAIN C语言的 if(P3^0==0){ delay(50);if(P3^0==1){ aa++;if(aa>=10)aa=0;}} if(P3^1==0){ delay(50);if(P3^1==0){ aa++;if(aa<=0)aa=...

51单片机怎样实现不同独立按键按下出现不同情况
实现该功能的操作步骤参考如下:1、先将每个独立按键连接到51单片机的不同输入引脚上,并通过下拉电阻将其拉低。2、在程序中,使用循环或定时器中断的方式不断读取每个按键的引脚状态。当某个按键被按下时,其对应的引脚电平会变为高电平。3、根据读取到的按键引脚状态,执行相应的操作。例如,如果按键A...

单片机上用两个按键独立控制两个数码管,怎样使在按下一个按键使对应的...
给你个思路,在while循环里要实时刷新数码管显示,按键的判断放在定时器里,设一个变量,当按键按下时累加定时器中断次数,然后在主函数里判断变量值,超过一定数量则判断为按下,这时数码管计数变量++,当然你还要设按键抬起标志,仔细思考一下,肯定能写出来 ...

关于单片机独立按键切换数码管显示不同数字
否则就闪一下,他不像液晶能够自动保持。比如你显示某个数值,输出0x3E,程序执行到这条指令时,就动态显示,如果想保持显示,就要在一定时间内再输出这条指令,一定时间就是要数码管的余晖没有消失之前。或者把数码管改为静态显示,如果单片机IO口足够多,可以数码管的每个位都连接到单片机的IO口。