新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 數碼管中斷實驗

        數碼管中斷實驗

        作者: 時間:2016-11-11 來源:網絡 收藏



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

        學習了低電平觸發與邊沿觸發的區別,不同中斷的使用。

        參考程序代碼如下


        #include
        #include
        #include "delay.h"
        #define uint unsigned int
        #define uchar unsigned char
        //uchar led7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共陰7段數碼管顯示0-9對應的8bit
        uchar led7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽7段數碼管顯示0-9對應的8bit
        uchar position[4]={0x01,0x02,0x04,0x08};//4片數碼管對應的片選bit
        uchar buffer[4];//每位需要顯示的數字都放在此數組中
        uchar time[2];//分,秒數組
        uchar timecounter;//計時循環

        void main(void)//主函數
        {
        uchar i;
        Init(); //初始化端口及接口
        time[0]=12; //初始化時間
        time[1]=34; //初始化時間
        DoBuffer(); //把2個十位數變為4個個位數
        init_devices();
        while(1)
        {
        Display(); //動態掃描時間為8ms

        if(timecounter++>100) //循環100次,即8*100約為1秒延時
        {
        timecounter=0;
        if(time[1]++>59) //秒加1,并且判斷是否為60
        {
        time[1]=0;
        if(time[0]++>59)//分加1,并且判斷是否為60
        {
        time[0]=0;
        }
        }
        DoBuffer();
        }
        }
        }

        void Init(void) //初始化設置
        {
        DDRA=0x0f; //設置端口A的低四位為輸出
        PORTA=0x08; //設置端口A的低四位為輸出為低電平
        DDRB=0xff; //設置端口B方向為輸出
        PORTB=0xff; //設置端口B輸出高電平
        }

        void Display(void)//掃描顯示函數,單個掃描時間為2ms
        {
        uchar i;
        for(i=0;i<4;i++)
        {
        PORTB=led7[buffer[i]]; //4個數轉成對應的8位顯示碼送PORTB
        PORTA=position[i]; //選擇1個8段碼進行顯示
        delay_ms(2); //延時5毫秒,1秒顯示25幀人眼是可以識別的,1/25=40ms,所以要小于40ms
        PORTA=0x00; //關閉
        }
        }

        void DoBuffer(void)//時間數字分位,2個2位數變為4個1位數
        {
        uint i,j=0; //j不能忘記賦值
        for(i=0;i<2;i++) //時間為2個2位數
        {
        buffer[j++]=time[i]/10; //共2次循環,第一次中,第1個2位數取出十位
        buffer[j++]=time[i]%10; //共2次循環,第一次中,第1個2位數取出個位
        }
        }

        #pragma interrupt_handler int0_isr:2
        void int0_isr(void) //INT0中斷程序
        {
        while(!(PIND&(1<{
        PORTB=led7[buffer[3]]; //輸出第4位數字
        PORTA=position[3]; //第4位數字片選開
        }
        }

        #pragma interrupt_handler int1_isr:3
        void int1_isr(void)
        {
        while(!(PIND&(1<{
        PORTB=led7[buffer[2]]; //輸出第3位數字
        PORTA=position[2]; //第3位數字片選開
        }
        }


        void init_devices(void)
        {
        CLI();//清除所有中斷標志
        MCUCR = 0x00;//INT0 INT1 下降沿產生中斷請求
        GICR=0xc0; //設置int0和int1中斷允許
        SEI(); //開全局中斷
        }



        關鍵詞: 數碼管中斷實

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 门源| 津市市| 岱山县| 凤山县| 依安县| 岳阳市| 深州市| 如东县| 云和县| 禹城市| 登封市| 灵山县| 获嘉县| 化州市| 宁国市| 浦城县| 五常市| 兴海县| 石阡县| 襄樊市| 和平区| 黎平县| 赤壁市| 江城| 美姑县| 锡林郭勒盟| 阿尔山市| 墨竹工卡县| 永安市| 铜川市| 宁海县| 那曲县| 衡水市| 龙岩市| 五华县| 登封市| 儋州市| 隆回县| 吉水县| 嘉定区| 溧水县|