新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > msp430DA應(yīng)用,可鍵盤程控

        msp430DA應(yīng)用,可鍵盤程控

        作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
        自己剛剛學(xué)習(xí)msp430不久,寫的一個(gè)小程序:

        就是應(yīng)用10位串行DA 5615將數(shù)字量轉(zhuǎn)化為模擬量,用數(shù)碼管顯示輸入10位二進(jìn)制數(shù)的數(shù)值。用矩陣建模控制10位二進(jìn)制數(shù)字量的輸入,我設(shè)置了+1、-1、+10、-10。然后從5615的out端輸出轉(zhuǎn)化得到的模擬量。

        本文引用地址:http://www.104case.com/article/201611/316338.htm

        //動(dòng)態(tài)顯示方式 P300
        //例如,要在8個(gè)數(shù)碼管上分別顯示"1""2""3""4",動(dòng)態(tài)掃描顯示的C語言程序如下(共陽極方式):

        //針對(duì)本開發(fā)板,修改了部分代碼

        #include
        //共陽數(shù)碼管的表格為:
        //本表格通過LEDSET軟件可以快速得到

        #define uchar unsigned char
        #define uint unsigned int

        unsigned char const dofly[]={0X84, 0XBD, 0XE0, 0XB0, 0X99, 0X92, 0X82, 0XBC, 0X80, 0X90, 0X88, 0X83, 0XC6, 0XA1, 0XC2, 0XCA };
        const uchar KeyCode[16]=
        {
        //0->key17
        0xE7,
        //1->key18
        0xD7,
        //2->key19
        0xB7,
        //3->key20
        0x77,
        //4->key21
        0xEB,
        //5->key22
        0xED,
        //6->key23
        0xDB,
        //7->key24
        0xDD,
        //8->key25
        0xBB,
        //9->key26
        0xBD,
        //10->key27
        0x7B,
        //11->key28
        0x7D,
        //12->key29
        0xEE,
        //13->key30
        0xDE,
        //14->key31
        0xBE,
        //15->key32
        0x7E
        };
        uchar KeyValue=0xFF;

        uchar keyscan(void);
        void delay(uint i);
        void da5615(uint da);

        void main(void)
        {
        uchar i=0;

        uint daben;
        uint love=0x66;
        WDTCTL = WDTPW + WDTHOLD; //停看門狗
        P6DIR |= 0x07; //P6.1,p6.2,p6.3輸出
        P4DIR = 0XFF;//P4作為段輸出
        P5DIR = 0X0F;//P5作為位輸出
        P4OUT = 0XFF;//熄滅所有數(shù)碼管
        P5OUT = 0X00;//熄滅所有數(shù)碼管
        P2DIR=0xF0;//P2.4 P2.5 P2.6 P2.7設(shè)置為輸出
        P2OUT=0x00;//使按鍵按下時(shí)能產(chǎn)生中斷
        P2IE=0x0F;//P2.0 P2.1 P2.2 P2.3中斷允許
        P2IES=0x0F;//P2.0 P2.1 P2.2 P2.3下降沿觸發(fā)中斷
        P1DIR |= BIT0+BIT1+BIT2;

        BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2開啟 LFXT1工作在低頻模式 ACLK不分頻 最高的標(biāo)稱頻率
        DCOCTL=DCO2+DCO1+DCO0;//DCO為最高頻率
        //初始化時(shí)鐘
        BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2開啟 LFXT1工作在低頻模式 ACLK不分頻 最高的標(biāo)稱頻率
        DCOCTL=DCO2+DCO1+DCO0;//DCO為最高頻率
        do
        {
        IFG1&=~OFIFG;//清除振蕩器失效標(biāo)志
        for(i=255;i>0;i--);
        }while(IFG1&OFIFG);//判斷XT2是否起振
        BCSCTL2=SELM1+SELS;//MCLK SMCLK時(shí)鐘源為TX2CLK不分頻

        _EINT();//打開中斷

        for(;;)
        {
        for(i=0;i<4;i++)
        {
        if(KeyValue==KeyCode[0])
        {
        KeyValue = 0xff;
        if(love+1>1023)love=1023;
        else love=love+1;
        delay(1000);
        }
        if(KeyValue==KeyCode[1])
        {
        KeyValue = 0xff;
        if(love<1)love=0;
        else love=love-1;
        delay(1000);
        }
        if(KeyValue==KeyCode[2])
        {
        KeyValue = 0xff;
        if(love+10>1023)love=1023;
        else love=love+10;
        delay(1000);
        }
        if(KeyValue==KeyCode[3])
        {
        KeyValue = 0xff;
        if(love<10)love=0;
        else love=love-10;
        delay(1000);
        }
        }
        delay(1000);
        da5615(love);
        daben=love;
        P4OUT =dofly[daben/1000];
        daben=daben%1000;
        P5OUT = 0x01;
        delay(1000);
        P4OUT =dofly[daben/100];
        daben=daben%100;
        P5OUT = 0x02;
        delay(1000);
        P4OUT =dofly[daben/10];
        daben=daben%10;
        P5OUT = 0x04;
        delay(1000);
        P4OUT =dofly[daben];
        P5OUT = 0x08; //點(diǎn)亮數(shù)碼管LED1,


        }
        }


        void delay(uint i)//延時(shí)函數(shù)
        {
        while(i--);
        }

        void da5615(uint da) //5615的驅(qū)動(dòng)程序,即產(chǎn)生10位二進(jìn)制數(shù)函數(shù)
        {

        uchar i;
        //uchar j; //此為實(shí)驗(yàn)程序便于觀察
        //uchar k; //此為實(shí)驗(yàn)程序便于觀察
        uint han;
        da<<=6;

        P1OUT=0xf9;
        P1OUT=0xf8;

        for (i=0;i<12;i++)
        {
        han=(da&0x8000);
        if(han==0x8000)
        {P1OUT|=0xf2;}
        else P1OUT&=0xfd;
        //for(j=0;j<8;j++){delay(60000);} //此為實(shí)驗(yàn)程序便于觀察

        P1OUT|=0xf1;
        da<<=1;
        P1OUT&=0xfe;

        }

        P1OUT|=0xf4;
        P1OUT&=0xfe;
        delay(1000);
        //for(k=0;k<8;k++)delay(40000); //此為實(shí)驗(yàn)程序便于觀察


        }


        #pragma vector=PORT2_VECTOR
        __interrupt void Port2INT(void)
        {
        uchar i;
        uchar colpos=0x70;//列位置
        uchar keytemp=0xff;

        for(i=255;i>0;i--);//延時(shí),消除抖動(dòng)

        for(i=0;i<4;i++)//掃描4列
        {
        colpos &= 0xf0;//保持P1.4~P1.7為輸出,屏蔽P1.0~P1.3
        P2OUT=colpos;//輸出列
        _NOP();//延時(shí)
        _NOP();
        keytemp=P2IN & 0x0f;//獲取值,屏蔽P1.4~P1.7
        keytemp |= colpos;//得到行列值,P1.0~1.3為行值,P1.4~P1.7為列值
        if((keytemp&0x0f)!=0x0f) KeyValue=keytemp;//判斷是否有按鍵按下
        colpos>>=1;//右移一位,進(jìn)行下一列掃描
        colpos|=0x80;//高位補(bǔ)1,因?yàn)槭堑洼敵鲇行В乙茣r(shí)高位是補(bǔ)0的
        }
        P2OUT=0x00;//恢復(fù)原來的值,使下次按鍵按下時(shí)能產(chǎn)生中斷

        P2IFG=0x00;//清除中斷標(biāo)志位
        }



        關(guān)鍵詞: msp430DA鍵盤程

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 天水市| 东光县| 永新县| 建昌县| 南投市| 盐山县| 盈江县| 广宗县| 大邑县| 白玉县| 兴文县| 五家渠市| 盐边县| 连平县| 云阳县| 滦平县| 乌拉特中旗| 沙坪坝区| 米林县| 永平县| 文昌市| 琼海市| 开平市| 新邵县| 嘉义市| 错那县| 茶陵县| 梨树县| 鄂尔多斯市| 漳平市| 石林| 晋江市| 松潘县| 额济纳旗| 象州县| 巴塘县| 平远县| 民和| 宣武区| 柘城县| 西安市|