msp430入门小程序.docx
- 文档编号:3851854
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:47
- 大小:30.92KB
msp430入门小程序.docx
《msp430入门小程序.docx》由会员分享,可在线阅读,更多相关《msp430入门小程序.docx(47页珍藏版)》请在冰豆网上搜索。
msp430入门小程序
//红绿灯交换闪烁
#include"msp430g2553.h"
unsignedinti=8000;
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;//看门狗不解释
P1DIR=BIT6+BIT0;//设置p1输出
while
(1)//可以多加一些灯
{
P1OUT=BIT0;while(i--);//P1.0灯亮
P1OUT=BIT6;while(i--);//P1.6灯亮
}
}
//独立按键程序
//p1.0为led,p1.3为按键
#include"msp430g2553.h"
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;//看门狗不解释
P1DIR=BIT0;//P1.0为led,显示按键起作用
P1OUT=BIT0+BIT3;//P1IN低电平跳转
P1REN=BIT3;//上拉电阻,缺了好像不能用
while
(1)
{
if(P1IN&BIT3)//按键没按下
P1OUT=BIT0+BIT3;//led亮
elseP1OUT=BIT3;//led灭
}
}
P1口中断
#include
unsignedcharflag=0;//任务标志
voidIint_Port1(void);//函数声明
voidmain(void)
{WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
Iint_Port1();//初始化p1.0
_EINT();//开总中断允许
while
(1)
{
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&=~BIT3;//设置为普通I/O口功能
P1IES|=BIT3;//选择下降沿触发
P1IE|=BIT3;//打开中断允许
P1IFG=0;//P1IES的切换可能使P1IFG置位,需清除
}
{P1IFG=0;//多源中断,需靠软件清除P1IFG
flag=1;//置任务标志
_BIC_SR_IRQ(LPM3_bits);//将CPU从睡眠模式唤醒
}
//端口1的中断服务历程
#pragmavector=PORT1_VECTOR
__interruptvoidPort_1(void)
{
P2OUT^=0x01;//P1.0状态翻转
P1IFG&=~0x10;//P1.4中断标志清零
}//ADC
#include"io430.h"
#defineuintunsignedint
#defineucharunsignedchar
uintad;
voiddelayl(uintn)
{uintj,k;
for(j=n;j>0;j--)
for(k=100;k>0;k--);
}
voiddis(uintx,uinty,uintz)
{P1DIR=0xff;P1OUT=0x00;P2OUT=0x07;P2OUT|=BIT3;
P1OUT=x;P2OUT&=~BIT0;delayl
(1);P2OUT|=BIT0;
P1OUT=y;P2OUT&=~BIT1;delayl
(1);P2OUT|=BIT1;
P1OUT=z;P2OUT&=~BIT2;delayl
(1);P2OUT|=BIT2;
P2OUT&=~BIT3;
}
voidadc()
{uinti,j=10;
P1DIR=0x00;P1REN=0xff;P1OUT=0x00;
//P2OUT&=~BIT0;
//for(i=511;i>0;i--){P2OUT^=BIT1;while(j--);}
ad=P1IN;P1REN=0x00;
}
intmain(void)
{uintx,y,z;
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
P2DIR=0xff;P2OUT=0x07;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 内部参考源加到比较器的正端
0 1 内部参考源加到比较器的负端
1 0 内部参考源加到比较器的负端
1 1 内部参考源加到比较器的正端
CAREF1,CAREF0 选择参考源:
0 使用外部参考
1 选择0.25VCC为参考电压
2 选择0.5VCC为参考电压
3 选择二极管电压为参考电压,须参见具体IC的资料
CAON:
控制比较器A的打开与关闭
0 关闭比较器工作
1 打开比较器工作
CAIES:
中断边沿触发模式选择
0 上升沿使中断标志CAIFG置位
1 下降沿使中断标志CAIFG置位
CAIE:
比较器中断允许
0 禁止中断
1 允许中断
CAIFG:
比较器中断标志
0 没有中断请求
1 有中断请求标志信号
CACTL2 比较器控制寄存器2
P2CA1:
控制输入端CA1
0 外部引脚信号不与比较器A连接
1 外部引脚信号与比较器A连接
P2CA0:
控制输入端CA0
0 外部引脚信号不与比较器A连接
1 外部引脚信号与比较器A连接
CAF:
选择比较器输出端是否经过RC低通滤波器
0 开通RC低通滤波器
1 直通信号
CAOUT:
比较器A输出的信号
0CA0小于CA1
1CA0大于CA1
CAPD 端口禁止寄存器
比较器A模块的输入输出与IO口共用引脚,可以控制IO端口输入缓冲器的通断开关.CAPD控制位初始化为0,则端口输入缓冲器有效.当相应位为1时,端口输入缓冲器无效。
程序范例:
#include
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, 比较器开
_BIS_SR(LPM0_bits); // 再次进入LPM0
CACTL1=CAREF1+CAON; //0.5*Vcc=P2.3, 比较器开
_BIS_SR(LPM0_bits); // 再次进入 LPM0
CACTL1=CAREF1+CAREF0+CAON; //0.55VonP2.3,比较器开
_BIS_SR(LPM0_bits); // 再次进入LPM0
}
}
//TimerA0interruptserviceroutine
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
_BIC_SR_IRQ(LPM0_bits); //退出LMP0模式
}
定时器中断
#include"msp430g2553.h"
#include
inti;
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//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
}
//TimerA0interruptserviceroutine
#pragmavector=TIMER0_A0_VECTOR
__interruptvoidTimer_A(void)
{
if(i>20){
P1OUT^=0x01;//ToggleP1.0
//CCR0+=50000;//AddOffsettoCCR0
i=0;
}
i++;
}
//7528
#include
unsignedinti=1;
voidxie()
{
P1DIR|=0xff;//P1.0output
P2DIR|=0x07;
P2OUT&=0xfe;//选中DACA
P1OUT=i;
P2OUT|=0x01;//选中DACB
P1OUT=i;
P2OUT|=0x02;//禁止写入
P2OUT|=0x04;//
}
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//StopWDT
xie();
while
(1)
{P1DIR&=~BIT3;P1REN=BIT3;P1OUT|=BIT3;
if(!
(P1IN&BIT3)){i=i<<1;while(!
(P1IN&BIT3));xie();if(i>129)i=1;P1OUT^=BIT6;}
}
}
//按键中断
#include
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= 0x01; // Set P1.0 to output direction
P1OUT = 0x08; // P1.3set, else reset
P1REN |= 0x08;
P1IE |= 0x08; // P1.3 interrupt enabled
P1IES |= 0x08; // P1.3 Hi/lo edge
P1IFG &= ~0x08; // P1.3 IFG cleared
_BIS_SR(LPM4_bits + GIE); // Enter LPM4 w/interrupt
}
// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= 0x01; // P1.0 = toggle
P1IFG &= ~0x08; // P1.4 IFG cleared
}
//1602
#include"io430.h"
#include"in430.h"
#defineuintunsignedint
#defineucharunsignedchar
uchartable[]="kaigeshuaiqi";
uchartable1[]="hellowelcome";
uintm=1;
voiddelay(uintz)
{uinti,j;
for(i=z;i>0;i--)
for(j=100;j>0;j--);
}
voidwrite_com(ucharcom)//写入
{
P2OUT&=~BIT4;//LCD选择输入命令
P1OUT=com;//向P0口输入命令
delay(5);//延时
P2OUT|=BIT5;//打开LCD使能
delay(5);//一个高脉冲
P2OUT&=~BIT5;//关闭LCD使能
}
voidwrite_data(uchardate)
{
P2OUT|=BIT4;//设置为输入数据
P1OUT=date;//将数据赋给P0口
delay(5);//延时
P2OUT|=BIT5;//置高
delay(5);//高脉冲
P2OUT&=~BIT5;//置低完成高脉冲
}
voidinit()
{
P2OUT&=~BIT5;
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+'0');
write_data(k+'0');
delay(100);
}
intmain(void)
{uintnum;
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
P1DIR=0xff;
P2DIR=0xff;
P2OUT&=~BIT3;
while
(1)
{init();
write_com(0x84);//将数据指针第一行第一个字处,
for(num=0;num<12;num++)
//{
{write_data(table[num]);
delay(1000);}
write_com(0x80+0X44);
for(num=0;num<13;num++)
{write_data(table1[num]);
delay(1000);}
//m++;
//delay(5);
//}
//write_com(0x80+0x40);//定义指针位置
//for(num=0;num<12;num++)
//{
//write_data(table1[num]);
//write_data(m+'0'+10);
//dis(num);num++;
//if(num>999){num=0;}
//}
while
(1){
for(num=0;num<4;num++)
{
write_com(0x18);
//write_com(0x1c);//右移
delay(2000);
}
for(num=0;num<4;num++)
{
//write_com(0x18);//左移
write_com(0x1c);//右移
delay(2000);
}}
}
}
//12864
//main()
#include
#include"lcd12864.h"
#include"lcd12864.c"
unsignedcharconstt[]={"床前明月光,"
"举头望明月,"
"凝是地上霜。
"
"低头思故乡。
"};
voidmain()
{
WDTCTL=WDTPW+WDTHOLD;
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
//||||
//+-------------------++----+
//******************************************************************************
#include"msp430G2553.h"
#include"LCD12864.h"
unsignedintDisp_Tab[8];
/****************************************************************************
*名称:
io_init(void)
*功能:
LCD12864所用的IO口初始化
*入口参数:
无
*出口参数:
无
****************************************************************************/
voidio_init(void)
{
P2SEL&=~(BIT6+BIT7);
P2DIR|=BIT6+BIT7;
//P1OUT=0;
P1SEL=0xFF;
//P1SEL|=BIT6;
P1DIR=0;
}
/****************************************************************************
*名称:
wr_lcd(uchrfunc,uchrdata)
*功能:
往LCD12864写入一个字节。
func=comm,则写入的是命令;
func=commdat,则写入的是数据
*入口参数:
func和data
*出口参数:
无
****************************************************************************/
v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- msp430 入门 程序