在上述代码中,我们首先将P1口设置为全灭状态,然后使用一个循环将P1口设置为全亮状态,并延时1秒钟。接着,我们将P1口设置为全灭状态,并再次延时1秒钟。这样,LED灯就会一亮一灭间隔1秒。需要注意的是,上述代码中的

基于正点原子mini板的程序设计在STM32F103实验一:点亮LED灯的基础下(已经建立好led.h和led.c文件),添加头文件key.h和源文件key.c到HARDWARE文件夹下。STM32系列专为要求高性能、低成本、低功耗的嵌入式应用设计的ARM

你程序写的有问题,一开始按钮拿那两个端口要是高电平,二极管那2个按钮要是低电平。按下按钮,接地变成低电平,给二极管高电平导通。

void Delay(unsigned int x){ unsigned int i, j;for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);} //KEY1按一下LED1亮 再按一下LED1灭 //KEY2按下LED2亮 LED1灭 main(){ while(1)

我不知道为什么中文复制之后这里变乱码了,所以截图作为参照,代码附在后面:include "sys.h"#include "usart.h"#include "delay.h"#include "led.h" #include "key.h" //°´¼ü´¦À

2:led2=!led2;delay_ms(200);break;default:break;} void 在这里按键获取函数(void){ key=获取到的值;//没有按键按下的话是进入不到这里 } } }

stm32单片机用两个按键控制led, 按键1 控制从灭到亮,按键2控制从亮到暗,但是一直按着按键

1、首先安装ST官方串口下载软件,Flash_Loader_Demonstrator_v0_Setup.exe用交叉串口线连接开发板和电脑,BOOT0选择为1,BOOT1选择为0,接上开发板电源,SW1切换到ON打开电源开关。2、编译hex或bin,在官网下载免费烧录工具

只在上面那条指令采集了一次按键数据。等到执行到 while(!ReadValue);//等待按键被放开 这条指令时 数据仍然是上次采集到的那个值代表按键按下,(!ReadValue)这个值永远成立,所以无法代表按键断开。所以程序一直卡死在这条

1.准备材料:您需要准备以下材料:单片机(如Arduino、STM32等)LED灯 电阻(用于限流,防止LED过电流损坏)连接线 2.连接电路:将LED灯与单片机连接起来。一般情况下,将LED的正极连接到单片机的一个GPIO引脚,将LED的负极连

main如果没有while(1),程序执行完后就不知道跑到哪里了,不能这么干

求一段 电脑用串口调试工具向STM32发送数据控制LED灯 的STM32 程序

2)当发送“off”时,显然字符数不够,就无法得到 flag=1;主程序就不会去执行相应的语句,灯也就熄不了;3)建议你采用固定格式:“open xx”,“off 0000”都有7个字符,也可以是发送结束符;

buff[cont++]=SBUF;//储存一个字节 } else { if(strcmp(buff,"hello",5))//比较字符串 如果收到的为'hello'长度5个字节 { LED=0;//低电平驱动LED SendOneByte('O');//发送OK SendOneByte('K');} cont=

是因为led灯控制磨决芯片处于虚接状态,将led灯控制磨决芯片重新焊接一下,就可以解决此问题。原因是声控开关是串联在整个电路中的,而不是单独供电。当这个和led灯串在一起的时候,由于led内部有恒流电源,不像普通灯那样

你就先开第一个灯(设为1),然后延时1秒,然后关闭第一个灯(设为0),然后延时1秒。然后开第二个灯(第二个灯设为1),然后延时2秒,然后关闭第二个灯(第二个灯设为0),然后延时2秒啊

然后你可以在主程序里面用 switchcase语句,这样你就可以通过发不同的数据,控制不同的LED灯状态了

我想通过串口通信发送1的时候第一个LED灯亮,第二个LED灯灭,第三个LED等闪烁三十次 这个程序哪里错了啊?

时钟电路用来产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。通过在芯片的外部XTAL1和XTAL2两个引脚跨接晶体振荡器和微调电容,形成反

第8脚GND,电源地。第15脚VCC,电源正极第1~3脚A、B、C,二进制输入脚。第4~6脚片选信号控制,只有在4、5脚为“0”6脚为“1”时,才会被选通,输出受A、B、C信号控制。其它任何组合方式将不被选通,且Y0~Y7输出全为“1”。

答:STM32F103VET6管脚有GPIOA-F ,EXTI6可以分别对应到管脚A-F的 Pin6引脚上。你需要在软件里自己配置,管脚的复用,以及中断线路的配置。RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_

和发光二极管的接法有关,二极管阴极端连单片机,输出低电平0就会点亮,0xfe对应的引脚信号为11111110,其中的0就是输出给第一个发光二极管阴极端的低电平信号。其他的灯对应的输出低电平编码信号同样点亮。例如:假设单片机的P0

5、使用HDMI线进行连接。准备一条HDMI线,一头插入电脑的HDMI输出接口,另一头插入LED电视机的HDMI输入接口。启动电视机和电脑,按电视机遥控器的信号源键,弹出信号源菜单后,选择HDMI模式,按确认键进行切换。6、准备一条H

从图片看,板上的H1应该是烧录接口端,只要用四根杜邦线与烧录器连接就OK,其中最主要的是要把烧录器串口通讯线与单片机相应引脚交叉连接,GND和电源对应连接就行。

1. I = 输入,O = 输出,S = 电源, HiZ = 高阻 2. FT:容忍5V 3. 有些功能仅在部分型号芯片中支持。4. PC13,PC14和PC15引脚通过电源开关进行供电,而这个电源开关只能够吸收有限的电流(3mA)。因此这三个

如何用stm32f103cvet6的一个引脚输出01信号点亮外接led

用两个定时器分别对两个LED灯闪烁,KEY1和KEY2要设置为外部中断输入,当进入中断时KEY1_DANG或KEY2_DANG指向下一个档位,并且发送串口。给你提供点思路。void main(){ while(1){ if(key1_dang==0x01)中断定时1设置

修改成下面这样试试:RS485_USART2_TXCTRL;for (i = 0; i < length; i++){ while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);USART_SendData(USART2, buffer[i]);} while (USART_GetFlagStatus

每接收到一个字节就把它保存到数组,通过时间间隔来检测一帧数据是否发完,用定时器即可,在串口中断里 复位定时初值,当超过定时时间没有接收到数据,则会触发定时中断,这时单片机就可以处理接收到的数据了

pc通过串口和单片机交换数据,从而控制LED灯。 pc程序用labview 调用Visa 进行串口通讯。单片机接受到串口命令后控制I/O口的高低电平实现led灯亮灭控制。用串口调试助手就行,网上到处可以下载。也好用。关键问题是在电脑上发

4.上传程序:将编写好的程序上传到单片机中。将单片机通过USB线连接到计算机,选择正确的开发板和端口,然后点击上传按钮将程序烧录到单片机中。5.测试控制:完成上传后,单片机将开始执行程序。LED灯应该会按照程序中定义的亮灭

首先你的stm32得有一个串口,stm32的软件得支持这个串口驱动,这样pc通过串口发送到你的stm32的串口,数据被驱动缓存到stm32系统的内存中,然后写lcd驱动把数据打印到lcd上,如果你的stm32系统上是某种os的话就好办了,stm

STM32PC向串口发送数据0x01,控制led闪烁

单片机(microcontroller)可以通过控制其硬件输出接口来控制LED灯的亮灭。在使用单片机控制LED之前,需要对单片机的硬件进行接线和配置。首先,将LED的正极接入单片机的硬件输出口,将LED的负极接入单片机的地。然后,使用单片机编程

51单片机 多种格式串口控制LED源码: http://www.51hei.com/bbs/dpj-163182-1.html,适合新手

LED_D1 =1;//=1亮灯 ,=0灭灯当也要看电路,完善的电路还会有驱动电路如三极管点了,也要看LED固定的那端是接地还是接VCC。最终无非就是通过单片机的IO口输出一个0或1来是LED二极管电路正向导通形成发光。

在上述代码中,我们首先将P1口设置为全灭状态,然后使用一个循环将P1口设置为全亮状态,并延时1秒钟。接着,我们将P1口设置为全灭状态,并再次延时1秒钟。这样,LED灯就会一亮一灭间隔1秒。需要注意的是,上述代码中的延

pc通过串口和单片机交换数据,从而控制LED灯。 pc程序用labview 调用Visa 进行串口通讯。单片机接受到串口命令后控制I/O口的高低电平实现led灯亮灭控制。用串口调试助手就行,网上到处可以下载。也好用。关键问题是在电脑上发送

怎样使用单片机的串口控制LED灯亮灭

既然是初学者,这种问题最好自己解决,看STM32数据手册,上网找例程自己改,才能学到东西。 main函数里必须要有while(1)或者是你说的for(;;),因为如果没有的话,程序执行完后会跑飞的,出现各种莫名其妙的错误。 你main函数里除了初始化配置在while(1)前之外,所有的非中断程序都要在死循环里做。 main如果没有while(1),程序执行完后就不知道跑到哪里了,不能这么干
你先实现点亮LED和串口接收,然后写个状态机来处理接收到的数据
看下硬件电路,算下流过LED电流,确认硬件没问题。
GPIO_InitTypeDef GPIOInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE); GPIOInitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIOInitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOF, &GPIOInitStructure); //LD1亮 GPIO_ResetBits(GPIOF, GPIO_Pin_6); //LD1灭 GPIO_SetBits(GPIOF, GPIO_Pin_6); //LD2亮 GPIO_ResetBits(GPIOF, GPIO_Pin_7); //LD2灭 GPIO_SetBits(GPIOF, GPIO_Pin_7);
这个程序很容易实现,对时间响应也不是那么敏感,不用中端代码,只要用main循环就可以实现,代码主要分三部分,首先需要单片机初始化,设置好串口部分的波特率,通讯方式等,还要设置好LED灯的驱动端口为输出,根据你设计的电路设置好工作模式,如果直接驱动LED管可以用漏极输出方式;第二个函数以查询方式接收串口发来的数据并保存在变量中;第三个函数用来控制点亮指定的LED灯,这里用位运算就可以的。
LED点阵显示屏摘要 LED大屏幕显示系统,以AT89S52单片机为核心,由键盘显示、温度采集、串口通信、LED大屏幕显示等功能模块组成。本系统的灰阶控制功能由软件来实现,吸收了硬件软件化的思想,本系统不仅可以实现题目要求的基本功能,同时发挥部分也得到完全的实现,最主要的是LED显示屏的内容可以通过PC机进行实时修改,而且有一定的创新功能。关键字:单片机 LED大屏幕 滚屏显示 PC机控制1.任务设计并制作一台简易LED电子显示屏,16行*16列*16灰阶点阵显示,原理示意图如下:PC机LED灰阶电子显示屏原理框图2.要求 (1)基本要求:设计并制作LED电子显示屏和控制器。1) 自制一台简易16行*16列*16灰阶点阵显示的LED电子显示屏; 2) 自制显示屏控制器,扩展键盘和相应的接口实现多功能显示控制,显示屏显示16灰阶图像(可以是渐变灰阶条纹)、数字和字母亮度适中,应无闪烁。 3) 显示屏通过按键切换显示图像、数字和字母; 4) 显示屏能显示3组特定图像、数字或者英文字母组成的句子,通过按键切换显示内容; 5) 能显示2组特定汉字组成的句子,通过按键切换显示内容。(2)发挥部分:1) 自制一台简易16行*32列*灰阶点阵显示的LED电子显示屏;2) LED显示屏亮度连续可调。3) 实现信息的左右滚屏显示,预存信息的定时循环显示;4) 实现实时时间的显示,显示屏数字显示: 时∶分∶秒(例如 18∶38∶59);5) 增大到10组(每组汉字8个或16个数字和字符)预存信息,信息具有掉电保护; 6)实现和PC机通讯,通过PC机串口直接对显示信息进行更新(须做PC机客户程序); 7)其他发挥功能。3.说明 (1)显示格式和显示信息可以自定义。 (2)电子显示屏LED显示灯只允许使用8*8 LED点阵显示模块。 (3) 显示屏的显示控制方案和控制器的选择方案任选。 (4) 不允许使用LED集成驱动模块和集成灰阶产生模块,可用CPLD或FPGA。2、方案论证2.1 显示部分:显示部分是本次设计最核心的部分,对于LED8*8点阵显示有以下两种方案:方案一:静态显示,将一帧图像中的每一个二极管的状态分别用0 和1 表示,若为0 ,则表示L ED 无电流,即暗状态;若为1 则表示二极管被点亮。若给每一个发光二极管一个驱动电路,一幅画面输入以后,所有L ED 的状态保持到下一幅画。对于静态显示方式方式,所需的译码驱动装置很多,引线多而复杂,成本高,且可靠性也较低。方案二:动态显示,对一幅画面进行分割,对组成画面的各部分分别显示,是动态显示方式。动态显示方式方式,可以避免静态显示的问题。但设计上如果处理不当,易造成亮度低,闪烁问题。因此合理的设计既应保证驱动电路易实现,又要保证图像稳定,无闪烁。动态显示采用多路复用技术的动态扫描显示方式, 复用的程度不是无限增加的, 因为利用动态扫描显示使我们看到一幅稳定画面的实质是利用了人眼的暂留效应和发光二极管发光时间的长短, 发光的亮度等因素. 我们通过实验发现, 当扫描刷新频率(发光二极管的停闪频率) 为50Hz, 发光二极管导通时间≥1m s 时, 显示亮度较好, 无闪烁感.。鉴于上述原因, 我们采用方案二2.2.数字时钟数字时钟是本设计的重要的部分。根据需要,可利用两种方案实现。方案一:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。该方案具有硬件电路简单的特点,但当单片机不上电,程序将不执行。且由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。方案二:本方案采用Dallas公司的专用时钟芯片DS。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。基于时钟芯片的上述优点,本设计采用方案二完成数字时钟的功能。2.3 温度采集部分能进行温度测量是本设计的创新部分,由于现在用品追求多样化,多功能化,所以我们决定给系统加上温度测量显示模块,方便人们的生活,使该设计具有人性化。方案一:采用热敏电阻,可满足 40 摄氏度至 90 摄氏度测量范围,但热敏电阻精度、重复性、可靠性较差,对于检测小于 1 摄氏度的信号是不适用的。方案二:采用温度传感器DS18B20。DS18B20可以满足从-55摄氏度到+摄氏度测量范围,且DS18B20测量精度高,增值量为0.5摄氏度,在一秒内把温度转化成数字,测得的温度值的存储在两个八位的RAM中,单片机直接从中读出数据转换成十进制就是温度,使用方便。基于DS18b20的以上优点,我们决定选取DS18b20来测量温度。2.4 显示接口芯片的选择方案一:采取并口输入,占用大量I/O口资源方案二:选取串口输入,使用较少。所以我们选用串口输入。串口输入我们可以选用芯片有74HC、74LS、TPIC6B。但是74HC和74LS两种芯片必须加驱动才能驱动LED,而TI 公司的DMOS 器件TPIC6B , 除具有TTL 和CMOS 器件中移位寄存器 的逻辑功能外, 其最大的特点是驱动功率大, 可直接用作LED的驱动。综合以上比较,我们选取TPIC6B来驱动LED点阵。2.5 串口通讯芯片的选择AT89S52串行口采用的是TTL电平,因此必须的有电平转换电路,可以选择,,MAXA.方案一:采用或芯片实现电平转换,但在使用中发现这两种芯片可靠性不高,且需要正负12V电源,使用麻烦。方案二:采用单电源电平转换芯片MAXA可以使电路变得简单,可靠。基于以上分析,我们选用方案二,选用芯片MAXA2.6 电源模块方案一:采用干电池作为LED点阵系统的电源,由于点阵系统耗电量较大,使用干电池需经常换电池,不符合节约型社会的要求。点阵系统要悬挂在墙上,电池总量大,使用会有较大安全隐患。方案二:采用W/5V直流稳压电源作为系统电源,不仅功率上可以满足系统需要,不需要更换电源,并且比较轻便,使用更加安全可靠基于以上分析,我们决定采用方案二3、总体方案3.1 工作原理:利用单片机AT89S52单片机作为本系统的中控模块。单片机可把由DS18B20、DS读来的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、日历的显示。点阵LED电子显示屏显示器为主要的显示模块,把单片机传来的数据显示出来,并且可以实现滚动显示。在显示电路中,主要靠按键来实现各种显示要求的选择与切换。3.2 总体设计设计总体框图如图14、系统硬件设计(单元电路设计及分析)4.1 AT89S52单片机最小系统最小系统包括晶体振荡电路、复位开关和电源部分。图2为AT89S52单片机的最小系统。4.2 温度测量模块图3 DS18B20测量电路温度测量传感器采用DALLAS公司DS18B20的单总线数字化温度传感器,测温范围为-55℃~℃,可编程为9位~12位A/D转换精度,测温分辨率达到0.℃,采用寄生电源工作方式, CPU只需一根口线便能与DS18B20通信,占用CPU口线少,可节省大量引线和逻辑电路。接口电路如图3所示。4.3 时钟模块时钟模块采用DS芯片,DS 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式DS 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS 工作时功耗很低保持数据和时钟信息时功率小于1mW,其接线电路如图4图4 时钟电路4.4 键盘模块键盘、状态显示模块:为了使软件编程简单,本设计利用可编程芯片。接法如表1所示。PA口接按键,PC口则用于控制状态显示所用LED点阵。每个按键都通过一个10K的上拉电阻接电源+Vcc,按键的另一端接地。当有键按下时,与该键相连的PA口的相应位变为低电平,单片机检测到该变化后即转到相应的键处理程序,同时在程序中点亮LED点阵。模块电路如图54.5 LED显示模块点阵数据串行输入, 器件为 移位寄存器TPIC6B, 门控和扫描信号常以16 点阵为一行进行并行处理。在点阵显示中以4×8个L ED 点阵构成一个L ED 显示单元, 采用行共阳列共阴的编排方式。其驱动分为行列两部分, 分别来自于行、列移位寄存器, 行数据是扫描数据, 16 行中每次只有一行被驱动, 采用逐行扫描方式, 列数据则为汉字的点阵码。。对于字符和图形显示也可以用点阵处理, 其显示原理和方法相同.电路如图6图6 LED显示电路4.6灰阶控制4.6.1 阶灰度控制方法对于LED 发光灯, 灰度控制方法主要有驱动电流控制法和驱动脉冲占空比控制法。占空比控制法是在一定的显示重复扫描频率下, LED 器件的亮度可由发光时间Tu 与扫描周期T 的比Tu/T 进行控制。在相同的LED 正向电流作用下, Tu 越长发光能量越大, 只要周期性扫描的速度足够快的话, 人眼发觉不了1 个周期内不发光的部分, 只是感觉LED 的亮度更高。本设计采用占空比控制法。4.6.2 图像扫描方法在图像扫描显示过程中, 每次传输和显示的只是带有8 bit 灰度级的某一列数据的1 bit, 这样传输并显示8次, 就可以反映出8 bit 的灰度级。具体方法为:首先扫描显示16 行各列8 bit 灰度值的D0 比特, 其次扫描显示16行各列的D1比特, 依此类推, 直到显示16 行各列灰度值的D7 bit。各部分按顺序重复上述过程, 直到整屏扫描显示完, 对于16 行各列1 bit 的扫描细节过程为: 从第一行开始, 首先送这一行各列D0 位灰度值数据到各列移位寄存器锁存器, 然后, 送第2 行各列的D0 位数据, 同时显示第1 行数据。依次类推, 直到显示第16 行各列的D0位数据, 同时开始第1 行的D1 位数据。重复8 次扫描显示16 行。每比特扫描时间如下图2所示,整个扫描过程可以如图3所示。方案一、通过FPGA来实现灰阶控制, 是在FPGA 设计工具中利用译码器产生一系列OE 脉宽的具体电路图。E2…E10 来自计数器; H1, H2, H4, H8, H16, H32, H64, H,H 为译码器译出的不同脉宽的OE 信号源。H1为一个时钟周期, H2 为半个时钟周期, 以此类推,H 为1/ 个时钟周期[2]。这一系列脉冲需要进入数据选择器进行分时输出, 最终输出的只有OE一条线。表1 是OE 脉冲分配表。因为H1 最宽, H1 输出时LED 最亮, 所以在这里不是将H1连续输出, 而是分散开, 其目的是提高显示屏的扫描频率, 降低频闪, 使屏幕图像看上去更加稳定。方案二、通过单片机软件扫描来实现LED不同灰阶的现实,从而达到显示图像的效果。由于缺少FPGA的开发工具,所以采用方案二。4.7亮度连续可调控制方案一 通过在软件中调节刷新频率。刷新频率高的时候,连续点亮的时间短,显示屏亮度低,当刷新频率调低时,连续点亮的时间延长,显示屏变亮。因此通过调节占空比来实现显示屏亮度的调整。但是由于软件调节亮度变化不连续.不能实现连续的亮度调节。并且会出现闪烁。调节的效果不明显,故不采用此方案。方案二 通过调节电位器来改变电压,实现亮度的调节。调节电位器实现线形电压调整,从而控制三极管使显示屏压降发生改变。从而达到连续调节亮度的目的。电位器的调节范围较大,因此用此方法来调节。4.8电源选择W/5V的直流稳压电源更加安全,电路图如图7图7 电源电路4.9 PC机通讯4.9.1硬件连接设计MAX是标准的串口通信接口,对于一般的双向通讯,只需要使用串行输入口RXD(第3脚)、串行输出TXD(第2脚)和地线(第7脚)。MAX逻辑电平的规定如表2.图8 串口通讯4.9.2软件设计通过VC++在PC机上编写一个上位机软件实现对单片机的控制,实现LED显示内容和现实方式的控制。4.10整体电路系统整体电路如下:图9 整体电路5、系统软件设计5.1主程序5.2显示子程序流程5.3 显示时间子程序流程5.4 与PC串口通讯程序5.5温度测量流程图 想了解更加详细的技术参数的话百度搜硬之城去那里了解下,好过自己在这里瞎琢磨专业的地方解决专业的问题,这个都是很现实的。
首先声明: 这个事情我也碰到过!所以你必须给分,我也在任务~! 你用的是不是101型? 一般是因为指令超长,要注意这个型号的(我用的是101型)闪存只有128K,超长就溢出了···
能将问题说的再详细一点吗?STM32可以直接和PC通信啊!
#include sbit key1 = P1^0; sbit key2 = P1^1; sbit led1 = P1^2; sbit led2 = P1^3; void Delay(unsigned int x) { unsigned int i, j; for(i = 0; i < x; i++) for(j = 0; j <= 148; j++); } //KEY1按一下LED1亮 再按一下LED1灭 //KEY2按下LED2亮 LED1灭 main() { while(1) { if (!key2) { led1 = 1; led2 = 0;} else { if(!key1) { Delay(10); if(!key1) { while(!key1); led1 = ~led1; } } } } } //-------------------------------- #include sbit key1 = P1^0; sbit key2 = P1^1; sbit led1 = P1^2; sbit led2 = P1^3; void Delay(unsigned int x) { unsigned int i, j; for(i = 0; i < x; i++) for(j = 0; j <= 148; j++); } main() { while(1) { if(!key1) { Delay(10); if(!key1) { while(!key1); led1 = ~led1;//KEY1按一下LED1亮 再按一下LED1灭 } } if(!key2) { Delay(10); if(!key2) { while(!key2) led1 = 1; //按下KEY2时LED1灭 led2 = ~led2;//KEY2也是这样 } } } }
你的led1=~led1;这个语句没有循环,所以只会反转一次。要么加循环,要么再写一个闪烁函数。 void led_filcker(usigned char x) { while(x) { led1=~led1; x--: } } 如果你是想,按一下,松开也会闪烁,再按一下熄灭。你得定义一个变量来表示按键的按下。 #include #define uchar unsigned char bit stop=1; sbit k5=P1^4; void delay(uchar xms) { while(xms--); } void main() { if(k5==0) { delay(1000); if(k5==0) { while(k5==0) { if(stop) <<<<<<<<<<<<<<<此处执行你的语句 else stop=~stop: } } }}