定时器中断控制的独立式键盘扫描实验
实验四-键盘与中断 参考程序

1、基本要求:在mini80E单片机实验板上实现教材【例4.1.1】对应的功能。
画出电路原理图、编写程序、在实验板上实现。
【例4.1.1】用数码管前两位显示一个十进制数,变化范围为00~59,开始时显示00,每按下S2(key1)键一次,数值加1;每按下S3(key2)键一次,数值减1;每按下S4(key3)键一次,数值归零;按下S5(key4)键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5(key4)键,数值停止加1,保持显示原数。
(P82)说明:实验室的实验板与教材上程序对应的硬件电路稍有区别,程序要做少许修改。
主要是修改按键和显示器对应的接口定义。
请对下面程序中注释部分标有“删除或修改”的地方删除或修改,修改原理见实验报告或QQ群中mini80e实验板的原理图。
#include <reg52.h> //52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit key1=P3^4; //S1,删除或修改sbit key2=P3^5; //S2,删除或修改sbit key3=P3^6; //S3,删除或修改sbit key4=P3^7; //S4,删除或修改sbit dula=P2^6; //删除或修改sbit wela=P2^7; //删除或修改uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//0-90x77,0x7c,0x39,0x5e,0x79,0x71}; //A-Fvoid delayms(uint); //延时ms函数uchar numt0,num; //numt0-对T0定时计数,num-变化的数(0-59)void display(uchar numdis) //显示子函数(电路原理见P58){uchar shi,ge; //局部变量,存放要显示的十位、个位数shi=numdis/10; //分离两个分别要显示的数ge=numdis%10;dula=1; //删除或修改P0=table[shi]; //保留dula=0; //删除或修改P0=0xff; //删除或修改wela=1; //删除或修改P0=0xfe; //修改wela=0; //删除或修改delayms(5); //延时保证亮度(实际延时1-2ms即可)dula=1; //删除或修改P0=table[ge]; //保留dula=0; //删除或修改P0=0xff; //删除或修改wela=1; //删除或修改P0=0xfd; //修改wela=0; //删除或修改delayms(5);}//以下程序不变void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}void init() //初始化函数{TMOD=0x01; //设置T0方式1定时TH0=(65536-45872)/256; //装初值定时50msTL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //开T0中断}void keyscan() //键处理函数{if(key1==0) // key1按下否?{delayms(10); //延时10ms消抖if(key1==0) //再判别是否按下{num++; //如果key1按下,num加1if(num==60)//当到60时重新归0num=0;while(!key1); //等待按键释放}}if(key2==0) // key2按下否?{delayms(10);if(key2==0){if(num==0)//当到0时重新归60num=60;num--;while(!key2);}}if(key3==0) // key3按下否?{delayms(10);if(key3==0){num=0; //清0while(!key3);}}if(key4==0)// key4按下否?{delayms(10);if(key4==0){while(!key4);TR0=~TR0; //启动或停止定时器0}}}void main() //主函数{init(); //初始化while(1) //循环执行程序(注意不要把初始化包括在内){keyscan(); //按键识别与处理display(num); //刷新显示}}void T0_time() interrupt 1 //T0定时50ms中断服务函数{TH0=(65536-45872)/256;//重装初值TL0=(65536-45872)%256;numt0++; //对50ms计数if(numt0==20) //如果到了20次,说明1秒时间到{numt0=0; //然后把num清0重新再计20次num++; //1秒到num加1if(num==60)num=0;}}2、创新要求:在mini80E 单片机实验板上实现时钟显示与设置。
实验五 键盘扫描实验 实验报告

键盘扫描实验实验报告一、实验目的1. 掌握线反转法键盘扫描原理。
2. 了解单片机的输入和输出过程,理解单片机的数据采集过程。
二、实验内容单片机外接4x4键盘,通过线反转法判断按下的键,并在数码管上显示按键对应的数字。
第一行从左到右分别是开关K0, K1, K2, K3,第二行从左到右分别是K4, K5, K6, K7以此类推。
当按下Kn时,在数码管上显示数字n。
三、实验原理线翻转法:先对行(R0-R3)置0,对列(R4-R7)置1。
当有键被按下时,会把按键所在的列的电位从1变0,记录下位置;然后再将行列翻转,记录下按下键的所在行,两数进行或运算,就可以得到一个唯一表示按下键的数字。
例如:假定R0-R7分别与单片机的P2.0-P2.7相连。
先把R4-R7置1,R0-R3置0(通过指令MOV P2, #0F0H实现)。
当键K5被按下时,R5电位被拉低为低电平。
此时,P2口表示的数为:1101 0000(0xD0);然后再置R4-R7为0,R0-R3为1,此时,R1电位被拉低为低电平,此时,P2口表示的数为:0000 1101(0x0D)。
将两数相与取反,得到:0010 0010。
四、实验过程1. 连接好单片机及其外围设备电路2. 编写汇编程序ORG LJMP KeyLJMP K7: CJNE R2, #82H, K8ORG 0100H MOV P0, #0F8H Init: CLR P1.3 LJMP KeyMOV P0, #0C0H K8: CJNE R2, #14H, K9 Key: MOV P2, #0F0H MOV P0, #080HMOV A, P2 LJMP KeyMOV R1, A K9: CJNE R2, #24H, K10MOV P2, #0FH MOV P0, #090HMOV A, P2 LJMP KeyORL A, R1 K10: CJNE R2, #44H, K11CPL A MOV P0, #088HMOV R2, A LJMP KeyJNZ KeyPro K11: CJNE R2, #84H, K12LJMP Key MOV P0, #083H KeyPro: CJNE R2, #11H, K1 LJMP KeyMOV P0, #0C0H K12: CJNE R2, #18H, K13LJMP Key MOV P0, #0C6H K1: CJNE R2, #21H, K2 LJMP KeyMOV P0, #0F9H K13: CJNE R2, #28H, K14LJMP Key MOV P0, #0A1H K2: CJNE R2, #41H, K3 LJMP KeyMOV P0, #0A4H K14: CJNE R2, #48H, K15LJMP Key MOV P0, #086H K3: CJNE R2, #81H, K4 LJMP KeyMOV P0, #0B0H K15: CJNE R2, #88H, K16LJMP Key MOV P0, #08EH K4: CJNE R2, #12H, K5 LJMP KeyMOV P0, #099H K16: LJMP KeyLJMP Key ENDK5: CJNE R2, #22H, K6MOV P0, #092HLJMP KeyK6: CJNE R2, #42H, K7MOV P0, #082H五、实验结果1. 当按下开关Kn时,数码管能够显示对应的数字。
实验八 键盘扫描实验

实验八键盘扫描实验一、实验目的1. 掌握中断键盘扫描编程方法。
2. 掌握LED动态显示方法。
二、实验原理及实验内容1. 实验原理无论是单片机控制系统还是单片机测量系统,都需要一个人机对话装置,这种人机对话装置通常采用键盘和显示器。
键盘是单片机应用系统中人机对话常用的输入装置,而显示器是单片机应用系统人机对话中的常用输出装置。
键盘是由若干个按键开关组成,键的多少根据单片机应用系统的用途而定。
键盘由许多键组成,而每个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。
单片机接收到按键的触点信号后作相应的功能处理。
因此对于单片机系统来说键盘接口信号是输入信号。
单片机的键盘接口分为独立式和矩阵式。
独立式键盘的每个按键都有一个信号线与单片机电路相连,所有按键有一个公共地或公共正端,每个键相互独立互不影响。
如图7-7所示,当按下键1时,无论其它键是否按下,键1的信号线就由1变0;当松开键1时,无论其它键是否按下,键1的信号线就由0变1。
矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处,每当一个按键按下时通过该键将相应的行、列母线连通。
若在行、列母线中把行母线逐行置0(一种扫描方式),那么列母线就用来作信号输入线。
矩阵式键盘原理图如图7-8所示。
图7-7 独立式按键原理图图7-8 矩阵式按键原理图针对以上两大类键盘工作方式,单片机又有三种键盘扫描方式:查询方式;定时扫描方式和中断扫描方式。
查询方式是指在程序中用一段专门的扫描和读按键程序不停查询有无按键按下,确定键值。
这种方式电路简单,但需要占用单片机的机器时间。
定时扫描方式是指利用单片机内的定时器来产生定时中断,然后在定时中断的服务程序中扫描,检查有无按键按下,确定键值。
这种方式的电路也比较简单,不占用单片机的机器时间,但需要占用一个定时器,同时定时的时间不能过长,否则可能检测不到相应得按键。
中断扫描方式是指当有键按下时由相应的硬件电路产生中断信号,单片机在中断服务程序中扫描,检查有无按键按下,确定键值。
51单片机独立按键实验

实验5 单片机独立按键控制数码管加1我们在使用家用电器时经常需要通过按键给电器输入指令,让电器执行动作,比如电磁炉的开关,电饭煲定时时间设定等。
我们知道单片机只能识别高低电平,对51单片机来说,0V为低,5V为高。
按键就相当于一个开关,按下时候导通,按键弹开时断开。
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。
其抖动过程如图1(a)所示,抖动时间的长短与开关的机械特性有关,一般为5 ~10 ms。
从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。
即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。
为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。
一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。
(本学习板采用软件去抖方式)。
软件去抖的流程图如图1(b)所示。
从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等待一段时间(可调用一个5ms~10ms的延迟子程序),然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。
键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。
8个独立按键电路图从图中可知独立式按键采用每个按键单独占用一根I/O 口线结构。
当按下和释放按键时,输入到单片机I/O 端口的电平是不一样的,因此可以根据不同端口电平的变化判断是否有按键按下以及是哪一个按键按下。
按键和单片机引脚连接并加了上拉电阻,这样当没有按键按下的时候,I/O 输入的电平是高电平,当有按键按下的时候,I/O 输入的电平是低电平。
虽然独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O 口线,因此,在按键较多时,I/O 口线浪费较大。
外部中断实现按键识别实验

外部中断实现按键识别实验一、实验目的:1、掌握中断系统相关知识2、掌握外部中断应用方法二、实验内容及原理三、实验主要仪器设备安装有keil软件的计算机四、实验步骤功能描述:程序运行后背光灯亮,按下左键背光灯灭,按下右键背光灯亮,按键是通过外部中断实现的。
(1)设置相应的时钟打开 PA 、PB 端口时钟,并且打开复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ GPIOC|RCC_APB2Periph_AFIO,ENABLE)(2)设置好相应的中断设置 NVIC,在 STM32 的固件库中有一个结构体NVIC_InitTypeDef,里面有相应的标志位设置,然后再用 NVIC_Init()函数进行初始化。
详细代码如下:由于有 2 个中断,需要有 2 个 bit 来指定抢占优先级,所以选择第 2 组。
EXTI14,EXTI15 选择的中断通道是 EXTI15_10_IRQn,NVIC 相关的库函数在 stm32f10x_nivc.c 中,需要将此文件复制并添加到工程中。
(3)IO 口初始化连接外部中断的引脚需要设置为输入状态代码如下(4)把相应的 IO 口设置为中断线路代码如下(5)创建中断响应函数添加到 stm32f10x_it.c 这个文件中6、创建主函数//例程名称:按键实现外部中断五、思考题:1、什么是中断?什么是“挂起”?什么是 NVIC?2、中断的处理过程是什么?包含哪几个步骤?3、什么是中断服务函数?如何确定中断函数的名称?在哪里编写中断服务程序?4、中断初始化包含哪些步骤?5、中断编程有哪三步曲?六、实验心得与讨论。
单个按键中断实验报告

一、实验目的1. 熟悉单片机中断系统的工作原理和中断响应过程。
2. 掌握使用外部中断实现单个按键控制的实验方法。
3. 学习通过编程设置中断源、中断优先级和中断服务程序。
二、实验原理单片机的中断系统允许CPU在执行程序的过程中,暂停当前程序的执行,转而处理由外部事件引起的中断请求。
在本实验中,我们使用外部中断0(INT0)来实现单个按键的控制。
当按键按下时,通过外部中断0引脚(P3.2)向CPU发送中断请求。
CPU响应中断后,暂停当前程序的执行,转而执行外部中断0的中断服务程序(ISR)。
在中断服务程序中,我们可以根据按键的状态来执行相应的操作,例如点亮或熄灭LED灯。
三、实验设备1. 单片机开发板(如STC89C52)2. 按键3. LED灯4. 连接线5. 仿真软件(如Keil uVision)四、实验步骤1. 硬件连接:- 将按键的一个引脚连接到单片机的P3.2引脚(外部中断0)。
- 将按键的另一个引脚连接到地(GND)。
- 将LED灯的正极连接到单片机的P1.0引脚,负极连接到地(GND)。
2. 编写程序:- 使用Keil uVision软件编写程序。
- 初始化外部中断0,设置中断优先级和中断服务程序。
- 编写中断服务程序,根据按键状态控制LED灯的亮灭。
3. 编译程序:- 使用Keil uVision软件编译程序,生成可执行文件。
4. 下载程序:- 将编译好的程序下载到单片机开发板上。
5. 运行程序:- 观察按键按下时LED灯的亮灭状态,验证中断功能是否正常。
五、实验代码```c#include <reg52.h>#define LED P1_0#define BUTTON P3_2void main(void) {EA = 1; // 开启总中断EX0 = 1; // 开启外部中断0IT0 = 1; // 设置外部中断0为下降沿触发while (1) {// 主循环,等待中断}}void ext0_isr(void) interrupt 0 {LED = !LED; // 切换LED灯状态}```六、实验结果与分析1. 实验结果:- 按键按下时,LED灯亮;按键释放时,LED灯灭。
单片机实验--键盘扫描

实验4 键盘实验一、实验目的:1.掌握8255A编程原理。
2.了解键盘电路的工作原理。
3.掌握键盘接口电路的编程方法。
二、实验设备:CPU挂箱、8031CPU模块三、实验原理:1.识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如所读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
本实验例程采用的是行反转法。
行反转法识别键闭合时,要将行线接一并行口,先让它工作于输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口往各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上的输入值,那么,在闭合键所在的行线上的值必定为0。
这样,当一个键被按下时,必定可以读得一对唯一的行线值和列线值。
2.程序设计时,要学会灵活地对8255A的各端口进行方式设置。
3.程序设计时,可将各键对应的键值(行线值、列线值)放在一个表中,将要显示的0~F字符放在另一个表中,通过查表来确定按下的是哪一个键并正确显示出来。
实验题目利用实验箱上的8255A可编程并行接口芯片和矩阵键盘,编写程序,做到在键盘上每按一个数字键(0~F),用发光二极管将该代码显示出来。
四、实验步骤:将键盘RL10~RL17接8255A的PB0~PB7;KA10~KA12接8255A的PA0~PA2;PC0~PC7接发光二极管的L1~L8;8255A芯片的片选信号8255CS接CS0。
五、实验电路:六、程序框图7.程序清单八、附:8251/8255扩展模块该模块由8251可编程串行口电路和8255可编程并行口电路两部分组成,其电源、数据总线、地址总线和片选信号均由接口挂箱上的接口插座提供。
一、8251可编程串行口电路(1)8251可编程串行接口芯片引脚及功能8251A是通用同步/异步收发器USART,适合作异步起止式数据格式和同步面向字符数据格式的接口,其功能很强。
用单片机中断来扫描键盘的程序

用单片机中断来扫描键盘的程序用单片机中断来扫描键盘的程序/*程序效果:用51单片机的中断来扫描键盘,按下按键,蜂鸣器响,数码管有相应的键值显示,按下E键继电器关,按下C键继电器开。
这与上一程序的功能相同,比上一程序简洁但理解相对困难些。
开发设计:/*/#include<reg52.h> //头文件#include<intrins.h>#define uchar unsigned char //宏定义#define uint unsigned intsbit jdq=P3^5; //位声明,驱动继电器管脚sbit fmq=P3^4; //位声明,驱动蜂鸣器管脚code uchar table[]={0x3f,0x06,0x5b,//数码管显示的数值0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};code uchar key_tab[17]={ //此数组为键盘编码0xed,0x7e,0x7d,0x7b, // 0,1,2,3,0xbe,0xbd,0xbb,0xde, // 4,5,6,7,0xdd,0xdb,0x77,0xb7, // 8,9,a, b,0xee,0xeb,0xd7,0xe7,0xff}; // c,d,e,f,uchar l_key=0x00; //定义变量,存放键值uchar l_keyold=0xff; //作为按键放开否的凭证void readkey(); //扫描键盘,获取键值void display(uchar *lp,uchar lc); //显示子函数void delay(); //延时子函数void main() //主函数{EA=1; //打开总中断EX0=1; //打开外部中断P0=0xf0; //键值高4位为高电平,低4位为低电平while(1){display(&l_key,1); //调用显示子函数if(l_key==14) //是否按下E键,是则关闭继电器jdq=1;if(l_key==12) //是否按下C键,是则打开继电器jdq=0;}}void key_scan() interrupt 0//外部中断0,0的优先级最高{EX0=0; //在读键盘时,关闭外部中断,防止干扰带来的多次中断TMOD&=0xf1; //设置定时器为工作方式1TH0=0x2e; //设置初值,为12毫秒,十进制值为11776TL0=0x00;ET0=1; //开启定时器中断0TR0=1; //启动定时器计数}void time0() interrupt 1 //定时器0的中断函数{TR0=0; //关闭定时器0readkey(); //定时12ms后产生中断,调用此函数,读取键值}void readkey() //扫描键盘子函数{uchar i,j,key; //定义局部变量j=0xfe; //设定初值key=0xff;for(i=0;i<4;i++) // 逐列扫描键盘{P0=j;if((P0&0xf0)!=0xf0) //有按键按下,高4位不可能全为1 {key=P0; //读取P0口的值,推出循环,否则循环下次break;}j=_crol_(j,1); //此函数的功能是:左移循环}if(key==0xff) //如果读取不到P0口的值,如干扰,则返回{l_keyold=0xff;P0=0xf0; // 恢复P0口的值,等待按键按下fmq=1;EX0=1; //在返回前,打开外部中断return;}fmq=0; //有按键按下,打开蜂鸣器if(l_keyold==key) // 检查按键放开否,如果相等表明没有放开{TH0=0x2e; //设置初值TL0=0x00;TR0=1; //继续启动定时器,检查按键放开否return;}TH0=0x2e;TL0=0;TR0=1; //启动定时器l_keyold=key; //获取键值,作为放开否的凭证for(i=0;i<17;i++) //查表获得相应的16进制值存放到l_key中{if(key==key_tab[i]){l_key=i;break;}}//程序运行到此,就表明有键值存放到l_key中,主程序//就可以检测键盘值并作相应的处理}void display(uchar *lp,uchar lc) //显示子函数{uchar i; //定义局部变量P1=0xf8; //点亮第一个数码管P2=0; //P2口为输出值for(i=0;i<lc;i++) //循环显示{P2=table[lp[i]]; //查表获得相应的要显示的数字的数码段delay(); //延时P2=0; //清零,准备显示下一个数值}}void delay() //延时子函数{_nop_();_nop_();_nop_();_nop_();_nop_();}如果程序无法编译,请删除所有前导空白.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数功能:反向流水点亮 LED
**************************************************/
void backward(void)
{
P3=0x7f;
//第八个灯亮
led_delay();
P3=0xbf;
//第七个灯亮
led_delay();
P3=0xdf;
//第六个灯亮
void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
/*************************************************
函数功能:正向流水点亮 LED
**************************************************/
TL0=(65536-1000)%256; //定时器 T0 赋初值
keyval=0;
//按键值初始化为 0,什么也不做
while(1)
{
switch(keyval)
{
case 1:forward();
break;
case 2:backward();
break;
case 3:stop();
break;
//定时器中断控制的独立式键盘扫描实验 #include<reg51.h> //包含 51 单片机寄存器定义的头文件
sbit S1=P1^4;
//将 S1 位定义为 P1.4 引脚
sbit S2=P1^5;
//将 S2 位定义为 P1.5 引脚
sbit S3=P1^6;
//将 S3 位定义为 P1.6 引脚
{
if((P1&0xf0)!=0xf0)
//第一次检测到有键按下
{
delay20ms(); if(S1==0) keyval=1; if(S2==0) keyval=2; if(S3==0) keyval=3; if(S4==0) keyval=4;
} TH0=(65536-1000)/256; TL0=(65536-1000)%256; }
sbit S4=P1^7;
//将 S4 位定义为 P1.7 引脚
unsigned char keyval; //储存按键值
/*************************************************
函数功能:流水灯延时
**************************************************/
P3=0xff; led_delay(); P3=0x00; led_delay(); }
//关闭 8 个 LED //点亮 8 个 LED
/*************************************************
函数功能:主函数
**************************************************/
//延时 20ms 再去检测 //按键 S1 被按下
//按键 S2 被按下
//按键 S3 被按下
//按键 S4 被按下
case 4: flash();
break;
}
} }
/*************************************************
函数功能:定时器 T0 的中断服务子程序
**************************************************/
void Time0_serve(void) interrupt 1 using 1
void main(void) //主函数
{
TMOD=0x01; EA=1; ET0=1; TR0=1;
//使用定时器 T0 的模式 1 //开总中断 //定时器 T0 中断允许 //启动定时器 T0
TH0=(65536-1000)/256; 请求
//定时器 T0 赋初值,每计数 200 次(217 微秒)发送一次中断
P3=0xdf;
//第六个灯亮
led_delay();
P3=0xbf;
//第七个灯亮
led_delay();
P3=0Байду номын сангаас7f;
//第八个灯亮
led_delay();
P3=0xff;
P3=0xfe;
//第一个灯亮
led_delay();
}
/*************************************************
void forward(void)
{
P3=0xfe;
//第一个灯亮
led_delay();
P3=0xfd;
//第二个灯亮
led_delay();
P3=0xfb;
//第三个灯亮
led_delay();
P3=0xf7;
//第四个灯亮
led_delay();
P3=0xef;
//第五个灯亮
led_delay();
P3=0xff; //关闭 8 个 LED } /************************************************* 函数功能:闪烁点亮 LED **************************************************/ void flash(void) {
led_delay();
P3=0xef;
//第五个灯亮
led_delay();
P3=0xf7;
//第四个灯亮
led_delay();
P3=0xfb;
//第三个灯亮
led_delay();
P3=0xfd;
//第二个灯亮
led_delay();
P3=0xfe;
//第一个灯亮
led_delay();
} /************************************************* 函数功能:关闭所有 LED **************************************************/ void stop(void) {
void led_delay(void)
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
/*************************************************
函数功能:软件消抖延时
**************************************************/