㈠ MSP430单片机如何不用中断实现数码管显示,急求程序
1、动态显示:通过主程序调用数码管显示程序,定时更新;
2、静态显示:通过引脚直接驱动即可。
以上2种方法都不需要定时器中断。
㈡ 关于MSP430定时器A的一个简单程序
程序正确,在IAR里改单片机型号了,默认149
㈢ 谁能给我个msp430关于ds18b20测温led显示的程序啊
我的led是用74164驱动的!我把程序段给你吧:
#include <MSP430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //升级板段码表(共阴极正常)
uchar seg1[]={0XBF,0X86,0XDB,0XCF,/*0. 1. 2. 3.*/
0XE6,0XED,0XFD,0X87,/*4. 5. 6. 7.*/
0XFF,0XEF/* *8.9.*/};//升级板 带小数点的段码
/*****1820的数据口和方向宏定义*******/
#define DQ1 P5OUT |= BIT5
#define DQ0 P5OUT &=~ BIT5
#define DQIN P5DIR &= ~BIT5
#define DQOUT P5DIR |= BIT5
/****数码管数据时钟的宏定义***********/
#define DATA1 P5OUT |= BIT0
#define DATA0 P5OUT &=~ BIT0
#define CLK1 P5OUT |= BIT1
#define CLK0 P5OUT &=~ BIT1
/*******液晶端口初始化*******/
#define out P3DIR|=BIT0+BIT1+BIT2
#define lcd_en1 P3OUT|=BIT2
#define lcd_en0 P3OUT&=~BIT2
#define lcd_rw1 P3OUT|=BIT1
#define lcd_rw0 P3OUT&=~BIT1
#define lcd_rs1 P3OUT|=BIT0
#define lcd_rs0 P3OUT&=~BIT0
unsigned char table1[8]="08:50:16";
unsigned char table2[]="TING TING";
void delay(unsigned int i);
unsigned char Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void ReadTemperature(void);
uint t;
float temp;
float Temper=0.0;
unsigned int temperature = 0;
/**********/
/*延时子程序*/
//调用8个时钟周期,返回6个,循环4个
//总周期个数为: 8+6+4*n=14+4*n 个时钟周期
//默认800k时钟,所以周期为1.25us 公式修正:17.5+5*n=定时时间
void delay(unsigned int x)//延时
{
unsigned int i;
i=x;
for(;i>0;i--)
;
}
/*************显示模块部分*********/
void init_port( void )//端口初始化
{ P5SEL=0;
P5DIR=0;
P5DIR|=BIT0+BIT1+BIT5;
return;
}
void clk(void)//时钟子程序
{
CLK1;
delay(10);
CLK0;
delay(10);
return;
}
void led_off( void )//熄灭所有led
{ int i;
for(i=0;i<64;i++)
{ DATA1;
clk();
}
return;
}
void Led_On( void )//点亮所有数显
{ uchar i;
for(i=0;i<64;i++)
{ DATA0;
clk();
}
return;
}
void dataout( int n )//数据输出
{int i;
for(i=0;i<8;i++)
{ if((n&0x80)==0x80)//
DATA1;//输出低电平 显示1
else
DATA0;
clk();//给时钟
n <<=1;//左移一位
}
return;
}
//ds18b20初始化函数
//输入:无
//返回:0表示初始化失败,1表示初始化成功
unsigned char Init_DS18B20(void)
{
unsigned char x=0;
DQOUT;
DQ0;
delay(90);//延时500us
DQ1;
delay(16);//延时90us
DQIN;
x = P5IN & BIT5;
if(x)
{
return 0;//失败
}
else
{
DQ1;
return 1;//应答成功
}
}
unsigned char ReadOneChar(void)
{
unsigned char i;
unsigned char temp=0;
for(i=0;i<8;i++)
{
temp=temp>>1;
DQOUT;//设定为输出
DQ0;
//DQ1;//可有可无的
DQIN;
if((P5IN&BIT5)==0)
{temp=temp&0x7F;}//先读的是低位,高位后渎出来
else
{temp=temp|0x80;}
delay(8);//延时60us
}
return temp;
}
void WriteOneChar(unsigned char n)
{
unsigned char i;
DQOUT;
for(i=0;i<8;i++)
{ DQ0;
if((n&0X01)==0X01) DQ1;//先写的也是低位,只是和读的方法正相反
else DQ0;
n=n>>1;
delay(7);//延时45us 以上
DQ1;//?
}
}
void ReadTemp (void)
{
char temp_low,temp_high; //温度值
temp_low = ReadOneChar(); //读低位
temp_high = ReadOneChar(); //读高位
_NOP();
// temperature=(temp_high&0x0f);
temperature=temp_high;
temperature<<=8;
temperature|=temp_low;
Temper=temperature*0.0625;//?
}
void ReadTemperature(void)
{ char i;
while(!(Init_DS18B20()))//初始化不成功时等待
{ led_off();
for(i=0;i<8;i++)
dataout(0);
delay(50000);
delay(50000); }
Init_DS18B20();
WriteOneChar(0xcc);//跳过序列号命令
WriteOneChar(0x44);//转换
delay(50000);//延时1秒以上
delay(50000);
delay(50000);
delay(50000);
Init_DS18B20();
WriteOneChar(0xcc);//跳过序列号命令
WriteOneChar(0xBE);//读暂存存储器
ReadTemp();
}
void transfer(void)
{
table1[0]=t/100+48;//加上0x30即48,转化成ASCII码液晶能够识别
table1[1]=t/10%10+0x30;
table1[2]='.';
table1[3]=t%10+0x30;
}
/******LCD写指令程序***********/
void write_ling(unsigned char com)
{ out;
P4DIR=0XFF;
P4OUT=com;
lcd_rw0;
lcd_rs0;
_NOP();
lcd_en0;
delay(10);
lcd_en1;
delay(10);
lcd_en0;
}
/***********LCD写数据**************/
void write_data(unsigned char date)
{ out;
P4DIR=0XFF;
P4OUT=date;
lcd_rw0;
lcd_rs1;
_NOP();
_NOP();
lcd_en0;
delay(10);
lcd_en1;
delay(10);
lcd_en0;
}
/*********lcd初始化,写lcd功能与方式控制********/
void lcd_init()
{ out;
write_ling(0x38);
delay(20);
write_ling(0x0f);
delay(20);
write_ling(0x06);
delay(20);
write_ling(0x0c);
delay(20);
write_ling(0x01);
delay(20);
}
int main( void )
{ // int t;
uint a;
WDTCTL = WDTPW + WDTHOLD;
init_port();
lcd_init();
delay(50000);
while(1)
{
ReadTemperature();
//P4DIR|=BIT5
if(t>=35)
{ P5OUT|=BIT4;//报警
delay(50000);
delay(50000);
}
else
P5OUT&=~BIT4;
t=Temper*10;//设置的变量,以便看结果
led_off();
dataout(seg[t%10]);
dataout(seg1[(t/10)%10]);//带小数点段码
dataout(seg[t/100]);
dataout(seg[10]);
dataout(seg[10]);
dataout(seg[10]);
dataout(seg[10]);
dataout(seg[10]);
//delay(50000);
transfer();
write_ling(0x80+5);
delay(40);
for(a=0;a<4;a++)
{ write_data(table1[a]);
delay(100);
}
write_ling(0xc0+3);
delay(50);
for(a=0;a<9;a++)
{ write_data(table2[a]);
delay(60);
}
}
}
㈣ MSP430程序解释
看你这程序是Timer_A控制的Uart程序,我没弄过,没有发言权。
不过下面是我编的一个串口中断的接收发送程序(不是用定时器模拟的),你可以看一下。
/******************************************************
程序功能:接收PC机十六进制数据后回传至PC机
数据格式:十六进制
帧头:FD
帧尾: FE
*******************************************************/
#include <msp430x14x.h>
unsigned char RecBuf[255]; //接收数据缓存
unsigned char *SDat; //指向要发送的数据
unsigned char Rindex; //接收数据计数
unsigned char Tindex; //发送数据计数
unsigned char SendLen; //发送数据长度
/*************************************************
函数名称:ConfigUart0
功 能:配置UART0,使用SMCLK,N.8.1, 9600
无校验,8个数据位,1个停止位,波特率9600
参 数:无
返回值 :无
**************************************************/
void ConfigUart0()
{
P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口
ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受
UCTL0 |= CHAR; // 选择8位字符
UTCTL0 |= SSEL1; // UCLK = SMCLK
UBR00 = 0xD0; // 波特率9600
UBR10 = 0x00; //
UMCTL0 = 0x40; // Molation
UCTL0 &= ~SWRST; // 初始化UART状态机
IE1 |= URXIE0 + UTXIE0; // 使能USART0的收发中断
}
/********************主函数********************/
void main(void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
BCSCTL1 &= ~XT2OFF; //使TX2有效,TX2上电默认是关闭的
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for(i=0xff;i>0;i--); //延时,待稳定
}
while((IFG1 & OFIFG)!=0); //若振荡器失效标志有效
BCSCTL2 |= SELM1; //使MCLK=XT2
BCSCTL2 |= SELS+DIVS1; //SMCLK=XT2,4分频,即2MHZ
BoardConfig(0xb8); // 关闭数码管、流水灯和电平转换
ConfigUart0(); //配置UART0
_EINT(); //打开全局中断
while(1)
{
LPM1;
}
}
/*******************************************
函数名称:UART0_RXISR
功 能:UART0的接收中断服务函数,在这里唤醒
CPU,使它退出低功耗模式
参 数:无
返回值 :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
RecBuf[Rindex++] = RXBUF0;
if(RecBuf[Rindex-1]==0xfe) //接收完毕
{
if(RecBuf[0]==0xfd) //帧头正确
{
LPM1_EXIT;
SDat = RecBuf;
IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
SendLen = Rindex;
Rindex=0;
}
}
}
/*******************************************
函数名称:UART0_TXISR
功 能:UART0的发送中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector = UART0TX_VECTOR
__interrupt void UART0_TXISR(void)
{
if(Tindex < SendLen)
{
TXBUF0 = *(SDat+Tindex);
Tindex++;
}
else
{
Tindex=0;
//LPM1;
}
}
㈤ 急急急,msp430 数字钟程序,可预置时间(显示部分不太明白)
数码管我还真没见过同时显示的,呵呵。
我们平时看到的数码管一般都是动态显示的,数码管的位端依次被点亮,这个时候段码端口给出相应的数据,如共阴数码管显示‘0’,则给出数据0x3F,然后这个数码管马上又灭掉,依次轮到下一个数码管被点亮。
//在main函数的死循环钟,每隔延时delay(100);sel++;sel自加一次
//在显示函数中
switch(sel)
{
case0:P5OUT=anxuan[contmiao%10];P4OUT=0xfe;break;
//P5数据端口给出段码数据,这个数据是秒的个位,P4给出位码,点亮P40对应的数码管
case1:P5OUT=anxuan[contmiao/10];P4OUT=0xfd;break;
//依次轮到这里,显示秒的十位,数码管P41IO上的
case2:P5OUT=0xbf;P4OUT=0xfb;break;
//依次,0xbf应该是一杠'-'
case3:P5OUT=anxuan[contfen%10];P4OUT=0xf7;break;
case4:P5OUT=anxuan[contfen/10];P4OUT=0xef;break;
case5:P5OUT=0xbf;P4OUT=0xdf;break;
case6:P5OUT=anxuan[contshi%10];P4OUT=0xbf;break;
case7:P5OUT=anxuan[contshi/10];P4OUT=0x7f;break;
default:P4OUT=0x00;break;
㈥ MSP430编程,用看门狗计时器是数码管交替亮灭。但如错误之处所示,我设置了主时钟,却进不去中断,为何
你的问题不是出在BCSCTL2=SELM1。而是IE1=WDTIE;应该改成IE1|=WDTIE;你缺少了 按位或“|”运算符。由于模块中断没有开启,所以你不可能进入中断程序。
㈦ MSP430单片机两位数码管程序
硬件介绍:
这里所用到的硬件资源包括8个数码管、和msp430单片机的两个8位IO口(这里用的是P3和P5口,如有改变,可以通过宏定义更改)。
数码管是8个共阴的数码管,a-h 8段通过一个200Ω的电阻接到430单片机的P5口。共阴端是由单片机的P3口控制,单片机的一位IO通过一个三极管接到数码管的共阴端,以完成位选。
单片机的P3口时数码管的位选口,某位为高则选中;P5口时段选口;要数码管显示时,通过P3位选,选中某个数码管亮,P5段选选择8段(a-h)中的那些亮,从而控制某一位显示数字或字符。
要同时显示多个数码管,就要动态扫描;动态扫描时,本程序选用的是由看门狗的中断扫描显示:每1.9ms显示其中的一位,动态扫描显示每一位,从而让数码管看起来是同时亮的。
程序实现:
数码管显示首先要有一个数码管显示的断码表(完成数字和字符到数码管段值的表),程序中采用了《MSP430系列单片机系统工程设计与实践》这本书推荐的方式实现的这个数码表:先用宏定义定义每段对应的单片机要输出的段值,然后再实现是个表,当硬件改变时,只需更改前面的每段的段值定义即可,改动的地方少了很多,代码如下:
/*宏定义,数码管a-h各段对应的比特,更换硬件只用改动以下8行*/
#define a 0x01 // AAAA
#define b 0x02 // F B
#define c 0x04 // F B
#define d 0x08 // GGGG
#define e 0x10 // E C
#define f 0x20 // E C
#define g 0x40 // DDDD HH
#define h 0x80 //小数点
/*用宏定义自动生成段码表,很好的写法,值得学习*/
/*更换硬件无需重写段码表*/
const char Tab[] = {
a + b + c + d + e + f, // Displays "0"
b + c, // Displays "1"
a + b + d + e + g, // Displays "2"
a + b + c + d + g, // Displays "3"
b + c + f + g, // Displays "4"
a + c + d + f +g, // Displays "5"
a + c + d + e + f + g, // Displays "6"
a + b + c, // Displays "7"
a + b + c + d + e + f + g, // Displays "8"
a + b + c + d + f + g, // Displays "9"
a + b + c + e + f + g, // Displays "A"
c + d + e + f + g, // Displays "B"
a + d + e + f, // Displays "C"
b + c + d + e + g, // Displays "D"
a + d + e + f + g, // Displays "E"
a + e + f + g, // Displays "F"
a + c + d + e + f, // Displays "G"
b + c + e + f + g, // Displays "H"
e + f, // Displays "I"
b + c + d + e, // Displays "J"
b + d + e + f + g, // Displays "K"
d + e + f, // Displays "L"
a + c + e + g, // Displays "M"
a + b + c + e + f, // Displays "N"
c + e + g, // Displays "n"
c + d + e + g, // Displays "o"
a + b + c + d + e + f, // Displays "O"
a + b + e + f + g, // Displays "P"
a + b + c + f + g, // Displays "Q"
e + g, // Displays "r"
a + c + d + f +g, // Displays "S"
d + e + f + g, // Displays "t"
a + e + f , // Displays "T"
b + c + d + e + f, // Displays "U"
c + d + e, // Displays "v"
b + d + f + g, // Displays "W"
b + c + d + f + g, // Displays "Y"
a + b + d + e + g, // Displays "Z"
g, // Displays "-"
h, // Displays "."
0 // Displays " "
};
#undef a
#undef b
#undef c
#undef d
#undef e
#undef f
#undef g
0-9的位置对应显示0-9,之后的是A开始往后显示,为了方便访问这个表格,定义了AA等一系列的常量,方便访问这个表。
A从10开始访问这个表格,如果要显示A只需这样用Tab[AA],即可得到需要的段值,AA-空格的宏定义放在H文件里,方便其他文件访问(当要调用显示函数的时候需要AA等宏定义)。为什么是AA而不是A呢?主要原因是单字母的有几个已经在单片机430的头文件里定义了,为了访问的时候一致,就都用两个字母的了。
为了动态扫描,这里定义了一个全局数组(数码管的程序可以访问)Nixie[8]在这个里面的8个char对应8个数码管要显示的段值。初始值是8个数码管都不显示:
char Nixie[8] = "\0\0\0\0\0\0\0\0"; //初始状态 不显示
动态扫描时,函数每1.9ms(设的看门狗定时中断)调用一次显示函数,每次显示一位(为了让中断占用更少的时间,这样中断里只需赋值即可)。函数如下:
void Display()
{
static char i = 0; //记录扫描显示到哪位
CTRL_OUT = 1<<i;
DATA_OUT = Nixie[i];
i++;
if(i>7)
i = 0;
}
这个函数供中断调用,i用来保存要显示哪一位。CTRL_OUT 、DATA_OUT 是宏定义的位选和段选口。中断程序如下:
#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR()
{
Display();
}
中断只调用了一个函数,这样很方便换其他中断来定时。
中断是必须初始设置的,还有IO口,要设为输出方向 ,初始化函数完成数码管用到的单片机资源的初始工作:
void NixiettubeInit()
{
WDTCTL = WDT_ADLY_1_9; //看门狗内部定时器模式16ms
IE1 |= WDTIE; //允许看门狗中断
CTRL_DIR_OUT;
DATA_DIR_OUT;
}
首先,设置中断并允许中断;然后设置位选和段选所用的端口为输出方向。CTRL_DIR_OUT; DATA_DIR_OUT; 和刚才用到的两个OUT的宏定义如下:
#define DATA_DIR_OUT P5DIR|=0XFF
#define CTRL_DIR_OUT P3DIR|=0XFF
#define DATA_OUT P5OUT
#define CTRL_OUT P3OUT
这样处理之后,要显示数字就很简单了:只需把要显示的数字或字符的段码值放入Nixie[8]数组对应的位置即可,如显示韩输入下:
void NixiettubeDisplayChar(char ch,char addr)
{
if(ch == DOT) //小数点,不需单独占一位
{
Nixie[addr] |= Tab[ch];
}
else
{
Nixie[addr] = Tab[ch];
}
}
如果是小数点,放入对应位置的h段即可,其他直接覆盖。
插入字符函数:在最右端插入数字或字符.
void NixiettubeInsertChar(char ch)
{
if(ch == DOT) ////小数点,不需单独占一位
{
Nixie[0] |= Tab[ch];
return;
}
for(int i = 7;i > 0;i--)
Nixie[i] = Nixie[i - 1]; //已显示字符左移一位
Nixie[0] = Tab[ch];
}
这个也是先判断小数点,小数点直接放到h段,其他的,则要已显示的左移再覆盖最右一位,源程序的注释很详细,可具体才、可以下载附件的程序库。
数码管清除函数,这个函数把数码管全部显示去掉,即把缓存数组内每项都置为0:
void NixiettubeClear()
{
for(int i = 0;i < 8;i++)
Nixie[i] = Tab[SP]; //显示空格
}
程序比较简单,这里就不多解释了。
数码管的程序就这么多了,所有函数都列出来了。下面开始介绍printf的移植,具体过程不再详细说了,详细过程参考:MSP430程序库<四>printf和scanf函数移植。这里主要介绍所需程序。
单片机printf使用需要用户提供底层驱动-putchar函数,printf完成格式化等一系列活动后调用putchar输出字符流。只要实现putchar,包含stdio.h文件,就可以使用printf函数。移植的数码管的putchar函数如下:
#include <stdio.h>
#include "ctype.h" /*isdigit函数需要该头文件*/
#include "Nixietube.h"
int putchar(int ch)
{
//'\f'表示走纸翻页,相当于清除显示
if(ch=='\n'||ch=='\r')
NixiettubeClear();
//数字和对应ASCII字母之间差0x30 '1'=0x31 '2'=0x32...
//isdigit也是C语言标准函数
if(isdigit(ch))
NixiettubeInsertChar(ch-0x30); //若字符是数字则显示数字
else //否则,不是数字,是字母
{
switch(ch) //根据字母选择程序分支
{
case 'A': case 'a': NixiettubeInsertChar(AA);break; //字符A
case 'B': case 'b': NixiettubeInsertChar(BB);break; //字符B
case 'C': case 'c': NixiettubeInsertChar(CC);break; //...
case 'D': case 'd': NixiettubeInsertChar(DD);break;
case 'E': case 'e': NixiettubeInsertChar(EE);break;
case 'F': case 'f': NixiettubeInsertChar(FF);break;
case 'G': case 'g': NixiettubeInsertChar(GG);break;
case 'H': case 'h': NixiettubeInsertChar(HH);break;
case 'I': case 'i': NixiettubeInsertChar(II);break;
case 'J': case 'j': NixiettubeInsertChar(JJ);break;
case 'K': case 'k': NixiettubeInsertChar(KK);break;
case 'L': case 'l': NixiettubeInsertChar(LL);break;
case 'M': case 'm': NixiettubeInsertChar(mm);break;
case 'N': NixiettubeInsertChar(NN);break;
case 'n': NixiettubeInsertChar(nn);break;
case 'O': NixiettubeInsertChar(OO);break;
case 'o': NixiettubeInsertChar(oo);break;
case 'P': case 'p': NixiettubeInsertChar(PP);break;
case 'Q': case 'q': NixiettubeInsertChar(QQ);break;
case 'R': case 'r': NixiettubeInsertChar(rr);break;
case 'S': case 's': NixiettubeInsertChar(SS);break;
case 'T': case 't': NixiettubeInsertChar(tt);break;
case 'U': case 'v': NixiettubeInsertChar(UU);break;
case 'V': case 'u': NixiettubeInsertChar(VV);break;
case 'W': case 'w': NixiettubeInsertChar(WW);break;
case 'Y': case 'y': NixiettubeInsertChar(YY);break; //...
case 'Z': case 'z': NixiettubeInsertChar(ZZ);break; //字符Z
case '-': NixiettubeInsertChar(NEG);break;//字符-
case '.': NixiettubeInsertChar(DOT);break;//小数点,直接显示在右下角
case ' ': NixiettubeInsertChar(SP);break; //空格
default : NixiettubeInsertChar(SP);break;//显示不出来的字母用空格替代
}
}
return(ch); //返回显示的字符(putchar函数标准格式要求返回显示字符)
}
头文件必须包含stdio.h,这样告诉编译器printf调用时,用这里的putchar函数。然后判断字符,分类进行显示,不能显示的空一格。
数码管的程序就完成了,如果需要可以自己添加改写函数,如:当和键盘共同使用时,如果键盘移植了scanf函数,并且支持退格;可以改写函数-让数码管的putchar支持退格操作。或者用的是我的键盘程序,需要10多ms调用一次键盘处理函数,这样可以和这个数码管扫描公用一个中断:
void Display()
{
static char i = 0; //记录扫描显示到哪位
CTRL_OUT = 1<<i;
DATA_OUT = Nixie[i];
i++;
if(i>7)
{
i = 0;
KeyProcess();
}
}
这样改写,然后把键盘的中断去掉(别忘了key.h包含和加入KeyProcess(); 的声明;如果程序中有两个指向同一个中断时,会编译错误);这样就可以键盘、和数码管共同使用了。
使用示例:
使用方法还是和之前一样,工程中加入Nixietube.c文件,然后在要调用的地方加入Nixietube.h的包含;如puchr函数,和示例工程的main.c
main.c调用的方式如下:
#include <msp430x16x.h>
#include <stdio.h>
#include "Nixietube.h"
void ClkInit()
{
char i;
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
IFG1&=~OFIFG; //清除振荡错误标志
while((IFG1&OFIFG)!=0)
{
for(i=0;i<0xff;i++);
IFG1&=~OFIFG; //清除振荡错误标志
}
BCSCTL2 |= SELM_2+SELS+DIVS_3; //MCLK为8MHz,SMCLK为1MHz
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
ClkInit();
NixiettubeInit();
_EINT();
//while(1)
{
NixiettubeDisplayChar(AA,5);
NixiettubeDisplayChar(DOT,5);
NixiettubeInsertChar(2);
NixiettubeInsertChar(DOT);
NixiettubeInsertChar(2);
printf("%1.2f",1.2);
}
}
包含msp430的头文件,以便使用430单片机的先关资源;加入stdio.h以使用printf函数;加入Nixietube.h使用数码管的相关程序。
还要注意,为了数码管正常显示,必须打开总中断,以使数码管动态扫描显示。另外,本程序单步调试看不到数码管正常显示,因为没有扫描。只有全速运行才可以看到数码管的显示情况。
通过以上的设置,就可通过MSP430来控制两位数码管显示任意的字符。
㈧ 使用msp430f6638怎样产生1mhz的时钟例程
msp430f149无法设置8M的主时钟作(MCLK)为定时器时钟源:TACTL |= TASSEL_2;它只能设置辅助时钟SMCLK作为定时器时钟源,不过它们本身没有什么区别,因为你可以吧辅助时钟SMCLK设为主时钟MCLK:BCSCTL2 |= SELS; 欢迎追问