这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下
MS: CPL P1.7 ; LED 慢 闪 MOV R7,#255 LCLL YS LL2: SETB P1.0 JB P1.0, MS KS: CPL P1.7 ; LED 快闪 MOV R7,#15 LCLL YS LL3: SETB
if(flag==3)flag=0;if(flag==0){正向流水} else if(flag==1){反向流水} else {间隔流水} }存在问题,由于流水灯执行时间较长,因此对按键响应缓慢,可以在流水灯之间加入按键检测语句,当检测到按键按下时,用break
以下是一个简单的51单片机程序,通过按下按键可以实现4种不同状态的灯亮灭,包括正闪、反闪、多种间隔闪。程序中使用了定时器来实现闪烁功能。程序中使用了P1.0到P1.3作为控制灯的引脚,P3.2作为按键的引脚。每当按下
51单片机1按键切换4种不同状态的灯的c程序??可以是正闪,反闪,多种间隔闪。
交替闪烁就是在循环中让两个LED端口交替高低电平。循环中加入延时。延时函数我用循环实现。题目没有要求精准延时,如精准需用中断。include
先设置一个位变量,表征现在是启动还是停止。再设置一个位变量,表征应该是LED1亮还是LED2亮。然后在检测到按键的同时,启动定时器,取反第一个变量,计时五秒后取反第二个变量。
ORG 00H LOOP:MOV P1.0,C CPL C ;标志取反 MOV P1.1,C ACALL DELAY ;调用延时子程序 JMP LOOP ;返回,继续 DELAY: ;延时子程序 MOV R7,#200 LP7:MOV R6,#200 LP6:MOV R5
if(led==2)//第二次按键按下 { led=0;//要给次数初始化 P2=0XFC;//1111 1101第二个灯亮 DELAY(500);//延时 while(BUTTON!=0)//等待按键放开 { P2=0xff;//1111 1111第二个灯灭 DELAY(500)//延时 }
while(1)if(k1==0){ d1=~d1;d2=~d2;delay(1000);} } 因为我偷懒的关系,程序有个小漏洞,延时函数的x和y应该定义成无符号数更合理
;P1.0 P1.1接2LED,P2.0接一按键。上电2LED不亮,按第1 次键2LED同时以1S周期闪烁,按第2 次 2LED轮流1S闪烁同此循环。;11 04 17 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 30H MAIN:MOV TMOD,#
51单片机汇编语言程序,一个按键控制两个发光二极管的同时闪烁,交替闪烁,
LED一端链接GND,另一端电压为高的时候就是有电压,就形成导通。LED就会亮起来。拿入门的51单片机来讲,1这端对应链接单片机的引脚的话如P1.0。就写代码给P1.0输出1就能亮起LED灯D1。sbit LED_D1= P1^0 ;LED_D
当松手时,KEY1 = 1,不满足if语句不 进入循环,LED继续保持当前状态即LED = 0,如果再次按下按键,此时检测到KEY1 = 0,进入循环,LED取反得到LED = 0,灯亮。*/ delay(500); /*此处延迟,保证连续两次按键
电平状态输出相应的信号来控制LED的亮灭。将按键与某个IO口相连。当按下按钮时,IO口会被拉低(变为低电平),未按下按钮时为高电平。在程序中通过循环检测IO口的状态,检测到低电平表示按钮被按下,可以执行相应操作。
按键按下就打控制灯的io取反就可以了。如:if(key1==1){while(key1==1); // 等待按键放开led1=~led1;} 使用四个独立按键控制四个LED灯亮灭的汇编程序怎么弄?单片机的P1.0-P1.3接四个发光二极管L1-L4的阴极
单片机按键控制LED灯亮灭程序怎么做到的?
void loop() { // 控制LED灯亮灭 digitalWrite(ledPin, HIGH); // 点亮LED delay(1000); // 延时1秒 digitalWrite(ledPin, LOW); // 熄灭LED delay(1000); // 延时1秒} 在上述示例程序中,我们将LED连接到Ardu
delay(1000); // wait for a second digitalWrite(13, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }
void LEDInit(void){ pinMode(PORT_LED1,OUTPUT);pinMode(PORT_LED2,OUTPUT);digitalWrite(PORT_LED1,LOW);digitalWrite(PORT_LED2,LOW);} // 任务:LED灯显示处理 void LEDTask(void){ switch(keyMode){ case KEY
arduino按钮控制led,按一次亮,再按灭//按一下亮,再按不亮 int ledpin=11;//灯接口 int anniupin=7;//按钮接口 boolean change=false; void setup() { Serial.begin(9600);//可以不用加 pinMode(ledpin,OUTPUT);//灯输出端
arduinoled灯按一下显示应该花样代码
方法有两种:设置一计数器:i,每按一次键,即调用显示程序,显示程序中用:i++;if(i=1){执行闪灯方式1;} elseif(i=2){执行闪灯方式2;} elseif(i=3){执行闪灯方式3;} elseif(i=4){执行闪灯方式n
RUN_MODE = 4; //初始状态为关 //light5 = 1; //高电平关灯 初始时本来就是1,所以省了,如果是0为关灯,则这行与上 light5 = 0;EA = 1; //开总中断 } void delay(uint ms){//毫秒级延时函数
用常用51单片机就可以实现。按键第1次,次数记录到寄存器里面,调用按键1的子程序 按键第2次,寄存器数据加1,再调用按键2的子程序 按键第3次,寄存器数据再加1,再调用按键3的子程序,再把寄存器数据清0,循坏就好。常用
case 1: delay(); readkey(); //慢速闪烁 case 2: delay(); readkey(); //中速闪烁 case 3: delay(); readkey(); led = ~led; //快速闪烁 } } }
MAIN: SETB LED ;LED 灭 LL1: JB KEY , LL1 ;等待按键第一次按下 LCALL YS ;延时去抖 JB KEY,LL1 ;按键第一次按下 则往下执行 LL12: MOV TMOD,#10H MOV
MAIN: SETB P1.7 ; LED 灭 LL1: SETB P1.0 JB P1.0, LL1 MS: CPL P1.7 ; LED 慢 闪 MOV R7,#255 LCLL YS LL2: SETB P1.0 JB P1.0, MS
单片机,一个按键控制LED三种状态,第一次按,慢闪;第二次按下,快闪;第三次按下,关闭,反复;
#include unsigned char n = 0; sbit key = P3^4; sbit led = P1^0; void delay() { unsigned int i, j; for(i = 0; i < 100; i++) for(j = 0; j < 500; j++); } void readkey(void) { unsigned char i, j; if(!key) { for(i = 0; i < 10; i++) for(j = 0; j < 120; j++); //延时消抖 if(!key) { while(!key); //等待按键释放 n++; n %= 4; //n = 0~3 } } } main() { while(1) { switch(n) { case 0: led = 1; readkey(); break; //熄灭 case 1: delay(); readkey(); //慢速闪烁 case 2: delay(); readkey(); //中速闪烁 case 3: delay(); readkey(); led = ~led; //快速闪烁 } } }参考程序 KEY BIT P1.0 LED BIT P1.7 ORG 0000H LJMP MAIN ORG 0100H MAIN: SETB LED ;LED 灭 LL1: JB KEY , LL1 ;等待按键第一次按下 LCALL YS ;延时去抖 JB KEY,LL1 ;按键第一次按下 则往下执行 LL12: MOV TMOD,#10H MOV TH1, # 00H ;送时间常数较小 定时时间长 MOV TL1, #1CH SETB TR1 LL13: JNB TF1, LL13 CLR TF1 CPL LED ;低频闪 LL2: JB KEY,LL12 ;判断按键第二次按下? LCALL YS ;延时去抖 JB KEY, LL12 ;按键第二次按下 则往下执行 LL22: MOV TMOD,#10H MOV TH1, # 2CH ;增大时间常数 MOV TL1, #0FCH LL23: JNB TF1, LL23 CLR TF1 CPL LED ;中频闪 LL3: JB KEY,LL22 ;判断按键第三次按下? LCALL YS ;延时去抖 JB KEY, LL22 ;按键第三次按下 则往下执行 LL32: MOV TMOD,#10H MOV TH1, # 0ACH ;继续增大时间常数 MOV TL1, #0FCH LL33: JNB TF1, LL33 CLR TF1 CPL LED ;高频闪 LL4: JB KEY,LL32 ;判断按键第四次按下? LCALL YS ;延时去抖 JB KEY, LL32 ;按键第四次按下 则停止闪 CLR TR1 ;停止计时 LJMP MAIN YS: MOV R7,#20 ;延时子程序 YY: MOV R6,#200 YL: DJNZ R6,YL DJNZ R7,YY RET 呵呵 按你的要求写的 给加分吗?
led应该是一个变量,是代表led灯 亮或者灭的一个变量。 当你按下开关后,s1==0,就执行 led=!led 这条语句。 led=!led 的意思就是取反的意思,即原来led灯亮的话 执行该条语句后就变成灭;原来灭的话 执行该条语句后 就变成亮。按键按下就打控制灯的io取反就可以了。如:if(key1==1){while(key1==1); // 等待按键放开led1=~led1;}
#include #define uint unsigned int sbit LED = P1^0; sbit KEY1 = P1^2; void delay(uint); void main(void) { LED = 1; //初始化LED熄灭 KEY1 = 1; //赋值KEY1高电平 while(1) { if(!KEY1) //检测到按键按下 { LED = ~LED; /*LED取反,此时LED = 0,灯亮。当松手时,KEY1 = 1,不满足if语句不 进入循环,LED继续保持当前状态即LED = 0,如果再次按下按键,此时检测到KEY1 = 0,进入循 环,LED取反得到LED = 0,灯亮。*/ delay(500); /*此处延迟,保证连续两次按键动作处在程序的延时过程中,不进行其他程序从而不会影响小灯。*/ } } } void delay(uint z) //延时函数 { uint x, y; for(x=85; x>0; x--) for(y=z; y>0; y--); } 可下载到单片机验证。
;间隔时间不计较精度 ORG 00H LOOP: MOV P1.0,C CPL C ;标志取反 MOV P1.1,C ACALL DELAY ;调用延时子程序 JMP LOOP ;返回,继续 DELAY: ;延时子程序 MOV R7,#200 LP7: MOV R6,#200 LP6: MOV R5,#200 DJNZ R5,$ DJNZ R6,LP6 DJNZ R7,LP7 RET
MAIN: MOV P1, #11111110B ; P1 口 点亮一个发光二极管 ACALL DELAY ; 调用延时子程序 MOV P1, #11111101B ; 从左向右移动 一位 ACALL DELAY MOV P1, #11111011B ACALL DELAY MOV P1, #11110111B ACALL DELAY MOV P1, #11101111B ACALL DELAY MOV P1, #11011111B ACALL DELAY MOV P1, #10111111B ACALL DELAY MOV P1, #01111111B ACALL DELAY JMP MAIN ; 转移 至 MAIN 循环 DELAY: MOV R5,#250 ; 延时子程序 6.000 M 晶振 约 0.5 秒 D1: MOV R6,#250 D2: DJNZ R6,$ DJNZ R5,D1 RET