用C语言编写程序实现通过按键使LED灯周期闪烁精选文档.docx
- 文档编号:12128467
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:9
- 大小:18.38KB
用C语言编写程序实现通过按键使LED灯周期闪烁精选文档.docx
《用C语言编写程序实现通过按键使LED灯周期闪烁精选文档.docx》由会员分享,可在线阅读,更多相关《用C语言编写程序实现通过按键使LED灯周期闪烁精选文档.docx(9页珍藏版)》请在冰豆网上搜索。
用C语言编写程序实现通过按键使LED灯周期闪烁精选文档
TTMSsystemofficeroom【TTMS16H-TTMS2A-TTMS8Q8-TTMSHHJ8】
用C语言编写程序实现通过按键使LED灯周期闪烁精选文档
用C语言编写程序实现通过按键使LED灯周期闪烁(2010-02-2421:
12:
44)
标签:
循环闪烁周期led灯按键杂谈
一、设计题目
二、程序功能:
开机复位后,LED0到LED7全部点亮,所有LEDPort持续2S后熄灭,然后等待按键,按0键LED7以周期闪烁,按1键LEDPort以1S周期闪烁。
三、总体设计思想
用中断方式实现定时器的定时,然后通过键盘中断程序实现通过对按键的操作来实现相应的周期闪烁。
在我编写的实验程序中我用到了定时器中断和外部中断。
程序共分为两个模块,一个为定时器模块,一个为键盘中断程序模块,在主函数中,首先实现所有LEDPort点亮,然后通过中断方式实现定时2S,在定时器num==20时,设定全局变量为标志位flag=1,然后再主函数中设定条件,通过标志位的变化实现所有LEDPort持续2S后熄灭。
然后进入循环,等待按键,在按键中断服务程序中使用switch语句实现通过改变num1的值来实现LED7的闪烁周期。
设定标志位b=0,在主函数中使用if语句通过判断b的值来改变LED7的亮灭情况,同时相应的b值会取反。
四、程序具体实现
实验要求开机复位后,LED0到LED7全部点亮2S后熄灭。
在主函数中使用LEDPort=0x00;这条语句实现所有灯都亮,使用中断方式实现定时器定时2S,因为实验要求20ms溢出,所以设定num=100,在定时器中断服务程序中使用if语句判断条件,当num加到100,也就是说2S时间到时,执行flag=1;语句(先设定全局变量flag=0)。
然后在主函数中使用while语句规定只有在flag=0时才执行所有LEDPort点亮的操作。
2S时间到后,所有灯熄灭。
然后进入while循环,等待用户按键。
用户按键后,通过使用switch语句,实验按0键,num1=20,按1键,num1=50,。
而在主函数中,当按下0键或者1键时,num1就有了固定的值,通过if语句判断是否到达所要求的时间后,执行相应操作。
在本实验中,要求实现LED7的周期闪烁,我先设定一个标志位b=0;默认LED7灭,;然后在主函数中在定时时间到达
后,通过判断和改变b的值来实现LED7的亮灭情况。
然后使num=0;使定时器继续从新定时,不停循环实现LED7的周期闪烁。
程序附录:
#include<>
#include<>
#include""
#defineucharunsignedchar
#defineuintunsignedint
sbitad_busy=P3^2;
sbitkey=P3^3;
ucharnum;
ucharnum1;
bitb;
ucharflag=0;
ucharkeynumber;
#defineLEDPortXBYTE[0x9000]
//端口地址
voidInit(void)
{
IE|=0x04;
TCON=0x01;
}
voidTime0_Init(void)
{
TMOD|=0x01;
TH0=0xB8;
TL0=0x00;
ET0=1;
TR0=1;
}
voidTime0(void)interrupt1
{
TH0=0xB8;
TL0=0x00;
num++;
if(num==100)
flag=1;
}
voidISR_INT1(void)interrupt2
{
keynumber=Read7279();
while(!
key);
switch(keynumber)
{
case0:
num1=20;break;
case1:
num1=50;break;
default:
break;
}
}
voidmain(void)
{
b=0;
Init();
Time0_Init();
EA=1;
while(!
flag)
{LEDPort=0x00;}
LEDPort=0xff;
num=0;
while
(1)
{
if(num==num1)
{if(b)
{LEDPort=0x7f;b=0;}
else
{LEDPort=0xff;b=1;}
}
}num=0;
}
LED和按键控制实验在我刚买ARM开发板时,曾经一共做过4次实验,写过4个程序(距今似乎快要一年了),具体为:
1、LED控制实验:
使开发板上的LED3和LED4交替着亮灭
2、按键控制实验:
用按键控制开发板上LED的亮灭
3、串口UART通信实验:
用ARM的串口与PC机进行通信,包括发送和接收
4、LCD显示实验:
在240×320的LCD上显示R,G,B三段color,以及在LCD上显示BMP格式的图片,后来又加了一段程序,使ARM能用UART0接收来自PC机的BMP图片,并在LCD上显示之。
以上这些程序都是用编译链接的,其实说穿了就是把ARM当成单片机在用!
现在公布其中一个实验:
按键控制实验。
对于LED实验,就不再单独叙述了,因为实在太简单了,而且现在这个程序已经完全包含了LED实验所涉及到的一切东东!
实验说明:
用按键S4控制LED3和LED4的亮灭:
按下S4不动时,LED3和LED4同时闪烁点亮,放开S4后,LED3和LED4同时熄灭。
实验目的:
熟悉ARM程序开发的一般流程,掌握编译器和链接器的选项设置,以及观察在编译链接后,程序中各种符号,子程序和段所在的ARM内存空间中的地址,最终使程序能够从起始的汇编代码跳到C程序的main()函数中去运行。
开发工具:
源代码:
分两个文件,和,具体在文后列出。
选项设置:
在ARMAssembler和ARMCComplier中的ArchitectureorProcessor选择ARM920T;在ARMLinker的Output选项卡,RObase设置成0x,RWbase可以为空(这个选项在仿真调试阶段可以空着,但若要烧入FLASH中运行,则必须设置);另外为了观察程序中各种符号,子程序和段所链接的地址,又在ARMLinker的Listings选项卡中,勾上了ImageMap和Symbols
出现的问题和解决办法:
1、刚开始编译不通过,后来发现在汇编语句中,delay标号没有顶格书写。
2、程序下载进RAM后大多数情况下无法正常运行(偶尔也能成功),总是跳进SWI异常处理中去,而且在DebugLog窗口中提示“Can'tsetmorebreakpoint”,刚开始以为真的是断点设多了,虽然我自己并没有设置断点,但以为是AXD自动设置的,于是在AXD的ConfigureProcessor选项卡中,去掉了所有的勾勾,可问题依然存在;后来又以为是没有定义ARM中断跳转和其他模式下的堆栈的缘故,但加进了相关语句后还是没有解决问题!
为了这个问题我抓掉了好几根头发,终于在崩溃之前找到了原因所在,原来是在开发板上把ARM设置成了从NANDFLASH启动!
其实这本来也没什么错,但问题是我的开发板上已经预装了WinCE系统,于是乎,冲突就这样发生了!
解决办法有两个,一是擦除WinCE系统,二是拨动板子上的一个开关,使ARM从NORFLASH启动。
我当然选择后者。
实验总结:
为了上面所说的第二个问题,花了我不少时间,但也正是因为这个问题的出现,使得我对ADS的很多“冷门”的选项设置,也彻底研究了一遍,另外还迫使我去看了自带的文档BuildTools-WarningandErrors,为以后快速地定位和解决程序中的错误打下了基础。
程序代码如下:
:
AREAInit,CODE,READONLY;该伪指令定义了一个代码段,段名为Init,属性只读
ENTRY;程序的入口点标识
EXPORT__ENTRY
__ENTRY
ResetEntry
movsp,#0x0c700000;定义堆栈指针
IMPORTMain;声明主函数Main
BLMain;调用主函数
;下面是延迟子程序
EXPORTdelay
delay
subr0,r0,#1;r0=r0-1
cmpr0,#0x0;将r0的值与0相比较
bnedelay;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句
movpc,lr;返回
END;程序结束符
************************************************************************************
:
/*C语言函数
*/
/*PORTB寄存器预定义*/
#definerGPBCON
(*(volatileunsigned*)0x)
#definerGPBDAT
(*(volatileunsigned*)0x)
#definerGPBUP
(*(volatileunsigned*)0x)
/*PORTF寄存器预定义*/
#definerGPFCON
(*(volatileunsigned*)0x)
#definerGPFDAT
(*(volatileunsigned*)0x)
#definerGPFUP
(*(volatileunsigned*)0x)
externintdelay(inttime);/*声明汇编函数*/
voidMain()
{
rGPFCON=0x0;/*设置I/O口的GPF1为输入*/
rGPFUP=0xffff;/*禁止GPF端口的上拉*/
rGPBCON=0x0005;
/*设置I/O口GPB0,GPB1为输出属性*/
rGPBUP=0xffff;
/*禁止GPB端口的上拉*/
while
(1)/*不断的循环*/
{
if((rGPFDAT&0x0002)==0)/*检测按键S4是否按下*/
{
rGPBDAT=0xfc;/*使GPB0输出高电平,GPB1输出低电平,LED3灯会灭,LED4灯会亮*/
delay(0xffff);/*调用汇编延迟函数*/
rGPBDAT=0x03;/*使GPB0输出低电平,GPB1输出高电平LED3灯会亮,LED4灯会灭*/
delay(0xffff);/*调用汇编延迟函数*/
}
else
{
rGPBDAT=0xffff;
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编写 程序 实现 通过 按键 LED 周期 闪烁 精选 文档