单片机 请问流水灯程序一个按键单次按下控制改变 P0.0到P0.7不断循环左(右)移方向
发布网友
发布时间:2022-05-18 01:33
我来回答
共3个回答
热心网友
时间:2023-10-03 06:21
我说一个可行的吧,但是不一定是最好的。
定义一个位变量 bit fangxiang=1 ; //1表示一个方向,0表示另一个方向。
用定时器自动控制灯移动。
主循环里面这样写
while(1)
{
检测P10按键;
如果有按键;
fangxiang=!方向;
}
定时器函数里这样写
{
if(方向==1)
{
右移;
}
else
{
左移;
}
}
这样主循环只检测按键,检测到之后改变方向值,定时器检测方向值,不同的方向值调用不同的移动函数。追问sbit KEY=P1^0
while(1)
{
if (KEY==1)
for(i=0;i<7;i++)
{
P2=_crol_(P2,1); //P2 的值向左循环移动
DelayMS(150);
}
if(KEY==0)
for(i=0;i<7;i++)
{
P2=_cror_(P2,1); //P2 的值向右循环移动
DelayMS(150);
}
}
请问怎么跳出里面的循环啊,我弄这个要一直按住才有用。
追答13735442 我q ,qq说吧,这里说不明白
热心网友
时间:2023-10-03 06:21
/*******************************************************************************************************/
#include <reg51.h>
sbit KK=P3^2;//按键
char AA[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯编码
int i;
char fe;
void YS(int hs);//延时函数
/*******************************************************************************************************/
void main()
{
fe=0;//初始化方向标识符
while(1)
{
P2=AA[i];//流水灯状态输出
YS(20); //延时,点亮时间设定
if(fe==0){i++; if(i>7){i=0;}}//根据 fe 的值,执行对应的方向
else{i--;if(i<0){i=7;} }
if(KK==0)//按键检测
{
YS(5);//延时去抖
if(KK==0){ fe=~fe; while(!KK); }//如果仍然被按下,方向标识符取反
}
}
}
/*******************************************************************************************************/
void YS( int hs)//延时函数
{
int hk;
for(;hs>0;hs--)
{ for(hk=500;hk>0;hk--); }// 10
}
/*******************************************************************************************************/
这个简单些,并通过实物测试通过
并附有注释,方便学习追问很好,但是请问能不能只用cror和crol函数循环移位,不用中断呢,要求是这么做的。
追答这个没使用任何函数,也没用任何中断
简单实用
如果非要使用cror和crol函数,那就根据这原理,改一下即可
/*******************************************************************************************************/
#include
#include
sbit KK=P3^2;//按键
int i;
char fe,ff;
void YS(int hs);//延时函数
/*******************************************************************************************************/
void main()
{
fe=0;//初始化方向标识符
ff=0xfe;
while(1)
{
P2=ff;//流水灯状态输出
YS(20); //延时,点亮时间设定
if(fe==0){ ff=_cror_(ff,1); }//根据 fe 的值,执行对应的方向
else{ ff=_crol_(ff,1); }
if(KK==0)//按键检测
{
YS(5);//延时去抖
if(KK==0){ fe=~fe; while(!KK); }//如果仍然被按下,方向标识符取反
}
}
}
/*******************************************************************************************************/
void YS( int hs)//延时函数
{
int hk;
for(;hs>0;hs--)
{ for(hk=500;hk>0;hk--); }// 10
}
/*******************************************************************************************************/
热心网友
时间:2023-10-03 06:22
#include <regx52.h>
#include <intrins.h>
char flag,i;
void delay_ms(char t)
{
char i;
while(t--)
{
for(i=0;i<120;i++);
}
}
void main(void)
{
P0=0xfe;
while(1)
{
if(flag)
_crol_(P0,1);
else
_cror_(P0,1);
if(P1_0==0)
{
delay_ms(10);
if(P1_0==0)
{
if(flag==0)
flag=1;
else
flag=0;
}
i++;
if(i>7)
i=0;
}
}
}追问仿真跑不起来啊,灯不亮。
追答#include
#include
char flag,i;
void delay_ms(char t)
{
char i;
while(t--)
{
for(i=0;i7)
i=0;
}
}
}
单片机 请问流水灯程序一个按键单次按下控制改变 P0.0到P0.7不断循环...
定义一个位变量 bit fangxiang=1 ; //1表示一个方向,0表示另一个方向。用定时器自动控制灯移动。主循环里面这样写 while(1){ 检测P10按键;如果有按键;fangxiang=!方向;} 定时器函数里这样写 { if(方向==1){ 右移;} else { 左移;} } 这样主循环只检测按键,检测到之后改变方向值...
单片机汇编程序:有八个小灯,要求依次点亮,时间间隔1s
RLC A ;左移流水灯(带进位的左移),即亮点向P0口的高位移动 DJNZ R2,LOOP MOV R2,#8 ;右移次数 LOOP1: RRC A ;右移流水灯 MOV P0,A LCALL DELAY DJNZ R2,LOOP1 LJMP START DELAY: MOV R5,#10 ;延时子程序,改变R5,R6,R7 的值,可以改变延时的时间,从而改变流水灯移动速度 D1: ...
求汇编语言程序:8个开关p0.0——p0.7分别控制8个灯p1.0——p1.7,
JB P0.0,LOOP1 ;第一个键没按转下一个 JNB P0.0,$ ;第一键按下则等抬起 CPL P1.0 ;第一个灯如果开始灭则点亮,开始亮则灭 LOOP1: ;以下与此类似,不做注释。JB P0.1,LOOP2 JNB P0.1,CPL P1.1 LOOP2:JB P0.2,LOOP3 JNB P0.2,CPL P1.2 LOOP3:JB P0....
51单片机可以自己做agv小车控制系统吗
AGV自动导引车除了循迹模式以外,还具有一个手动控制模式,这个模式就是用遥控按键或者手机app来控制导引车的前进后退左转右转和停止。 AGV自动导引车的系统,其基本电路组成是单片机及其最小系统,其最小系统包括复位电路和时钟脉冲晶振电路,其核心芯片单片机的型号为AT89C51的40个插件引脚的单片机,循迹功能的实现是由两个循...
单片机控制32盏灯循环显示
因此,本流水灯实际上就是一个带有8个发光二极管的单片机最小应用系统,即为由单片机8051、发光二极管和必要的软件组成的单个单片机系统。此系统利用单片机的P1.0-P1.7作为8段显示LED的段控码输入,当位控线输入高电平时对应的LED点亮。再利用单片机内部的定时器对每一个输出口的电平做时间控制,实现每...
本人新手求大神有关51单片机的问题
2 写两个子程序一个左移的,一个右移的,第一个子程序把P0.0-P0.7依次置0(中间要加延时),第二个程序把第一个的顺序反过来就行了,并且两个子程序都是无限循环的 3 把按键K1接入单片机的外部中断引脚,每次按下K1的时候产生外部中断 4 写外部中断服务程序,在程序中加一个标志位,第一次按K1的...
单片机汇编的一个问题
因为它是外部电路吗,INS只是影响你读入的值(MOV A,P0)如果你要完成这个简单的流水灯的话,建议你修改程序,比方说用一个数据存储单元来做变量,初始化为0x01,每循环一次对这个变量进行左移1位运算然后再赋值给P0,并且左移运算比你用乘2运算要方便的多,生成的代码也少。
怎么写一个开关开关开,就显示八个流水灯闪烁,开关关八个流水灯全灭的...
NEXT8: SETB P0.7 ;位-置1 接口0第7位,NEX8: SJMP START ;短转移到 START,END ;END 第二种:先说硬件连接 将8个灯接到P1口的8根线法 灯的排列为 1 2 3 4 5 6 7 8 分别对应 p1_0 p1_1 p1_2 P1_3 p1_7 p1_6 p1_5 P1_4 闪亮程序 unsigned char m;for(n=0;n<4;n...
51单片机如何控制超声波传感器 求C语言程序(一定要能用)100追加
51单片机如何控制超声波传感器 求C语言程序(一定要能用)100追加 50 型号是DYP-ME007VCC(DC5V)、Trig(发射端)、Echo(接收端)、Out(空)、GND(地)(1)采用IO触发测距,给8--15us的高电平信号即可;(2)模块自动发送8个40khz的方波,自动检测是否有信... 型号是DYP-ME007 VCC(DC5V)、Trig(发射端)、Echo(...
求STC89c52单片机用倒计时控制继电器开、合的C语言程序,晶振12.000_百...
EA=1;ET0=1;TR0=1;wei=1;P0=0x3f;wei=0;duan=1;P0=table[0];duan=0;P1=0x55;//点亮流水灯 while(1){ display();time_pro();if(k1==0) keyscan();//继电器开合控制加在此处:时间可以根据自己的需求任意定义 //例如:if(shi==17&&fen==21&&miao==52){ jidianqi=0;//0就...