1. 用51单片机用4个独立按键控制8个数码管的加减和
用4个独立按键控制8个数码管的加减和,你这是实物开发板吧,数码管电路中8个数码管的位控制端LED1~LED8接哪啦,还应该有位控电路的,估计是用一片74HC138(或74LS138)控制的,这位控未知,不能写程序。要求第三位数码管显示 + 号,这实现不了,数码管是无法显示 + 号的。
2. 51单片机汇编怎么用四个独立按键来控制流水灯的速度
不用中断一样的实现,而且可以有多少个按键就可以有多少种流水灯方式。你使用的键盘函数直接调用流水灯函数就可以。比如使用独立键盘,if(P1.1==0) light_water(); 然后:
void light_water()
{
num=1;
for(a=0;a<8;a++)
{
P1.1=num<<1;
delay(1000); //延时;
keyboard();//执行时又不停扫描键盘函数;
}
}
这样就会有一个LED从右往左移动8次;那么当第一次流水未完时,又调用第二个流水函数light_water1就能中断当前执行的流水函数又去执行第二个流水灯函数了。
3. 单片机2个端口控制4个按键怎样实现
单片机IO口如果识别更多的按键,简单的方法就是通过控制按键按下,识别电流的流向。这说可能不是很理解,下面就来介绍下,如下图按键识别电路:
欢迎评论交流,也欢迎大家关注我:单片机嵌入式爱好者。会有源源不断的干货分享,能真正快速帮大家解决实际工作中遇到的问题哦!
4. 51单片机用4个按键,每个按键被按下都会使数码管显示一个数值
5. [问答题] [技能题画10配线图写出程序]按下按钮S1,数码管显示1;按下按钮S2,数码管显示2;按下按钮S3,数码管显示3;按下按钮S4,数码管显示4;能互相直接切换。按下停止按钮后,数码管熄灭。。
5. 51单片机C语言程序4个独立按键实现对数码管数字显示的加减清零等
#include<reg52.h>
//P0是数码管。P1是LED.P2是按键
sbitKEY_OUT_1=P2^3;
sbitKEY_OUT_2=P2^2;
sbitKEY_OUT_3=P2^1;
sbitKEY_OUT_4=P2^0;
#defineucharunsignedchar
#defineulintunsignedlong
#defineFrequency10//定时器中断时间=f*T
#defineTime1//一个周期1ms
#defineTubeNumber6//数码管个数
#defineKeyLine4//矩阵按键行数
#defineKeyColumn4//矩阵按键列数
//数码管真值表
ucharcodeLED_Number[]={0x0C,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//ucharcodeLED_Alphabet[]={0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0x8C,0xC1,0x91,0x9C};
/*0~9
A~F(b、d为小写)HLPUyo*/
ucharLED_Buff[TubeNumber]={0xff,0xff,0xff,0xff,0xff,0xff};
/*数码管显示缓冲区,0xff确保初始时都不亮.
不可写成ucharcodeLED_Buff[]。code定义变量写入room,不可修改*/
//矩阵按键编号到标准盘码的映射表
ucharcodeKeyCodeMap[4][4]={
(0x31,0x32,0x33,0x26),//数字键1、数字键2、数字键3、向上键
(0x34,0x35,0x36,0x25),//数字键4、数字键5、数字键6、向左键
(0x37,0x38,0x39,0x28),//数字键7、数字键8、数字键9、向下键
(0x30,0x1B,0x0D,0x27)};//数字键0、ESC键、回车键、向右键
ucharStaFlag[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键是否稳定标志
voidStartTime0();
voidTubeDisplay(ulintsec);
ulintpow(x,y);
voidTubeScan();
voidKeyAction(ucharkeycode);
voidKeyDriver();
voidKeyScan();
voidmain()
{
P1=0x08;//使能U3,选择数码管。
StartTime0();
while(1)KeyDriver();
}
//定时器0启动函数
voidStartTime0()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
PT0=1;
/*定时器0优先中断控制位。
IP这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复值都是0,当我们把某一位设置为1的时候,这一位优先级就比其它位的优先级高了。
比如我们设置了PT0位为1后,当单片机在主循环或其他中断程序执行时,一旦TO发生中断,作为更高优先级,程序马上执行T0.若在T0程序执行时,
其他中断程序发生中断,仍执行TO直到T0中断结束后再执行其他程序。
*/
}
//中断服务函数
voidTo_time0()interrupt1using0
{
staticucharcnt;//记录TO中断次数
// staticulintsec;//记录经过秒速
//判断是否溢出
if(TF0==1)
{
TF0=0;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
}
if(cnt>=Frequency)
{
cnt=0;
//sec++;
// Tube_Display(sec);
TubeScan();
KeyScan();
}
}
//数码管显示函数
voidTubeDisplay(ulintnom)
{
ucharm=2;//小数部分位数
uchari;//传输索引
//秒速达到上限清零
if(nom>pow(10,TubeNumber-m))nom=0;
//分别传输小数部分和整数部分
for(i=0;i<m;i++)
LED_Buff[i]=LED_Number[nom/pow(10,i)%10];
for(i=0;i<(TubeNumber-m);i++)
LED_Buff[i+m]=LED_Number[nom/pow(10,i)%10];
//点亮小数点
LED_Buff[m]&=0x7f;
}
//平方运算函数
ulintpow(x,y)//x为底,为幂
{
ulintp,i=1;
//平方运算
for(i=1;i<=y;i++)
p*=x;
//输出结果
returnp;
}
//数码管动态函数
voidTubeScan()
{
staticuchari=0;//动态扫描索引
//关闭所有段选位,数码管消隐
P0=0xff;
//for(i=0;i<Tube_number;i++)
P1=(P1&0xf8)|i;//位选索引赋值到P1口低3位
P0=LED_Buff[i];//缓冲区中的索引位置数据传输到P0口
if(++i>=TubeNumber)i=0;//索引递增循环,遍历整个缓冲区
}
//矩阵按键动作函数
voidKeyAction(ucharkeycode)
{
staticulintresult;
ulintnom=0;
//输入数字0~9
if((keycode>=0x30)&&(keycode<=39))
{
nom=(nom*10)+(keycode-0x30);//十进制整体左移,新数进入各位
TubeDisplay(nom);
}
//输入方向键
if((keycode>=0x25)&&(keycode<=28))
switch(keycode)
{
case0x26:result+=nom;nom=0;TubeDisplay(result);
case0x28:result-=nom;nom=0;TubeDisplay(result);
case0x25:result=1;result*=nom;nom=0;TubeDisplay(result);
case0x27:result=1;result/=nom;nom=0;TubeDisplay(result);
}
elseif(keycode==0x0d)TubeDisplay(result);//输入回车键,输出最终结果
elseif(keycode==0x1b)//输入ESC键,清零
{
nom=result=0;
TubeDisplay(nom);
}
}
//矩阵按键驱动函数
voidKeyDriver()
{
ucharl,c;
staticucharbackup[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键值备份,保存前一次值
for(l=0;l<KeyLine;l++)
{
for(c=0;c<KeyColumn;c++)
{
if(backup[l][c]!=StaFlag[l][c])
{//检测按键动作
if(backup[l][c]==1)//按键按下时执行
KeyAction(KeyCodeMap[l][c]);//调用动作函数
backup[l][c]=StaFlag[l][c];//刷新前一次备份值
}
}
}
}
//矩阵按键扫描函数
voidKeyScan()
{
ucharl=0;//矩阵按键扫描输出索引
ucharc=0;//矩阵按键扫描列索引
ucharkeybuff[KeyLine][KeyColumn]={(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff),
(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff)};//矩阵按键扫描缓冲区
//将一行的四个按键移入缓冲区
for(l=0;l<KeyColumn;l++)
keybuff[l][c]=((0xfe|(P2>>(4+l))&0x01));
//按键消抖
for(l=0;l<KeyLine;l++)
{
if((keybuff[l][c]&0x0f)==0x00)//连续4次扫描都为0,判断4*4ms内都是按下状态,可认为按键已稳定按下
StaFlag[l][c]=0;
elseif((keybuff[l][c]&0x0f)==0x0f)//连续4次扫描都为1,判断4*4ms内都是弹起状态,可认为按键已稳定弹起
StaFlag[l][c]=1;
}
for(c=0;c<KeyColumn;c++)
{
switch(c)//根据索引,释放当前输出脚拉低下次的根据索引
{
case0:KEY_OUT_4=1;KEY_OUT_1=0;break;
case1:KEY_OUT_1=1;KEY_OUT_2=0;break;
case2:KEY_OUT_2=1;KEY_OUT_3=0;break;
case3:KEY_OUT_3=1;KEY_OUT_4=0;break;
default:break;
}
}
}
6. 用单片机实现2位静态数码管(共阳)控制,其中系统还包括4个独立按键(中断形式),
2位共阳数码管分别接在P0口和P口。难点是4个按键要采用中断方式,所以,4个按键不但接成独立式按键,还要用一个4输入与门得到一个中断请信号加到P3.2上,用INT0中断。右移,左移指定的位,用小数点显示。仿真图如下。