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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1846|回復: 0
打印 上一主題 下一主題
收起左側

秒表程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:325084 發表于 2018-5-8 15:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*
****************************************************************************
* 程序說明 ;使數碼管依次顯示0-8
****************************************************************************
*/
#include "io430.h"
#define uint unsigned int
#define uchar unsigned char
#define KeyPort         P1IN    //獨立鍵盤接在P60~P63
#define CPU_F ((double)1000000)
#define DelayUs(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define DelayMs(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define KEY1  1
#define KEY2  2
#define KEY3  3
#define KEY4  4
#define KEY5  5
uchar KeyScan(void);
#define SMG_DATA    P4OUT           //573位選信號的輸入管腳
#define SMG_WEI  P5OUT
//#define CLK_H       P6OUT|=BIT6     //595時鐘信號的輸入置高
//#define CLK_L       P6OUT&=~BIT6    //595時鐘信號的輸入置低
//#define ST_H        P6OUT|=BIT5     //595鎖存信號置高
//#define ST_L        P6OUT&=~BIT5    //595鎖存信號置低
//#define DATA_H      P6OUT|=BIT4    //595數據信號輸入置高
//#define DATA_L      P6OUT&=~BIT4    //595數據信號置低
//#define LED_E0      P5OUT&=~BIT7     //數碼管 573使能置低
//#define LED_E1      P5OUT|=BIT6     //點陣 573使能置高
uchar uc7leds[17]={0x3f,0x06,0x5b,0x4f,   //0,1,2,3,
                   0x66,0x6d,0x7d,0x07,          //4,5,6,7,
                   0x7f,0x6f,0x77,0x7c,          //8,9,A,b,
                   0x39,0x5e,0x79,0x71,0x00};  //C,d,E,F
uchar jishu=0;
uchar mode=1;
uchar downtime=1;
void PortInit();
uchar number[4] = {0,0,0,0};
void ClockInit();
void display();
void TimerAInit();
void fentime(int num);
void fenshu(int num);
void main()
{
  uint b;
  WDTCTL=WDTPW+WDTHOLD;
  ClockInit();    //時鐘初始化
  TimerAInit();
  PortInit();
  uchar jishi=0;
  uchar keyvalue=0;
  uchar zhu=1;  
  uchar wait=1;
  uchar mode2start=0;
  
  while(1)
  {
    if(b==0)  
      keyvalue=KeyScan();
    //*
    if(zhu==1)
    {
      if(keyvalue==5)
        zhu=0;        
      if(keyvalue==4)
        mode++;
      if(mode==4)
        mode=1;
        number[0]=mode+9;
        number[1]=16;
        number[2]=16;
        number[3]=16;      
    }

    else if(mode==1)
    {
      if(wait)
      {
        fentime(0);
        wait=0;
      }
      if(keyvalue==1)
      {
        jishi=!jishi;
        if(jishi)
          TACTL=TASSEL_1+MC_1+ID_3+TAIE;
        else
          TACTL=TASSEL_1+MC_0+ID_3+TAIE;        
      }
   }
   else if(mode==2)
   {
     if(!mode2start)
     {
       if(wait)
       {
         fentime(60);
         wait=0;
       }
       else
       {  
         if(keyvalue==4)
         {
         downtime++;
         fentime(downtime*60);
         }
         if(keyvalue==1)
         {
           mode2start=1;
           TACTL=TASSEL_1+MC_1+ID_3+TAIE;
         }
       }
     }
     else
     {
      
     }      
   }
   if(keyvalue==2)
   {
      jishi=0;
      keyvalue=0;
      zhu=1;  
      wait=1;
      mode2start=0;
      jishu=0;
      mode=1;
      downtime=1;
      TACTL=TASSEL_1+MC_0+ID_3+TAIE+TACLR;
      P2OUT_bit.P0=0;   
     
   }
   


    display();
    if(keyvalue!=0)
    {
      b=0x8fff;
      keyvalue=0;      
    }
    if(b!=0)
      b--;
  }
}

/*
****************************************************************************
*                         PortInit()
* 功能說明 ;IO初始化
*   參數   :無
* 返回值   :無
****************************************************************************
*/
void PortInit()
{
  P4SEL=0X00;//普通
  P4DIR=0XFF;//輸出
  P5SEL=0X00;//普通
  P5DIR=0XF0;//輸出  
  P5OUT=0XFF;
  P2SEL = 0x00;   //設置IO口為普通I/O模式
  P2DIR = 0x01;   //設置IO口方向為輸出
  P2OUT = 0x00;   //初始設置為00,即都為低電平
  P1SEL = 0x00;
  P1DIR = 0x00;
  P4OUT=uc7leds[0];
  //P6SEL=0X00;
  //P6DIR=0XFF;
  //P5SEL=0X00;
  //P5DIR=0XFF;
  //LED_E1;
  //LED_E0;
}


/*
****************************************************************************
*                         TimerAInit()
* 功能說明 ;定時器A初始化
*   參數   :無
* 返回值   :無
****************************************************************************
*/

void TimerAInit()
{
TACTL=TASSEL_1+MC_0+ID_3+TAIE;//選擇ACK,增計數模式,8分頻,使能定時器中斷
CCR0=4095;
  __enable_interrupt();
}

void ClockInit()
{
  uchar i;

  BCSCTL1&=~XT2OFF;   //設置XT2為有效
  BCSCTL2|=SELM1+SELS;
  do{
    IFG1&=~OFIFG;   //清除振蕩器失效標志
    for(i=0;i<100;i++)
       __no_operation();
  }while((IFG1&OFIFG)!=0);    //如果振蕩失效標志存在則繼續循環
  IFG1&=~OFIFG;
}





/*
****************************************************************************
*                         TimerA()
* 功能說明 ;定時器A中斷處理程序
*   參數   :無
* 返回值   :無
****************************************************************************
*/
#pragma vector = TIMERA1_VECTOR
__interrupt void TimerA(void)
{
  switch(TAIV)
  {
case 2:break;
case 4:break;
case 10:
        jishu++;
        if(mode==1)
        {
          fentime(jishu);
        }
        else if(mode==2)
        {
          fentime(downtime*60-jishu);
          if(!(downtime*60-jishu))
          {
            P2OUT_bit.P0=1;
            TACTL=TASSEL_1+MC_0+ID_3+TAIE;            
          }
        }
        break;
  }
}
/*
****************************************************************************
*                       uchar KeyScan(void)
* 功能說明 ;按鍵檢測
*   參數   :無
* 返回值   :KeyNum:按下的按鍵值
****************************************************************************
*/
uchar KeyScan(void)
{
  uchar keycode;
    static uchar sta=0;       //不支持連續按
    //uchar sta=0;                //支持連按
    uchar tmp=0;
   
    P1DIR  |= 0X1f;
    P1OUT = 0X1f;
    P1DIR  &=  0xe0;    //設置P10 P11 P12為輸入
    if(sta==0)                  //sta=0 時檢測按鍵是否按下
    {
         if((P1IN&0X1f)!=0X1f)     // 掃描按鍵
         {
            DelayMs(10);
            if((P1IN&0X1f)!=0X1f)  //確認按鍵按下
            {
              
              keycode=(P1IN&0X1f);
              switch(keycode)           //確認按鍵
              {               
              case 0x1e:tmp=1;;break;
              case 0x1d:tmp=2;;break;
              case 0x1b:tmp=3;;break;
              case 0x17:tmp=4;;break;
              case 0x0f:tmp=5;;break;
              default : ;break;
            }
            sta=1;
            }
            
         }
    }
   
   else if((P1IN&0X1f)!=0X1f)   // 確定按鍵是否松開
    {
      DelayMs(10);
      if((P1IN&0X1f)!=0X1f)     //若是按鍵松開,sta = 0;
        sta=0;
    }
   
   return tmp;          //返回按下的按鍵數

}

void fenshu(int num)
{
  number[0]=num%10;
  number[1]=(num%100)/10;
  number[2]=(num%1000)/10;
  number[3]=num/1000;  
}
void fentime(int num)
{
  number[0]=(num%60)%10;
  number[1]=(num%60)/10;
  number[2]=(num/60)%10;
  number[3]=(num/60)/10;   
}

void display()           //數碼管顯示
{
        static uchar i=0;
        i++;
        if(i >= 4)
                i = 0;        
        P4OUT =0x00;                //消隱
        switch(i)               //位選
        {
                case 3: SMG_WEI=0x10; break;
                case 2: SMG_WEI=0x20; break;
                case 1: SMG_WEI=0x40; break;
                case 0: SMG_WEI=0x80; break;
        }        
        P4OUT = uc7leds[number];
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美综合一区二区 | 欧美精品一区二区蜜桃 | 久久里面有精品 | 欧美成视频 | 91福利网| 一区二区三区日本 | 成人性生交大片免费看r链接 | 国产一区二区在线播放 | 成人字幕网zmw| 日韩高清中文字幕 | 欧美日韩高清在线观看 | 草久久 | 久草福利 | 精品国产乱码久久久久久丨区2区 | 91精品国产色综合久久不卡蜜臀 | 另类一区 | 九九热视频这里只有精品 | 91看片免费 | 久久久久中文字幕 | 免费看国产片在线观看 | 欧美综合一区 | 中文字幕精品视频在线观看 | 久久久综合久久 | 日日日干干干 | 男人阁久久 | 欧美日韩综合 | 欧美日韩久久久久 | 亚洲精品一 | 日韩三级| 国产免费一区二区三区最新6 | 免费一区二区三区 | 断背山在线观看 | 日操操| 黄色国产在线播放 | 国产成人一区在线 | 四虎影视一区二区 | 欧美激情在线一区二区三区 | 久久一区二区免费视频 | 免费一级黄色 | 人人性人人性碰国产 | 亚洲欧美视频一区二区 |