|
- /***************************************************************************
- 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顯示
- 通過定時(shí)器TimerA將數(shù)值不斷改變,當(dāng)主函數(shù)發(fā)現(xiàn)數(shù)值改變后,再將新的數(shù)值寫到
- HD7279A中,這樣便起到了節(jié)約CPU資源的作用。數(shù)值由數(shù)碼管顯示,由于HD7279含有
- 寄存器的原因,所以只單片機(jī)將要顯示的數(shù)字和位置的信息傳給HS7279A即可顯示,而
- 無需單片機(jī)掃描。
- ***************************************************************************/
- #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í)清零
- }
復(fù)制代碼
|
|