#define uint unsigned int
delay(uint);
void main()
{
WDTCTL = 0x5A80
uint ch[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}
uint i,j
P2DIR = 0xff
P2OUT = 0xff//低电平点亮明拦
while(1)
{
for(i=0i<8i++)
{
P2OUT = ch[i]
delay(50000)
}
for(j=6j>0j--)
{
P2OUT = ch[j]
delay(50000)
}
}
}
void delay(uint z)
{
uint a
for(a=0a<za++)
}
1.这是较为简单的流水灯程序,没有使用定时器,只是简单的延时纯蔽;
若要精确延时,需要设置定时器A或做槐州B.
2.也可以通过移位 *** 作来实现流水灯,移位 *** 作放入中断内最好
/*流水灯,P4口连接LED
*/
#include
"msp430x14x.h"
//__interrupt
void
TimerB_ISR(void)
void
Init_Port(void)
void
Init_TimerB(void)
void
InitSystemClock(void)
//
unsigned
char
led
void
main(
void
)
{
//
Stop
watchdog
timer
to
prevent
time
out
reset
WDTCTL
=
WDTPW
+
WDTHOLD//关闭看门狗
InitSystemClock()
Init_Port()
Init_TimerB()
_EINT()
led=0x01
while(1)/橘悄和/LPM0
}
void
InitSystemClock(void)
//
初始化系统时钟
{
unsigned
char
i
BCSCTL1=0x00//Set
430
clk
开启XT2,DOC的标称频率为最低
且不分频;XT1为低速晶体(32.768K)
BCSCTL2=SELM_2+SELS//选择MCLK
SCLK的时钟源为高速时钟
不分频,均为8M
do
{
IFG1&=~OFIFG
for(i=0xffi>0i--)
}
while
((IFG1&OFIFG)!=0)
P5DIR=BIT4+BIT5+BIT6
P5SEL|=BIT4+BIT5+BIT6/圆盯/将MCLK
SCLK
ACLK分别输出至P5.4
5
6口
}
void
Init_Port(void)
{
P4DIR=0XFF
P4SEL=0
return
}
void
Init_TimerB(void)
{
/运尘/选择ACLK,清除TAR
TBCTL
=TBSSEL0
+TBCLR
//TBCCRO允许中断
TBCCTL0=
CCIE
//时间间隔为1s
TBCCR0=32768
//增计数模式
TBCTL
|=MC0
return
}
#pragma
vector=TIMERB0_VECTOR
__interrupt
void
TimerB_ISR(void)
{
led=(led==0x80)?
0x01:(led<<1)//led的流水灯的输出值计算:循环左移
P4OUT
=led
}
1. 不知道你用的是什么开发板,点灯程序设计中init.s、寄存器配置和一些接口初始化(如UART、led)在模板中都有了啊,我用过了两个开发板,LPC2200和MAGIC ARM2410都不用手动添加的,专用模板中都自带的。2. 点灯程序中最重要的是设置GPIO,把相应的引脚设置高低电平就可以点亮了,这你就要看懂开发板自带的硬件电路图了。
3. 给你看看我用的开发板点灯程序的设置吧,我的开发板上面有四个灯,实现程序如乎唯下:
#include "config.h"
// 定义LED控制口 (输出高电平时点亮LED)
#define LED1_CON (1<<11) /* GPE11口 */
#define LED2_CON (1<<12) /* GPE12口 */
#define LED3_CON (1<<4)/* GPH4口 */
#define LED4_CON (1<<6)/* GPH6口 */
void DelayNS(uint32 dly)
{
uint32 i
for(dly>0dly--)
for(i=0i<50000i++)
}
void LED_DispAllOn(void)//其实你要的灯全部亮只要这一个函数就可以了,这个功能是把,led1、led2、led3、led4对应的GPE11、GPE12、GPE4、GPE6设置为高电平,即点亮灯
{
rGPEDAT = rGPEDAT | (0x03<<11)
rGPHDAT = rGPHDAT | (0x05<<4)
}
void LED_DispAllOff(void)
{
rGPEDAT = rGPEDAT &(~(0x03<<11))
rGPHDAT = rGPHDAT &(~(0x05<<4))
}
void LED_DispNum(uint32 dat)
{
dat = dat &0x0000000F// 参数过滤
// 控制LED4、LED3显示(d3、d2位)
if(dat &0x08) rGPHDAT = rGPHDAT | (0x01<缺扮<6)
else rGPHDAT = rGPHDAT &(~(0x01<<6))
if(dat &0x04) rGPHDAT = rGPHDAT | (0x01<<4)
else rGPHDAT = rGPHDAT &(~(0x01<<4))
// 控制LED2、LED1显示(d1、d0位)
rGPEDAT = (rGPEDAT &(~(0x03<<11))) | ((dat&0x03) <岁扮培<11)
}
int main(void)
{
int i
do{
// 初始化I/O
rGPECON = (rGPECON &(~(0x0F<<22))) | (0x05<<22) // rGPECON[25:22] = 0101b,设置GPE11、GPE12为GPIO输出模式
rGPHCON = (rGPHCON &(~(0x33<<8))) | (0x11<<8)// rGPHCON[13:8] = 01xx01b,设置GPH4、GPH6为GPIO输出模式
// LED全闪烁5次
for(i=0i<5i++)
{
LED_DispAllOff() // LED全熄灭
DelayNS(5)
LED_DispAllOn() // LED全点亮
DelayNS(5)
}
// 控制LED指示0~F的16进制数值
for(i=0i<16i++)
{
LED_DispNum(i)// 显示数值i
DelayNS(5)
}
}while(1)
return(0)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)