導航:首頁 > 編程語言 > msp430數碼管時鍾程序

msp430數碼管時鍾程序

發布時間:2023-02-04 07:03:04

㈠ 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; 歡迎追問

閱讀全文

與msp430數碼管時鍾程序相關的資料

熱點內容
c語言12位的數據應該怎麼存儲 瀏覽:953
將ape導入iphone 瀏覽:107
js組合快捷鍵 瀏覽:174
linux系統盤默認掛在的文件夾 瀏覽:667
淘寶數據包如何操作上架 瀏覽:567
vb編程中輸入cls是什麼意思 瀏覽:81
linuxtime服務 瀏覽:184
瘋狂安卓講義第二版代碼 瀏覽:420
老炮兒三小時版本下載 瀏覽:313
matlab怎麼調試程序 瀏覽:2
winxp升級win7的危害 瀏覽:496
網路沒連上卻不可用是怎麼回事 瀏覽:752
社區版本 瀏覽:738
怎麼查微信公眾號什麼時候開通的 瀏覽:717
安裝三菱編程閃退怎麼回事 瀏覽:488
手機怎麼創建word文件格式 瀏覽:694
c語言連接資料庫 瀏覽:887
數據線粉色和白色哪個是正 瀏覽:775
vb編程應注意什麼 瀏覽:855
js循環添加控制項 瀏覽:615

友情鏈接