74HC164數碼管顯示 msp430g2553IAR:
74HC164數碼管顯示.zip
(164.57 KB, 下載次數: 10)
2016-3-30 19:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
- #include"io430.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define CLK0 P1OUT&=~BIT6
- #define CLK1 P1OUT|=BIT6
- #define hc_sr040 P1OUT&=~BIT4
- #define hc_sr041 P1OUT|=BIT4
- #define CPU_F ((double)1000000) //外部高頻晶振16MHZ
- //#define CPU_F ((double)32768) //外部低頻晶振32.768KHZ
- #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
- #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
- unsigned char const code_hex[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x79,0x0e,0x3e};//0,1,2,3,4,5,6,7,8,9,c,e,j,u
- uchar t;
- uchar hc_sr04_cishu,hc_sr04_flag;
- uchar xianshi_flag;
- float hc_sr04_time;
- uint xishu;
- uchar dis_play[4]={10,11,12,13};
- void extern_16m()
- {
- WDTCTL = WDTPW + WDTHOLD;
- if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF)
- {
- while(1); // If calibration constants erased, trap CPU!!
- }
- DCOCTL |= DCO0 + DCO1+DCO2; //SMCLK選擇LFXT1CLK
- // BCSCTL2 |= SELM_0;//MCLK采用1M的內部DCO
- // BCSCTL2 |= DIVS_0;//SMCLK采用內部的時鐘
- }
- void hc164_init()
- {
- P1DIR |=BIT6+BIT7+BIT0+BIT1+BIT2+BIT3; // P1.0 output
-
- }
- void hc_sr04()
- {
- P1DIR |=BIT4;
- P1DIR &=~BIT5;
- P1IE |=0x20; //上升沿觸發
- P1IES |=0x00;
- hc_sr04_flag=3;//默認準備發射狀態
- }
- void sendbyte(uchar byte)
- {
- uchar c,num;
- num=byte;
- for(c=0;c<8;c++)
- {
- P1OUT&=~0x80;
- CLK0;
- P1OUT|=num&0x80; //(0x80即十進制的128, 二進制的10000000 按位發送
- CLK1;
- num<<=1;
- }
- }
- void send_char(uchar weizhi,uchar byte)
- {
-
- P1OUT |= 0x0f;
- uchar c,send_byte;
- send_byte=code_hex[byte];
- if((weizhi==0)&&(xianshi_flag==0))
- send_byte|=0x80;
- if((weizhi==1)&&(xianshi_flag==1))
- send_byte|=0x80;
- sendbyte(send_byte);
- c=weizhi&0x03;
- P1OUT&=~(1<<c);
- }
- void init_TA()
- {
-
- TACCR0 = 5000; //4ms中斷一次
- TACTL = TASSEL_2 + MC_1; // SMCLK, upmode,8分頻,
- TACCTL0 = CCIE; // TACCR0 interrupt enabled
- }
- void shumaguan()
- {
- ++t;
- if(t>=4)
- t=0;
- send_char(t,dis_play[t]);
- }
- #pragma vector=TIMER0_A0_VECTOR
- __interrupt void TIMERA0_ISR() // the interrupt source is CC0
- {
- shumaguan();
- hc_sr04_cishu++;
- if(( hc_sr04_flag==3)&&(hc_sr04_cishu==100))//500ms測距一次
- {
- hc_sr041;
- P1IE |=0x20;
- delay_us(10);
- hc_sr040;
- }
-
- if(hc_sr04_flag==2)
- {
- float juli;
- uint juli1;
- juli=(float)(hc_sr04_time/5.8139);
- juli1=(uint)(juli);
- if(juli1<10000)
- {
- xianshi_flag=0;
- dis_play[0]=(juli1/1000);
- dis_play[1]=(juli1%1000/100);
- dis_play[2]=(juli1%1000%100/10);
- dis_play[3]=(juli1%10);
- }
- else
- {
- xianshi_flag=1;
- dis_play[0]=(juli1/10000);
- dis_play[1]=(juli1%10000/1000);
- dis_play[2]=(juli1%10000%1000/100);
- dis_play[3]=(juli1%10000%1000%100/10);
- }
- hc_sr04_flag=3;
- hc_sr04_cishu=0;
-
- }
- }
- #pragma vector =PORT1_VECTOR
- __interrupt void Port_1(void)
- {
- switch(P1IES&0x20)
- {
- case 0:TAR=0;P1IES=0x20;hc_sr04_flag=1;hc_sr04_cishu=0;break;
- case 0x20:hc_sr04_time=5000*hc_sr04_cishu+TAR;P1IES=0;hc_sr04_flag=2;P1IE &=~0x20;break;
- }
- P1IFG=0;
-
- }
復制代碼
|