用C语言编写程序实现通过按键使LED灯周期闪烁

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TH0=0xB8;
TL0=0x00;
ET0=1;
TR0=1;}void Time0(void) interrupt 1{TH0=0xB8;
TL0=0x00;
num++;
if(num==100)
flag=1;}void ISR_INT1(void) interrupt 2
{ keynumber=Read7279();
在我编写的实验程序中我用到了定时器中断和外部中断。程序共分为两个模块,一个为定时器模块,一个为键盘中断程序模块,在主函数中,首先实现所有LEDPort点亮,然后通过中断方式实现定时2S,在定时器num==20时,设定全局变量为标志位flag=1,然后再主函数中设定条件,通过标志位的变化实现所有LEDPort持续2S后熄灭。然后进入循环,等待按键,在按键中断服务程序中使用switch语句实现通过改变num1的值来实现LED7的闪烁周期。设定标志位b=0,在主函数中使用if语句通过判断b的值来改变LED7的亮灭情况,同时相应的b值会取反。
extern int delay(int time); /*声明汇编函数*/
void Main(){rGPFCON=0x0; /*设置I/O口的GPF1为输入*/
rGPFUP=0xff; /*禁止GPF端口的上拉*/
rGPBCON=0x0005; /*设置I/O口GPB0,GPB1为输出属性*/
rGPBUP=0xff; /*禁止GPB端口的上拉*/
实验目的:
熟悉ARM程序开发的一般流程,掌握编译器和链接器的选项设置,以及观察在编译链接后,程序中各种符号,子程序和段所在的ARM内存空间中的地址,最终使程序能够从起始的汇编代码跳到C程序的main()函数中去运行。
开发工具:
ADS
1.2
源代码:
分两个文件,init.s和Main.c,具体在文后列出。
sbit ad_busy = P3^2;
sbit key=P3^3;
uchar num;
uchar num1;
bit b;
uchar flag=0;
uchar keynumber;
#define LEDPort XBYTE[0x9000] //
void Init(void){IE|=0x04;
TCON=0x01;}void Time0_Init(void)端口地址{TMOD|=0x01;
1、LED控制实验:
使开发板上的LED3和LED4交替着亮灭
2、按键控制实验:
用按键控制开发板xxLED的亮灭
3、串口UART通信实验:
用ARM的串口与PC机进行通信,包括发送和接收
4、LCD显示实验:
在240×320的LCD上显示R,G,B三段color,以及在LCD上显示BMP格式的图片,后来又加了一段程序,使ARM能用UART0接收来自PC机的BMP图片,并在LCD上显示之。

(2010-02-24 21:12:44)标签:
循环闪烁周期led灯按键杂谈
一、设计题目
二、程序功能:
开机复位后,LED0到LED7全部点亮,所有LEDPort持续2S后熄灭,然后等待按键,按0键LED7以
0.8S周期闪烁,按1键LEDPort以1S周期闪烁。
三、总体设计思想
用中断方式实现定时器的定时,然后通过键盘中断程序实现通过对按键的操作来实现相应的周期闪烁。
四、程序具体实现
实验要求开机复位后,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灭,;然后在主函数中在定时时间到达
以上这些程序都是用ADS
1.2编译链接的,其实说穿了就是把ARM当成单片机在用!现在公布其中一个实验:
按键控制实验。
对于LED实验,就不再单独叙述了,因为实在太简单了,而且现在这个程序已经完全包含了LED实验所涉及到的一切东东!
实验说明:
用按键S4控制LED3和LED4的亮灭:
按下S4不动时,LED3和LED4同时闪烁点亮,放开S4后,LED3和LED4同时熄灭。
;下面是延迟子程序
EXPORT delay
delay
sub r0,r0,#1 ;r0=r0-1
cmp r0,#0x0 ;将r0的值与0相比较
bne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句
mov pc,lr ;返回
END ;程序结束符
************************************************************************************
实验总结:
为了上面所说的第二个问题,花了我不少时间,但也正是因为这个问题的出现,使得我对ADS的很多“冷门”的选项设置,也彻底研究了一遍,另外还迫使我去看了ADS
1.2自带的文档Build Tools-Warning and Errors,为以后快速地定位和解决程序中的错误打下了基础。
程序代码如下:
while
(1) /*不断的循环*/{if((rGPFDAT&0x0002)==0) /*检测按键S4是否按下*/{rGPBDAT=0xfc; /*使GPB0输出高电平,GPB1输出低电平,LED3灯会灭,LED4灯会亮*/
delay(0xff); /*调用汇编延迟函数*/
rGPBDAT=0x03; /*使GPB0输出低电平,GPB1输出高电平LED3灯会亮,LED4灯会灭*/
选项设置:
在ARM Assembler和ARM C Complier中的Architecture orProcessor选择ARM920T;在ARM Linker的Output选项卡,RO base设置成0x31000,RWbase可以为空(这个选项在仿真调试阶段可以空着,但若要烧入FLASH中运行,则必须设置);另外为了观察程序中各种符号,子程序和段所链接的地址,又在ARMLinker的Listings选项卡中,勾上了Image Map和Symbols
delay(0xff); /*调用汇编延迟函数*/}else{rGPBDAT=0xff;}}}
/*PORT F寄存器预定义*/
#define rGPFCON (*(volatile unsigned *)0x56005ຫໍສະໝຸດ Baidu)
#define rGPFDAT (*(volatile unsigned *)0x560054)
#define rGPFUP (*(volatile unsigned *)0x560058)
Main.c:
/*C语言函数
*/
/*PORT B寄存器预定义*/
#define rGPBCON (*(volatile unsigned *)0x560010)
#define rGPBDAT (*(volatile unsigned *)0x560014)
#define rGPBUP (*(volatile unsigned *)0x560018)
init.s:
AREA Init,CODE,READONLY ;该伪指令定义了一个代码段,段名为Init,属性只读
ENTRY ;程序的入口点标识
EXPORT __ENTRY
__ENTRY
ResetEntry
mov sp,#0x0c7000 ;定义堆栈指针
IMPORT Main ;声明主函数Main
BL Main ;调用主函数
后,通过判断和改变b的值来实现LED7的亮灭情况。然后使num=0;使定时器继续从新定时,不停循环实现LED7的周期闪烁。
程序附录:
#include<reg
52.h>
#include<absacc.h>
#include"
7279.h"
#define uchar unsigned char
#define uint unsigned int
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个程序(距今似乎快要一年了),具体为:
while(!key);
switch(keynumber){case 0:num1=20;break;
case 1:num1=50;break;
default:
break;}}
void main(void){b=0;
Init();
Time0_Init();
EA=1;
while(!flag)
{ LEDPort=0x00; }
出现的问题和解决办法:
1、刚开始编译不通过,后来发现在汇编语句中,delay标号没有顶格书写。
2、程序下载进RAM后大多数情况下无法正常运行(偶尔也能成功),总是跳进SWI异常处理中去,而且在Debug Log窗口中提示“Can't set more breakpoint”,刚开始以为真的是断点设多了,虽然我自己并没有设置断点,但以为是AXD自动设置的,于是在AXD的Configure Processor选项卡中,去掉了所有的勾勾,可问题依然存在;后来又以为是没有定义ARM中断跳转和其他模式下的堆栈的缘故,但加进了相关语句后还是没有解决问题!为了这个问题我抓掉了好几根头发,终于在崩溃之前找到了原因所在,原来是在开发板上把ARM设置成了从NANDFLASH启动!其实这本来也没什么错,但问题是我的开发板上已经预装了Win CE系统,于是乎,冲突就这样发生了!解决办法有两个,一是擦除Win CE系统,二是拨动板子上的一个开关,使ARM从NOR FLASH启动。我当然选择后者。
相关文档
最新文档