久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

msp430單片機(jī)+HD7279A控制數(shù)碼管(IAR環(huán)境)

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年11月07日   【字體:


/***************************************************************************
IAR環(huán)境,HD7279A,P4.0~CS,P4.1~CLK,P4.2~DATA,P4,3~KAY,
DATA為串口數(shù)據(jù)口,時(shí)序圖如下:
CS:    ---------_________________________--------
CLK:   ___________---___---___---___---__________
DATA:  ---------~~~---~~~---~~~~---~~~-----------
由430將顯示數(shù)據(jù)一次性送到7279,再由7279顯示
通過(guò)定時(shí)器TimerA將數(shù)值不斷改變,當(dāng)主函數(shù)發(fā)現(xiàn)數(shù)值改變后,再將新的數(shù)值寫到
HD7279A中,這樣便起到了節(jié)約CPU資源的作用。數(shù)值由數(shù)碼管顯示,由于HD7279含有
寄存器的原因,所以只單片機(jī)將要顯示的數(shù)字和位置的信息傳給HS7279A即可顯示,而
無(wú)需單片機(jī)掃描。原創(chuàng)作品版權(quán)所有:http://www.zg4o1577.cn  
***************************************************************************/

#include "msp430x15x.h"

#define      DATADIR      P4DIR    //  定義端口方向
#define      DATAOUT      P4OUT    //  定義輸出端口

#define      CS_L         DATAOUT &= ~BIT0;  //  7279的片選輸出低電平
#define      CLK_L        DATAOUT &= ~BIT1;  //  7279的時(shí)鐘輸出低電平
#define      DATA_L       DATAOUT &= ~BIT2;  //  7279的數(shù)據(jù)輸出低電平

#define      CS_H         DATAOUT |= BIT0;  //  7279的片選輸出高電平
#define      CLK_H        DATAOUT |= BIT1;  //  7279的時(shí)鐘輸出高電平
#define      DATA_H       DATAOUT |= BIT2;  //  7279的數(shù)據(jù)輸出高電平
         
#define      DP           0X80    //  顯示小數(shù)點(diǎn)
#define      CMD_REST     0XA4    //  7279的復(fù)位命令
#define      CMD_LEFT     0XA1    //  7279的左移位命令
#define      CMD_RIGHT    0XA0    //  7279的讀緩沖命令

#define      CMD_MODE_1   0X80    // 按方式0譯碼
#define      CMD_MODE_2   0XC8    // 按方式1譯碼
#define      CMD_MODE_3   0X90    // 輸入數(shù)據(jù)不譯碼

#define      CMD_SHOW     0X88    // 閃爍

typedef unsigned int uint16;

char tab_num[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
                0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};

uint16 tym,tym_delay;

void delay_nop(uint16 u)                             // 延時(shí)多少個(gè)機(jī)器周期
{
  for(;u>0;u--)
    _NOP();
}

void Send_1_byte(char send)                          // 發(fā)送一個(gè)字節(jié)
{
  char temp,i; 
  CS_L;                                                             // 置低片選信號(hào)
  for(i=0;i<8;i++)
  {
    temp = send & 0x80;                                       // 發(fā)送高位
    if(temp!=0)   {DATA_H;}
    else          {DATA_L;}
    CLK_H;                                                             // 置高時(shí)鐘位
    send <<= 1;                                                         // 左移一位
    CLK_L;                                                                // 置低時(shí)鐘位
  }
  CS_H;                                                                 // 置高片選信號(hào)
}

void Send_2_byte(char send1,char send2)         // 發(fā)送兩個(gè)字節(jié)
{
   char temp,i;
   CS_L;
   for(i=0;i<16;i++)
   {
      if(i<8)      temp = send1 & 0x80;                      // 發(fā)送高位
      else         temp = send2 & 0x80;
      if(temp!=0)  {DATA_H;}                                   // 如果不為0,輸出高電位
      else         {DATA_L;}                                      // 如果為0,則輸出低電位
      CLK_H;                                                           // 置高時(shí)鐘位
      if(i<8)      send1 <<= 1;                                    // 左移一位
      else         send2 <<= 1;
      CLK_L;                                                           // 置低時(shí)鐘位
      if(i==7)     _NOP();
   }
  CS_H;                                                                 // 置高片選信號(hào) 
}

void Write7279()
{
//  char i;
//  Send_1_byte(0xbf);                                                                 // 用于測(cè)試
//  Send_1_byte(0xa4);                                                                //復(fù)位指令
  Send_2_byte(CMD_MODE_2|0X03,tab_num[tym/1000]);         //  取千位
  Send_2_byte(CMD_MODE_2|0X02,tab_num[tym/100%10]);    //  取百位
  Send_2_byte(CMD_MODE_2|0X01,tab_num[tym/10%10]);      //  取十位
  Send_2_byte(CMD_MODE_2|0X00,tab_num[tym%10]);           //  取個(gè)位
//  Send_1_byte(0xa1);                                                               //左移指令
 
}

void main( void )
{
  uint16 ram;
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  TACTL  = TASSEL_1 + TACLR + MC_1;  // + TAIE 時(shí)鐘源MCLK,增計(jì)模式,開總中斷,清除定時(shí)器
  CCTL0 |= CCIE;                //允許中斷
  CCR0   = 2000;               //設(shè)置寄存器的值
//  _EINT();                        //溢出中斷
  _BIS_SR(GIE);                //開總中斷
 
  DATADIR = 0X07;
  ram = tym;                     //使兩者的值相等
  Write7279();                   //顯示初始化
  while(1)
  {
    if(ram!=tym)                //當(dāng)tym的值有變動(dòng)時(shí),調(diào)用7279
    {
      Write7279();             //顯示新數(shù)值
      ram = tym;                 //使ram和tym的值相同,以確定下一次tym的值的變動(dòng)
    }
    delay_nop(1);              //延時(shí)一個(gè)機(jī)器周期
  }
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{
   tym_delay++;                                                                   //進(jìn)入中斷tym_delay的值加一
   if(tym_delay>=20)   {tym++;tym_delay=0;}                       //當(dāng)tym_delay為20時(shí),tym加一
   if(tym>1000)        tym = 0;                                                //當(dāng)tym為1000時(shí)清零
}
 

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 国产在线一区二区三区 | 国产精品区二区三区日本 | 一区二区三区四区视频 | 国产视频一二三区 | 久久久久精 | 午夜电影网 | 视频1区2区 | 色婷婷综合久久久中文字幕 | 欧美一级大片 | 久久久久久国 | 91极品欧美视频 | 黄色欧美 | 天天操天天舔 | av在线电影网 | 亚洲国产网站 | 欧美一区二区在线 | 91av导航| 久久久久国产一区二区 | 中文字幕一区二区三区不卡 | 欧美中文一区 | 中文字幕成人在线 | 亚洲精品久久久久久一区二区 | 国产精品久久久久久久久久免费 | 亚洲精品乱码久久久久久蜜桃91 | 国产婷婷精品 | 日韩精品视频在线免费观看 | 欧美久久天堂 | 韩国欧洲一级毛片 | 成人免费淫片aa视频免费 | 天天影视综合 | 在线观看av网站永久 | 在线观看免费av网站 | 欧美日韩专区 | 久久精品亚洲 | 久久国产欧美日韩精品 | 国产91网站在线观看 | 欧美日韩三级在线观看 | 欧美一二三 | 亚洲综合大片69999 | 精品av天堂毛片久久久借种 | 亚洲精品一区中文字幕乱码 |