msp430入门小程序Word文件下载.docx
《msp430入门小程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《msp430入门小程序Word文件下载.docx(57页珍藏版)》请在冰豆网上搜索。
//开总中断允许
LPM3;
//进入低功耗模式3,I/O口中断可将其唤醒
if(!
flag){P1OUT=BIT0;
}//中断服务程序
elseif(flag){P1OUT=BIT6;
}//其他任务
#pragma
vector=PORT1_VECTOR
__interrupt
void
Port_1(void)
{P1IFG=0;
//多源中断,需靠软件清除P1IFG
flag=1;
//置任务标志
_BIC_SR_IRQ(LPM3_bits);
//将CPU从睡眠模式唤醒
voidIint_Port1(void)
{P1DIR|=BIT0+BIT6;
P1OUT=BIT0;
P1DIR&
=~BIT3;
//设置为输入方向
P1SEL&
//设置为普通I/O口功能
P1IES|=BIT3;
//选择下降沿触发
P1IE|=BIT3;
//打开中断允许
P1IFG=0;
//P1IES的切换可能使P1IFG置位,需清除
_BIC_SR_IRQ(LPM3_bits);
//将CPU从睡眠模式唤醒
//端口1的中断服务历程
#pragmavector=PORT1_VECTOR
__interruptvoidPort_1(void)
{
P2OUT^=0x01;
//P1.0状态翻转
P1IFG&
=~0x10;
//P1.4中断标志清零
}//ADC
io430.h"
#defineuintunsignedint
#defineucharunsignedchar
uintad;
voiddelayl(uintn)
{uintj,k;
for(j=n;
j>
0;
j--)
for(k=100;
k>
k--);
voiddis(uintx,uinty,uintz)
{P1DIR=0xff;
P1OUT=0x00;
P2OUT=0x07;
P2OUT|=BIT3;
P1OUT=x;
P2OUT&
=~BIT0;
delayl
(1);
P2OUT|=BIT0;
P1OUT=y;
=~BIT1;
P2OUT|=BIT1;
P1OUT=z;
=~BIT2;
P2OUT|=BIT2;
P2OUT&
voidadc()
{uinti,j=10;
P1DIR=0x00;
P1REN=0xff;
//P2OUT&
//for(i=511;
i>
i--){P2OUT^=BIT1;
while(j--);
ad=P1IN;
P1REN=0x00;
{uintx,y,z;
P2DIR=0xff;
P2REN=0x07;
while
(1){//ad=345;
adc();
x=ad/100;
y=ad/10%10;
z=ad%10;
dis(x,y,z);
比较器a
比较器A模块
以下图可以看出比较器A的结构大概可以分4部分构成,分别为模拟输入,比较器A核心,低通虑波器,基准电压部分和中断部分组成。
首先,整个比较器A的工作必需由CAON位置为1时才能工作的,此位属CACTL1控制寄存器。
单片机上电时此位是为0的,也就是说比较器是不工作的。
以下大概讲述几个部分电路的功能和一些相关信息。
模拟输入电路:
外部模拟引脚信号CA0,CA1(正负端)可以分别由P2CA0,P2CA1位控制开或关。
经过软件的设置可以分别与内部的几个基准电压进行比较(0.5VCC,0.25VCC,三极管门值电压)或外部其中的电压进行比较。
应用的硬件比较可以分为以下三种组合:
两个外部引脚输入信号进行比较
其中一个外部引脚信号与内部的0.5VCC或0.25VCC比较
其中一个外部引脚信号与内部基准电压比较
参考电压发生器
参考电压电路是可以由CARSEL,CARERF0,CARERF1位来控制电压的产生。
通过软件设置可以选择几种电压输出到比较器的输入中作为比较,当然此参考电压也可以通过单片机的引脚往外部提供参考电压之用。
比较器A核心
比较器CAON位控制开关,CAEX位控制位控制方向。
低通虑波器
低通虑波器只需一个CAF位来控制此虑波器的功能开与关。
此虑波器功能是用于消除比较器输出信号的毛剌,以保证信号的质量和中断请求的可靠性。
中断请求
比较器A模块是具有中断功能的,如比较器功能CAIE中断允许开了,在CAIF信号产生时将生产中断(当然GIE要为1时)。
比较器A模块是具有中断独立向量的,是一个单独的中断,CUP接受请求后会硬件自动清除中断标志位CAIFG。
比较器模块相关寄存器说明
CACTL1
比较器控制寄存器1
CAEX:
控制内部比较器A的输入信号和输出信号的方向
CARSEL:
控制内部参考电压加到比较器A的正输入端还是负输入端
由结构图可以看出,CAEX,CARSEL在不同设置时,比较器A输入端的所加的参考电压是有不同的.
请参考以下列表:
-----------------------------------
CARSEL
CAEX
参考电压接入端
0
0
内部参考源加到比较器的正端
1
内部参考源加到比较器的负端
CAREF1,CAREF0
选择参考源:
0
使用外部参考
1
选择0.25VCC为参考电压
2
选择0.5VCC为参考电压
3
选择二极管电压为参考电压,须参见具体IC的资料
CAON:
控制比较器A的打开与关闭
关闭比较器工作
打开比较器工作
CAIES:
中断边沿触发模式选择
上升沿使中断标志CAIFG置位
下降沿使中断标志CAIFG置位
CAIE:
比较器中断允许
禁止中断
允许中断
CAIFG:
比较器中断标志
没有中断请求
有中断请求标志信号
CACTL2
比较器控制寄存器2
P2CA1:
控制输入端CA1
0
外部引脚信号不与比较器A连接
1
外部引脚信号与比较器A连接
P2CA0:
控制输入端CA0
CAF:
选择比较器输出端是否经过RC低通滤波器
开通RC低通滤波器
直通信号
CAOUT:
比较器A输出的信号
0CA0小于CA1
1CA0大于CA1
CAPD
端口禁止寄存器
比较器A模块的输入输出与IO口共用引脚,可以控制IO端口输入缓冲器的通断开关.CAPD控制位初始化为0,则端口输入缓冲器有效.当相应位为1时,端口输入缓冲器无效。
程序范例:
msp430x11x1.h>
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
//
停止WDT
CAPD|=0x08;
//
断开与IO端口输入
CACTL2=P2CA0;
//
设置P2.3为+comp
CCTL0=CCIE;
//CCR0
TACTL=TASSEL_2+ID_3+MC_2;
//SMCLK/8,计数模式
_EINT();
//
开总中断
while
(1)//
循环
CACTL1=0x00;
没有参考电压
_BIS_SR(LPM0_bits);
//
进入LPM0
CACTL1=CAREF0+CAON;
//0.25*Vcc=P2.3,
比较器开
再次进入LPM0
CACTL1=CAREF1+CAON;
//0.5*Vcc=P2.3,
再次进入
LPM0
CACTL1=CAREF1+CAREF0+CAON;
//0.55VonP2.3,比较器开
}
//TimerA0interruptserviceroutine
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
_BIC_SR_IRQ(LPM0_bits);
//退出LMP0模式
定时器中断
msp430g2553.h>
inti;
//StopWDT
P1DIR|=0x01;
//P1.0output
CCTL0=CCIE;
//CCR0interruptenabled
CCR0=50000;
TACTL=TASSEL_2+MC_2;
//SMCLK,contmode
i=0;
_BIS_SR(LPM0_bits+GIE);
//EnterLPM0w/interrupt
#pragmavector=TIMER0_A0_VECTOR
if(i>
20){
P1OUT^=0x01;
//ToggleP1.0
//CCR0+=50000;
//AddOffsettoCCR0
i++;
//7528
unsignedinti=1;
voidxie()
P1DIR|=0xff;
P2DIR|=0x07;
=0xfe;
//选中DACA
P1OUT=i;
P2OUT|=0x01;
//选中DACB
P2OUT|=0x02;
//禁止写入
P2OUT|=0x04;
//
xie();
{P1DIR&
P1REN=BIT3;
P1OUT|=BIT3;
(P1IN&
BIT3)){i=i<
<
1;
while(!
BIT3));
xie();
if(i>
129)i=1;
P1OUT^=BIT6;
//按键中断
#include
main(void)
WDTCTL
=
WDTPW
+
WDTHOLD;
//
Stop
watchdog
timer
P1DIR
|=
0x01;
Set
P1.0
to
output
direction
P1OUT
0x08;
P1.3set,
else
reset
P1REN
P1IE
P1.3
interrupt
enabled
P1IES
Hi/lo
edge
P1IFG
&
~0x08;
IFG
cleared
_BIS_SR(LPM4_bits
GIE);
Enter
LPM4
w/interrupt
Port
service
routine
^=
toggle
P1.4
}
//1602
in430.h"
#defineuintunsignedint
#defineucharunsignedchar
uchartable[]="
kaigeshuaiqi"
;
uchartable1[]="
hellowelcome"
uintm=1;
voiddelay(uintz)
{uinti,j;
for(i=z;
i--)
for(j=100;
j--);
voidwrite_com(ucharcom)//写入
=~BIT4;
//LCD选择输入命令
P1OUT=com;
//向P0口输入命令
delay(5);
//延时
P2OUT|=BIT5;
//打开LCD使能
//一个高脉冲
=~BIT5;
//关闭LCD使能
voidwrite_data(uchardate)
P2OUT|=BIT4;
//设置为输入数据
P1OUT=date;
//将数据赋给P0口
//置高
//高脉冲
//置低完成高脉冲
voidinit()
write_com(0x38);
//设置16x2显示5x7点阵,8位数据接口
write_com(0x0c);
//设置开始显示不显示光标
write_com(0x06);
//写一个字符后地址指针加1
write_com(0x01);
//显示清零数据指针清零
voiddis(uintx)
{uinty,z,k;
y=x/100;
z=x/10%10;
k=x%10;
write_com(0x86);
//将数据指针第一行第一个字处,
write_data(y+'
0'
);
write_data(z+'
write_data(k+'
delay(100);
{uintnum;
P1DIR=0xff;
P2DIR=0xff;
while
(1)
{init();
write_com(0x84);
for(num=0;
num<
12;
num++)
//{
{write_data(table[num]);
delay(1000);
write_com(0x80+0X44);
13;
{write_data(table1[num]);
//m++;
//delay(5);
//}
//write_com(0x80+0x40);
//定义指针位置
//for(num=0;
//write_data(table1[num]);
//write_data(m+'
+10);
//dis(num);
num++;
//if(num>
999){num=0;
while
(1){
4;
write_com(0x18);
//write_com(0x1c);
//右移
delay(2000);
//write_com(0x18);
//左移
write_com(0x1c);
}}
//12864
//main()
lcd12864.h"
lcd12864.c"
unsignedcharconstt[]={"
床前明月光,"
"
举头望明月,"
凝是地上霜。
"
低头思故乡。
};
voidmain()
P1DIR|=0xff;
P2DIR|=0xff;
P2SEL=0;
io_init();
lcd_init();
chn_disp1(t);
//Write_Num(0x86,767,0);
while
(1);
*
LCD12864程序
程序说明:
本程序为带字库的LCD12864驱动程序,选择LCD12864的串口工作模式。
利用
本程序LCD12864可显示汉字、数字和数组。
*/
//MSP430G2433LCD12864
//+-------------------++----+
//||||
//||||
//|||RS|--VCC
//|P2.6|-->
|R/W|
//|P2.7|-->
|CLK|
//|||RST|--VCC
//|||PSB|--GND
//******************************************************************************
msp430G2553.h"
LCD12864.h"
unsignedintDisp_Tab[8];
/*******************************************************************