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

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_();}如果程序无法编译,请删除所有前导空白.。
电子系统设计数字定时器实验报告

电子系统设计数字定时器实验报告学校:学院:城市轨道交通学院班级:通信工程组员:前言在电子技术飞速发展的今天,电子产品逐渐趋向人性化和智能化。
人们人们为了实现这一目的而引入了单片机。
单片机又称单片微型计算机,也称为微控制器,是微型计算机的一个重要分支,单片机是20世纪70年代中期发展起来的一种大规模集成电路芯片,是集CPU,RAM,ROM,I/O接口和中断系统于同一硅片上的器件。
单片机的诞生标志着计算机正式形成了通过计算机系统和嵌入式计算机系统两个分支。
目前单片机已渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
单片机已在广阔的计算机应用领域中表现得淋漓尽致电器因此,单片机已成为电子类工作者必须掌握的专业技术之一。
这次实验,我们组是以单片机为核心设计一个数字定时器。
在实验过程中,我们开始了解电系统设计的和基本理念,基本规则和基本流程;在不断完善设计的过程中,我们逐步丰富和巩固自己的理论知识,培养积极思考解决问题的习惯并充分地发挥自己动手实验操作的能力。
可以说这次实验将我们所学的《单片机原理与应用》以及《电子系统设计》两门课程进行了有机的结合。
通过解决实际问题,我们对原理有了更深刻的理解,对于应用有了更广泛的接触。
另外实验中我们学会使用Proteus和Keil两款软件进行单片机电路的仿真以及程序的编写及联调。
这些都为我们以后的课程设计乃至工作研究奠定了厚实的基础。
这次的实验中,我们以单片机实现计时和倒计时功能,由LED 显示剩余时间,显示格式为XX(分),精确到1分的整数倍。
虽然接触到的功能模块较多,包括接口模块、中断模块、存储模块、控制模块和显示模块等,但仍然只是单片机这门学问的皮毛,在以后的学习中我们还需要不断汲取知识,不断地将理论与实践结合。
本次实验有本小组4位组员共同完成,张强强负责,朱宇翔负责,吴易洲负责,肖伟健负责。
编者注目录第1部分实验概述1.1 设计要求……………………………………………………1.2 数字定时器系统的基本理论………………………………1.3 设计方案……………………………………………………1.4 硬件电路工作原理…………………………………………第2部分程序设计2.1 整体结构……………………………………………………2.2 资源分配……………………………………………………2.3 程序流程……………………………………………………2.4 程序编写……………………………………………………第3部分仿真验证3.1 Keil 与Proteus联调仿真…………………………………3.2 实物连接仿真………………………………………………第4部分实验总结4.1 问题分析……………………………………………………4.2 小结…………………………………………………………第1部分实验概述1.1实验要求1定时时间的设置范围为1~99min,开机上电后隐含值为10min。
LPC2138实验程序 中断 定时器 led 扫描 键盘

LPC2138实验程序(尾部附有电路图)①实现键盘1中断(1~9数字),数码管1显示按键数字,同时用7个LED显示数码管1的相应位,即每个LED对应数码管相应位(a~g)。
②实现按键1中断,7个LED实现流水灯;实现按键2中断,7个LED实现跑马灯。
③实现按键3中断,7个LED闪烁10次,延时采用定时器#include <LPC213X.H>#define uchar unsigned charint k=0; //定时器中断计数器uchar a=0; //LED闪烁函数标志void delay(int x) //普通延时函数{int i;for(;x>0;x--)for(i=10000;i>0;i--);}void ms(unsigned int x) //定时器中断延时函数{T0TCR = 0X01;while(k!=x);T0TCR = 0X00;T0TC = 0;T0PC = 0;k=0;}void LED_1() //流水灯函数{unsigned char i;for(i=0;i<7;i++){IO1SET = 1<<(i+16);delay(20);IO1CLR = 1<<(i+16);}}void LED_2() //跑马灯函数{unsigned char i;for(i=0;i<15;i++){if(i<7){IO1SET = 1<<(i+16);delay(20);IO1CLR = 1<<(i+16);}else{IO1SET = 1<<(29-i);delay(20);IO1CLR = 1<<(29-i);}}}void LED_3() //LED闪烁函数{unsigned char i;for(i=0;i<10;i++){IO1SET = 0x7F<<16;delay(20);IO1CLR = 0X7F<<16;delay(20);}}void display(uchar x) /*数码管显示函数x为显示的数字*/ {unsigned char table[10]={0x00, 0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};IO0SET = (table[x]<<25);IO1SET = (table[x]<<16);delay(20);IO0CLR = (table[x]<<25);IO1CLR = (table[x]<<16);}void key_w() //键盘按行低电平扫描函数{IO0SET = 0X7<<20;IO0CLR = 1<<20;delay(2);IO0SET = 1<<20;IO0CLR =1<<21;delay(2);IO0SET =1<<21;IO0CLR =1<<22;delay(2);IO0SET =1<<22;}unsigned char key_r() /*键盘按列读取扫描数值返回值为键盘对应数字*/ {int a=0,b;switch(IO0PIN&(7<<16)){case 0x00060000:b=1;break;case 0x00050000:b=2;break;case 0x00030000:b=3;break;default:break;}switch(IO0PIN&(7<<20)){case 0x00600000:a=1;break;case 0x00500000:a=2;break;case 0x00300000:a=3;break;default :break;}if(a!=0)a=(a-1)*3+b;else a=0;return(a);}void EINT0()__irq //外部中断0服务函数,对应矩阵键盘{unsigned char num;num=key_r();display(num);EXTINT = 0x0f;VICVectAddr=0;}void EINT1()__irq //外部中断1服务函数,对应流水灯{LED_1();VICVectAddr=0;}void EINT2()__irq //外部中断2服务函数,对应跑马灯{LED_2();EXTINT = 0x0f;VICVectAddr=0;}void EINT3()__irq //外部中断3服务函数,对应LED闪烁标志a=1 {a=1;EXTINT = 0x0f;VICVectAddr=0;}void time0()__irq //定时器服务函数,对应k++{k++;T0IR = 1;VICVectAddr = 0;}void init () //初始化函数,引脚功能设置{PINSEL0 = 0X000CC0CC;PINSEL1 = 0X0;IO0DIR = 0XFE700000;IO1DIR = 0X00FF0000;}void EXTinit (uchar x,uchar y) /*外部中断初始化设置x为中断触发方式,y为中端极性,x,y为两位HEX*/{EXTMODE = x;EXTPOLAR = y;}void TIMEinit() //定时器初始化(未给使能){T0TC = 0;T0PR = 0;T0PC = 0;T0MCR= 0x03;T0MR0= 1105920;}void VIC() //中断标志,优先级,指向函数设置{VICIntSelect&= (~(0xF<<14));VICIntSelect&= (~(0x1<<4));VICVectCntl1 = 0x20|14;VICVectAddr1 = (unsigned int)EINT0;VICVectCntl2 = 0x20|15;VICVectAddr2 = (unsigned int)EINT1;VICVectCntl3 = 0x20|16;VICVectAddr3 = (unsigned int)EINT2;VICVectCntl4 = 0x20|17;VICVectAddr4 = (unsigned int)EINT3;VICVectCntl0 = 0x20|4;VICVectAddr0 = (unsigned int)time0;EXTINT = 0x0f;VICIntEnable|= 0xF<<14;VICIntEnable|= 0x1<<4;}int main(void) //主函数{init();EXTinit(0x00,0x00);VIC();TIMEinit();while(1){key_w();if(a==1){LED_3();a=0;}}}。
实验五 键盘扫描

实验五键盘扫描实验一、实验目的:1、掌握Exynos 4412处理器与键盘扫描的电路原理。
2、掌握linux驱动对Exynos 4412 GPIO、外部中断的控制原理及使用方法。
二、实验设备:友善之臂4412开发板、学生自带笔记本、USB转串口线、电源、网线。
三、实验地点及时间地点:A2-303a时间:教学周第九周四、实验内容:1、在ARM开发板上面,在驱动程序中利用linux定义的GPIO X3口编写对应管脚中断控制程序,内核定时器及键盘扫描程序,并进行测试验证所学内容。
2、在ARM开发板上面,使用上面驱动程序,编写应用程序完成按下1-4键点亮4个对应LED灯;释放1-4键关闭4个对应LED灯,并进行测试验证。
五、实验原理:1、GPIO端口原理申请分配GPIO:if(gpio_request(EXYNOS4X12_GPM4(0), "LED")),通过查看该port 保存的记录标志是否为NULL来判断。
gpio_desc[ARCH_NR_GPIOS]数值记录了每个io pin的情况.配置GPIO用途:s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT);输出output电平/读取input电平-- gpio基本使用:比如输出一个高电平:gpio_set_value(EXYNOS4X12_GPM4(0), 1);或者是得到输入的值:gpio_get_value(EXYNOS4X12_GPM3(0))中断设置:irq = gpio_to_irq(buttons[i].gpio);err = request_irq(irq, button_interrupt, IRQ_TYPE_EDGE_BOTH,buttons[i].name, (void *)&buttons[i]);定时器的另外一种用法:setup_timer(&buttons[i].timer, tiny4412_buttons_timer,(unsigned long)&buttons[i]); //初始化定时器mod_timer(&bdata->timer, jiffies + msecs_to_jiffies(40)); //设置初值并启动2、键盘电路原理图从上述原理图可以清楚地看出,通过将若某个按键被按下GPX3[2]、GPX3[3]、GPX3[4]、GPX3[5]管脚的输入电平由高变低(按下)再由低变高(释放)就可以引起中断的发生。
中断动态扫描实验报告

一、实验目的1. 掌握中断技术在动态扫描显示中的应用。
2. 理解中断动态扫描的原理和实现方法。
3. 学会使用定时器中断实现动态扫描显示。
二、实验原理动态扫描显示是通过控制数码管的各个段,使数码管显示不同的数字或字符。
在动态扫描显示中,每个数码管只在极短的时间内点亮,人眼由于视觉暂留效应,会感觉到多个数码管同时显示。
本实验使用中断技术实现动态扫描显示,利用定时器中断来控制显示时间。
三、实验环境1. 硬件环境:51单片机实验板、数码管、74HC595驱动器、连接线等。
2. 软件环境:Keil uVision 5、IAR EWARM等C语言开发环境。
四、实验步骤1. 设计电路:连接数码管、74HC595驱动器与51单片机实验板,确保电路连接正确。
2. 编写程序:a. 初始化定时器T0,设置中断频率。
b. 编写中断服务程序,实现动态扫描显示。
c. 在主函数中调用显示函数,使数码管显示数字。
3. 调试程序:将程序烧录到单片机中,观察数码管显示效果。
五、实验结果与分析1. 实验结果:数码管动态显示数字0123456789,每隔一段时间切换显示数字。
2. 实验分析:a. 定时器T0中断实现动态扫描显示,通过设置定时器初值控制中断频率。
b. 中断服务程序负责切换数码管的显示内容,实现动态效果。
c. 通过调整定时器初值,可以改变动态扫描的速度。
六、实验总结1. 通过本次实验,掌握了中断技术在动态扫描显示中的应用。
2. 理解了中断动态扫描的原理和实现方法。
3. 学会了使用定时器中断实现动态扫描显示。
七、实验改进与展望1. 实验改进:在原有基础上,可以尝试使用其他中断源实现动态扫描显示,如外部中断、串口中断等。
2. 实验展望:可以将动态扫描显示应用于实际项目中,如电子钟、计数器等。
同时,可以尝试使用其他微控制器实现动态扫描显示,如ARM、AVR等。
键盘中断实验

南通大学实验报告院系:计算机科学与技术姓名:课程名称:接口技术成绩:学号:1213022013指导教师:李跃华同组实验者:实验日期:2014-5-7实验名称:键盘中断实验一.实验目的1.熟练运用CodeWarrior 嵌入式开发系统环境、C 语言、调试方式。
2.复习串行通信接口(SCI)的内容。
3.加强键盘中断基本原理及编程原理的理解。
4.理解“行扫描”法的原理并能进行键值识别和键值编码二.实验内容键盘的 c 语言编程:1)初始化,先按IO 口方式初始化,即定义列线为输入且上拉,行线为输出,然后依输入口的键盘功能初始化相应的寄存器。
2)定义键值表3)扫描一次,读取键值4)获得键盘定义值行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。
这样就可以确定是哪一行哪一列交点的键被按下。
2. 软件设计三 程序流程图四 编程1.内核定时器中断void tpm0_isr(void){static uint_32 TPMCounter = 0; //计时器uint_8 value; //键盘变量static uint_8 LEDindex=0; //位选口声明uint_8 LEDDataBuffer[4]; //LED 显示缓冲区uint_8 i; 主程序中构件初始化 在主函数里添加波特率 Tool 测试 在中断中加接受函数 按键值在pc 上显示//LED缓冲区赋值LEDDataBuffer[0]='0';LEDDataBuffer[1]='2';LEDDataBuffer[2]='3';LEDDataBuffer[3]='5';//LCD显示缓冲区,其中.表示按下的数字uint_8 kbv[32]="The keyboard you just input is .";if((TPM_SC_REG(TPM0_BASE_PTR) & TPM_SC_TOF_MASK) == TPM_SC_TOF_MASK){TPMCounter++;}BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_PTR)); //中断置标志位写1清0//处理LED部分LEDindex++; //位选位+1if (LEDindex>=4) LEDindex=0; //大于4位选口置0i=LEDchangeCode(LEDDataBuffer[LEDindex]-'0'); //转码LEDshow1(LEDindex,i); //显示LED if(TPMCounter>100){TPMCounter = 0;//键盘得到扫描值value = KBScanN(2);//扫描键值,存于value中if(KBDef(value) != 0xff) //发送键值{//修改.成为按键值kbv[31] = KBDef(value);//通过LCD显示出来LCDShow(kbv);uart_send_string(UART_2,kbv);//键盘发送信息}}}2.程序的入口int main(void){//1.声明主函数使用的局部变量uint_8 * g_DispalyInit;//2.关总中断enter_critical();//3.初始化底层模块uart_init (UART_1,BUSCLK, 9600); //串口1初始化, 总线时钟24000Khz,波特率9600LEDInit(); //LED初始化LCDInit(); //LCD初始化KBInit(); //键盘初始化tpm_init(TPM0,TPM_CLKSRC_PLL,1000); //初始化TPM模块,1ms中断一次//4.缓冲区赋值g_DispalyInit = (uint_8 *)"Wait Receiving..Soochow 2013.01.";//5.开中断tpm_enable_int(0);init_critical();//6.lcd显示初始字符LCDShow(g_DispalyInit);//======================================================= ====================for(;;){}//============================================ return 0;}四.实验小结在这次实验中主要让我们熟悉掌握gpio口通信的知识,在熟悉代码的前提下在主函数里初始化波特率何在中断函数里添加一个接收函数就可以。
实验3 键盘扫描及LED实验

//Default value=0x7ffffff
*/
*************************************************************************
#include "bspinit.h" void Bsp_Init(void) { Delay(100); ChangeClockDivider(1,1); ChangeMPllValue(0x5c,0x4,0x0); Port_Init(); Uart_Init(PCLK, 115200); //int_init(); } // 1:2:4 //Fin=12MHz FCLK=200MHz
19
************************************************************ /* Filename: key.h */ ************************************************************ #ifndef KEYINCLUDE #define KEYINCLUDE void keyinit(void); void keyscan(void); #endif /* KEYINCLUDE */ ************************************************************ /* Filename: key.c */ ************************************************************ #include "2410addr.h" #include "2410lib.h" #include "Def.h" #include "timer0.h" void keyinit(void) { rGPFCON=0x80a8; rGPFUP=0; pISR_TIMER0 } void keyscan(void) { U8 c=0,c1=0x0ff; c=(rGPFDAT&0x8e); switch(c) { case 0x8c: Uart_Printf("Press Key1\n"); Delay(50); loop1:
实验三 键盘扫描

实验三键盘扫描&8位7段码管显示实验一实验目的1.进一步熟悉用Quartus II开发SOPC的基本流程。
2.进一步掌握PIO外设的使用方法。
3.熟悉对PIO的更复杂的操作过程。
4.掌握驱动8位七段码管的方法。
二硬件需求1.EDA/SOPC实验箱一台。
三实验原理实验中要用到4×4键盘,系统需要完成4×4键盘的扫描,确定有键按下后需要获取其键值,根据预先存放的键值表,逐个进行对比,从而进行按键的识别,并将相应的按键值进行显示。
键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,首先输出4列中的第一列为低电平,其它列为高电平,然后读取行值;然后再输出4列中的第二列为低电平,读取行值,依此类推,不断循环。
系统在读取行值的时候会自动判断,如果读进来的行值全部为高电平,则说明没有按键按下,否则如果读进来的行值发现不全为高电平,则说明键盘整列中必定有至少一个按键按下,读取此时的行值和当前的列值,即可判断到当前的按键位置。
获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后在7段码管显示。
8位七段码管的显示是在程序中定时扫描显示的,为了使显示的过程简化,可以在程序中开辟8个存储区,用于存放8个七段码管对应值,然后每按下按键一次,则相应的值出现在最右边的七段码管上,原先的显示的值依次左移。
为了完成键盘的扫描和七段码管的正确显示,必须在原来CPU模块的基础上再加入一个定时器模块,用以产生周期性中断,在中断服务程序中完成键盘的扫描以及七段码管的扫描。
四实验内容本实验要完成的内容是设计一个CPU模块,该CPU需要加入一个定时器模块,用以产生周期性中断进行键盘扫描和七段码管的扫描显示。
实验要求能够在按下按键时获取其键值,然后在8个七段码管上正确显示按下的键值,每按键一次,原先显示的值整体左移,新的键值出现在8个七段码管的最右边。
实验二独立按键试验实验报告

实验二独立按键试验实验报告
一、实验目的
独立按键试验是为了验证按键与单片机的连接是否正常,并测试按键
功能是否正常,通过实验掌握按键接口的使用和按键的原理。
二、实验原理
在实际应用中,常常需要使用按键来实现硬件的控制。
按键的原理是:当按键关闭时,两个按键引脚之间短接,按键关闭。
当按键打开时,两个
按键引脚之间断开,按键打开。
三、实验仪器
1.单片机开发板
2.按键
3.面包板和杜邦线
4.电源线
四、实验步骤
1.将按键连接到单片机开发板上的按键接口,并接通电源。
2.编写程序,监测按键是否被按下,并通过串口输出按键的状态。
3.烧录程序到单片机,运行程序。
4.进行按键试验。
五、实验结果与分析
按下按键后,通过监测按键引脚的电平变化,可以判断按键是否被按下。
根据不同的按键连接方式,可能需要使用上拉电阻或下拉电阻来连接按键。
六、实验结论
通过独立按键试验,我们验证了按键与单片机的连接是否正确,并测试了按键的功能。
在实际应用中,可以根据需要使用按键来实现硬件的控制。
七、实验心得
通过本次实验,我掌握了按键接口的使用方法和按键的原理。
在实际应用中,按键是一个常用的控制元件,有了这次实验的经验,以后在使用按键时会更加得心应手。
中断实验报告

实验四中断实验一、实验目的1、掌握单片机系统中断的原理及使用方法。
2、理解键盘扫描和去抖动的原理。
3、掌握键盘扫描实现方法。
二、实验内容1、见图一。
假设单片机晶振频率设定为6MHz。
用中断方式来完成以下要求,且通过虚拟示波器观看波形。
A、使用定时器1 以方式0 产生周期为500us 的等宽方波连续脉冲,并由P1.0 输出。
ORG 0000HLJMP MAINORG 001BHLJMP IT1PORG 0100H MAIN: MOV SP,#60H MOV TMOD,#00H MOV TL1,#03H MOV TH1,#0FCH SETB TR1SETB ET1SETB EASJMP $IT1P: MOV TL1,#03H MOV TH1,#0FCH CPL P1.0RETIENDB、使用定时器0 以方式2 产生周期为200us 的等宽方波连续脉冲,并由P1.1 输出。
ORG 0000HLJMP MAINORG 000BHLJMP IT0PORG 0100H MAIN: MOV SP,#60H MOV TMOD,#02H MOV TL0,#0CEH MOV TH0,#0CEH SETB TR0SETB ET0SETB EASJMP $IT0P: CPL P1.1RETIENDC、编程使T0 工作于定时工作方式1,产生500us 等宽方波从P2.7 输出。
T1 工作于计数工作方式2,其计数外部脉冲由T0 产生,即P2.7 引脚与P3.5(T1 引脚)相连,T1 每计数100 个,P1.2 取反输出一次。
ORG 0000HLJMP MAIN ORG 000BH LJMP IT0P ORG 001BH LJMP IT1P ORG 0100H MAIN: MOV SP,#60H MOV TMOD,#61H MOV TL0,#83H MOV TH0,#0FFH MOV TL1,#9CHMOV TH1,#9CH SETB TR0SETB TR1MOV IE,#8AHCLR TF1SJMP $IT0P: MOV TL0,#83HMOV TH0,#0FFH CPL P2.7RETIIT1P: JB TF1,IT1PMOV TL1,#9CH CPL P1.2RETIENDD、编程使T0 工作于定时工作方式1,产生500us 等宽方波从P2.6 输出到P3.3(INT1脚),如图所示。
定时器中断检测按键wuxian - 副本

华北电力大学实验报告实验名称定时器中断检测按键课程名称嵌入式系统专业班级:电子1201 学生姓名:学号:成绩:指导教师:实验日期:实验 定时器中断检测按键一.实验目的熟悉 LPC17xx 系列 ARM7 微控制器的定时器 0/1 的基本设置及应用。
二.实验设备硬件:PC 机 一台、LPC1788开发板 一套软件:Windows98/XP/2000 系统,keil uV4 集成开发环境三.实验原理1、实验流程图:2、状态转换图0/01/01/0 0/1开始 系统及管脚初始化 定时器,LED 初始化 定时器中断 按键扫描 状态机转换 标志位为1,灯亮 标志位为0,灯不亮 结束 State-0 无按键 State-1 有按键 State-2确认按键按下 再次3、按键实验原理图4、LED原理图四.实验内容使用定时器0 实现 1 秒定时,控制LED灯闪烁。
采用软件查询方式等待定时时间到达。
五.实验步骤1. 启动keil uV4 ,使用工程模板建立一个工程TIMEKEY.C。
2. 在工程的user 中的main文件中编写实验程序。
3. 编译连接工程。
4. 选择【Project】->【Debug】,进行JTAG 仿真调试。
5. 可以全速运行程序,当按键检测到按下时,LED亮10ms,然后熄掉,然后当再次检测到按键按下时LED 亮10ms,然后熄掉,依次循环。
六.实验编写的程序#include "../LPC177x_8x/LPC177x_8x.h"#include "../LPC177x_8x/type.h"/******************宏定义******************/#define LED_INIT() LPC_GPIO3->DIR|=(1UL << 25) /* LED1初始化 */#define LED_OFF() LPC_GPIO3->SET|=(1UL << 25) /* LED1灭 */#define LED_ON() LPC_GPIO3->CLR |= (1UL << 25) /* LED1亮 *//******************************************************************************************* ******** 函数名称:timer0Init** 函数描述:定时器0初始化程序** 输入参数:无** 返回值:无******************************************************************************************** ***/void timer0Init (void){LPC_TIM0->TCR = 0x02;LPC_TIM0->IR = 1;LPC_TIM0->CTCR = 0;LPC_TIM0->TC = 0;LPC_TIM0->PR = 0;LPC_TIM0->MR0 = PeripheralClock/100; /*10mS中断1次 */LPC_TIM0->MCR = 0x03; /* 匹配后产生中断 */NVIC_EnableIRQ(TIMER0_IRQn); /* 设置中断并使能 */NVIC_SetPriority(TIMER0_IRQn, 3);LPC_TIM0->TCR = 0x01; /* 启动定时器 */}/******************************************************************************************* **************** 函数名称:GPIOInit** 函数描述:GPIO初始化** 输入参数:无** 返回值:无******************************************************************************************** *************/void GPIOInit( void ){LPC_GPIO0->DIR &= ~(1 << 12); /* 设置P0.12为输入按键1 */LPC_GPIO3->DIR |= 1 << 30; /* 设置P3.30为输出 */LPC_GPIO3->SET |= 1 << 30; /* 设置P3.30为高电平 */}/******************************************************************************************* ****** 函数名称:TIMER0_IRQHandler** 函数描述:TIMER0 中断处理函数** 输入参数:无** 返回值:无******************************************************************************************** *************/void TIMER0_IRQHandler (void){LPC_TIM0->IR = 0x01; /* 清除中断标志 */ flag=1;}Int m;void key1Scan(void) //按键扫描转态机转换{switch(m){case 0:if (!(LPC_GPIO0->PIN & 1 << 12))m=1;else m=0;break;case 1:if (!(LPC_GPIO0->PIN & 1 << 12))m=2;else m=0;break;case 2:m=0;LED_OFF();break;}int main ( ){SystemInit(); /* 系统初始化 */GPIOInit(); /* 管脚初始化 */timer0Init(); /* 定时器0初始化 */LED_INIT();while(1){if(flag==1){key1Scan();flag=0;}if(m==2)LED_ON();}}。
实验五:独立式键盘实验

实验五:独立式键盘实验4.5.1 实验目的1. 掌握单片机独立键盘接口设计方法。
2. 掌握单片机键盘扫描程序设计方法。
3. 掌握按键功能设计方法。
4. 掌握软件消除按键抖动方法。
4.5.2 实验预习1.熟悉Keil集成编译环境的使用方法。
2. 复习单片机C语言程序设计方法。
3. 复习独立键盘工作原理。
4. 复习按键去抖动方法。
4.5.3 实验原理实验板上提供4个独立按键,与单片机接口如图4.5.1所示,每个按键单独接单片机一个I/O接口。
只要将相应端口设为1,然后判断端口状态,如果仍为1,则按键处于断开(释放)状态,如果为0,则按键处于接通(闭合)状态。
图4.5.1 独立键盘电原理图4.5.4 预作实验任务1. 用Proteus仿真软件绘制独立键盘电路图,包括如图4.5.1所示键盘接口,单片机最小系统以及数码管动态显示电路。
2. 简述按键识别过程中如何等待按键释放。
3. 简述按键抖动对单片机系统工作性能的影响,并简介消除按键抖动的方法。
4. 编写按键识别函数,要求正确识别4个按键的状态,如果有按键按下则返回键值,从左到右四个键值分别为1~4。
并通过仿真或实验板验证(要求用软件的方法消除按键抖动)。
5.为实验板上4个按键设定不同的功能,在数码管上显示数字128,4个按键按下后分别对显示的数字做如下修改:key1:数字+1;key2:数字-1;key3:数字+10;key4:数字-10;流程图如图4.5.2所示,试设计完整程序(按键识别子程序KEYSCAN和动态显示子程序DISPLAY可直接调用这里省略)。
图4.5.2 按键功能设计流程图4.5.5 实验任务1.开机时数码管显示1002.按键key1一次数字加1,按键key2一次数字减1。
加到999时再加1归零,减到000时再减1得999。
3.按住键key3不放实现连加功能,每0.2s加1。
4.按住键key4不放实现连减功能,每0.2s减1。
4.5.6 实验步骤1.分析题意,确定算法,绘制主程序流程图。
- 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++)
;
}
/*************************************************
函数功能:软件消抖延时
**************************************************/