实验1——MSP430单片机跑马灯程序 2010-08-26 20:24
#include "io430.h"
unsigned char LED;
unsigned int a[8]={BIT0,BIT1,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7};
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
LED=0xff;
P2DIR =0xff;
P2OUT=LED;
while(1)
{
unsigned int i, j;
for(i=0;i<8;i++)
{
LED=LED^a[i];
P2OUT=LED;
LED=0xff;
j=50000;
while(j--);
}
}
return 0;
}
在51中可以包含intrins.h,当中有两个函数:_cror_和_crol_,可以使一个字节的变量按位循环右移和左移,MSP430当中没有这个头文件,所以代码稍微复杂点。
这个程序中没有用到定时器,而是用了延时函数,降低了CPU的效率。等学会了定时器中断再加上更好的程序。
按键跑马灯和蜂鸣器发声——MSP430 2010-08-31 02:07 哥也会汇编了,哼哼。
#include "msp430.h"
ORG 0FFFEh
DC16 main
ORG 1100h ;place program in 'CODE' segment
CROL DB 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
main: MOV #0A00h, SP
MOV.W #5A80h,&WDTCTL ;关闭看门狗,避免定时自动复位,此句不能删除
MOV.B #0xFF, &P2DIR ;设置端口2为输出端口
MOV.B #0x00, &P1DIR ;设置端口1为输入端口
MOV.B #0xFE, R14
loop: MOV.B #0xFF, &P2OUT
MOV #CROL, R13
MOV.B #0x08, R12
BIT.B #BIT0, &P1IN
JC tb
JNC LEDON
tb BIT.B #BIT2, &P1IN
JNC beep
JC loop
LEDON: BIC.B @R13+, R14
MOV.B R14,&P2OUT
CALL #delay
MOV.B #0xFF,R14
DEC R12
JZ loop
JMP LEDON
beep: BIS.B #BIT5, &P6DIR
BIC.B #BIT5, &P6OUT
CALL #delay
BIS.B #BIT5, &P6OUT
JMP loop
BEEPOFF:
delay: PUSH R15
PUSH R14
MOV #0x4000, R15 ;可根据延时长短需求,改变R15,R14 初值大小
WW2: MOV #0x4, R14
WW1: DEC R14
JNZ WW1
DEC R15
JNZ WW2
POP R14
POP R15
RET
END
这个例子主要还是熟悉有关定时器A的寄存器配置以及IAR的配置方式。
view plaincopy to clipboardprint?
01./***********************************************
02.程序功能:实现流水灯以三种流动方式和四种流动速度
03. 的不同组合而进行点亮"流动"
04.------------------------------------------------
05.拨码开关设置:将LED位拨至ON,其余拨至OFF
06.测试说明:观察流水灯流动顺序和速度的变化
07.************************************************/
08.#include <msp430x14x.h>
09.typedef unsigned int uint;
10.uint i = 0,j = 0,dir = 0;
11.uint flag = 0,speed = 0; //flag--灯光流动方式,speed--灯光流动速度
12./****************主函数****************/
13.void main(void)
14.{
15.
16. /*下面六行程序关闭所有的IO口*/
17. P1DIR = 0XFF;P1OUT = 0XFF;
18. P2DIR = 0XFF;P2OUT = 0XFF;
19. P3DIR = 0XFF;P3OUT = 0XFF;
20. P4DIR = 0XFF;P4OUT = 0XFF;
21. P5DIR = 0XFF;P5OUT = 0XFF;
22. P6DIR = 0XFF;P6OUT = 0XFF;
23.
24. WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
25. P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
26. P5OUT &= ~BIT7;
27.
28. CCTL0 = CCIE; //使能CCR0中断
29. CCR0 = 50000;
30. TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,8分频增计数模式
31. P2DIR = 0xff; //设置P2口方向为输出
32. P2OUT = 0xff;
33.
34. _EINT(); //使能全局中断
35. LPM0; //CPU进入LPM0模式各时钟全部工作
36.}
37./*******************************************
38.函数名称:Timer_A
39.功 能:定时器A的中断服务函数,在这里通过标志
40. 控制流水灯的流动方向和流动速度
41.参 数:无
42.返回值 :无
43.********************************************/
44.#pragma vector = TIMERA0_VECTOR
45.__interrupt void Timer_A (void)
46.{
47. if(flag == 0)
48. {
49. P2OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1
50. }
51. else if(flag == 1)
52. {
53. P2OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8
54. }
55. else
56. {
57. if(dir) //灯的点亮顺序 D8 -> D1,D1 -> D8,循环绕圈
58. {
59. P2OUT = ~(0x80>>(i++));
60. }
61. else
62. {
63. P2OUT = ~(0x01<<(i++));
64. }
65. }
66.
67. if(i == 8)
68. {
69. i = 0;
70. dir = ~dir;
71. }
72.
73. j++;
74. if(j == 10)
75. {
76. i = 0;
77. j = 0;
78. flag++;
79. if(flag == 4) flag = 0;
80. switch(speed)//根据speed的值来选择相应的速度,速度的选择主要通过改变分频来实现
81. {
82. case 0:
83. TACTL &=~ (ID0 + ID1);//这个地方其实没必要,意思是清零TACTL的78两位
84. //ID1的值是0x0080 ID2的值是0x0040通过计算就可以得出
85. TACTL |= ID_3;//改为八分频
86. break;
87. case 1:
88. TACTL &=~ (ID0 + ID1);
89. TACTL |= ID_2;
90. break;
91. case 2:
92. TACTL &=~ (ID0 + ID1);
93. TACTL |= ID_1;
94. break;
95. case 3:
96. TACTL &=~ (ID0 + ID1);
97. TACTL |= ID_0;
98. break;
99. default:
100. break;
101. }
102. if(flag != 3) speed++;
103. if(speed == 4) speed = 0;
104. }
105.}
msp430:简单的跑马灯程序!
程序代码:#include "msp430x22x4.h"
void main( void )
{
volatile unsigned int i,j,a[8]={BIT0,BIT1,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7};
WDTCTL=WDTPW+WDTHOLD; //关看门狗
BCSCTL1 =CALBC1_1MHZ; //设定DCO为1MHZ
DCOCTL =CALBC1_1MHZ;
P1DIR |=0xff;
while(1)
{
P1OUT|=0XFF;
for(j=0;j<8;j++)
{
P1OUT ^=a[j];
for(i=50000;i>0;i--);
P1OUT|=0XFF;
}
}
}