如何用芯片MSP430和IAR软件的C语言编一个流水灯程序

如何用芯片MSP430和IAR软件的C语言编一个流水灯程序,第1张

#include<msp430x14x.h>

#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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12254016.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存