新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Atmega16單片機實用程序

        Atmega16單片機實用程序

        作者: 時間:2016-12-01 來源:網絡 收藏
        /*********************************************************************
        MCU: ATmega16
        外部晶振: 8MHz
        程序功能: 4*4鍵盤識別,LED七段數碼管顯示,密碼功能模塊,直流電機正反轉控制
        AD轉換模塊, 模擬比較器,外部中斷應用,12864液晶,C/T0
        硬件設計: 參考PROTUES硬件仿真電路
        調試: 所有程序主要功能都軟硬件仿真通過,實際使用時要根據需要加入可靠性。
        編譯環境: ICC AVR
        Design by: wdw
        ********************************************************************/
        #include
        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        #define SET_1(a,b) a|=bit(b) //將寄存器a的第b位置1
        #define CLR_0(a,b) a&=~bit(b) //將寄存器a的第b位清0
        #program date code:
        const date[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,//共陽數據;
        0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
        #program duan code:
        const duan[]={0x20,0x10,0x08,0x04,0x02,0x01}; //段選;
        char adchannel;
        int dispbuf[]={0,0,0,0,0,0,}; //顯示緩存;
        uchar securbuf[]={0,0,0,0,0,}; //5位密碼緩存;
        /********************************************************************
        名稱:ms延時子函數
        功能:延時指定的ms
        *********************************************************************/
        void delayms(int ms)
        {
        int i,j;
        for(i=ms;i>0;i--)
        {
        for(j=1722;j>0;j--); //8M時改為1141;
        } //12M時為1722;
        }
        /*******************************************************************
        名稱:us延時子程序
        功能:延時指定的us
        ********************************************************************/
        void delayus(uchar us)
        {
        for(us;us<0;us--);
        {
        } //12M時單位T為1.45US
        }
        /********************************************************************
        單參數LED 顯示
        硬件連接:數據PORTC-----D7~D0
        段選PORTD-----D7~D4
        *********************************************************************/
        void LEDShow(long int shownum)
        {
        uchar i,tmp,curnum;
        long int tmpnum;
        tmp = 0xfb;
        tmpnum = shownum;
        for(i=0;i<6;i++) //顯示的位數為5
        {
        curnum = tmpnum % 10;
        tmpnum = tmpnum / 10;
        PORTD = tmp;
        PORTC = date[curnum];
        delayus(1);
        tmp = (tmp << 1) + 0x01; //補上移位造成的最右位為0;
        }
        }
        /*******************************************************
        名稱:七段LED共陽數碼管,在指定數位上顯示指定的數,雙參數
        功能:在指定的位置上顯示制定的數;
        硬件連接:PC口複用控制段選和位選,有2片573進行數據鎖存;
        *******************************************************/
        void show(uchar dat,uchar num) //六位七段數碼管顯示程序OK;
        {
        PORTC=date[dat];
        PORTD|=BIT(0);
        PORTD&=~BIT(0); //送數據;
        delayus(2);
        PORTC=0X00;
        delayus(1);
        PORTC=duan[num];
        PORTD|=BIT(1);
        delayus(2);
        PORTD&=~BIT(1);
        delayus(2);
        } //送選通信號;
        /************************************************************
        名稱:MCU端口初始化
        功能:設置MCU端口初始方向為輸出初始狀態為低
        *************************************************************/
        void Gpioinit0()
        {
        DDRA=0XFF;
        PORTA=0X00;
        DDRB=0XFF;
        PORTB=0X00;
        DDRC=0XFF;
        PORTC=0X00;
        DDRD=0XFF;
        PORTD=0X00;
        }
        /***********************************************************
        名稱:MCU端口初始化
        功能:設置MCU端口初始為輸出初始狀態為高
        ************************************************************/
        void Gpioinit1()
        {
        DDRA=0Xff;
        PORTA=0XFF;
        DDRB=0xff;
        PORTB=0XFF;
        DDRC=0xff;
        PORTC=0XFF;
        DDRD=0xff;
        PORTD=0XFF;
        }
        /**************************************************
        名稱:單端口測試
        輸入:測試PC的任意端口號0~7
        功能:週期改變一個端口的電平
        **************************************************/
        void IOtest(uchar num)
        {
        DDRC|=BIT(num);
        // while(1)
        // {
        PORTC|=BIT(num);
        delayms(50);
        PORTC&=~BIT(num);
        delayms(50);
        // }
        }
        /*************************************************
        名稱:按鍵動作檢測子程序。
        功能:檢測4*4鍵盤是否有鍵按下;
        硬件連接:PB0~PB3為行;PB4~pb7為列;
        *************************************************/
        uchar key_press()
        {
        uchar key;
        DDRB=0XFF;
        PORTB=0X0F;
        DDRB=0XF0;
        delayms(2); //此處要加上適當延時否則讀不到端口信息;
        key=PINB;
        key&=0x0f; //按下返回1,否則為0;
        if(key==0x0f)
        {
        return 0;
        }
        else
        return 1;
        }
        /***************************************************
        名稱:4*4矩陣按鍵掃描子程序
        功能:掃描一個4*4矩陣案件,比返回相應按鍵值;
        硬件連接:PB0~PB3為行;PB4~pb7為列;
        ***************************************************/
        uchar keyscan() //4*4鍵盤掃面程序,調試0K;
        {
        uchar keycode,keynum;
        do{
        }while(key_press()==0); //按鍵是否按下?
        asm("nop");
        asm("nop");
        while(key_press()==1)
        {
        DDRB=0XFF; //PB0~PB3為列,PB4~PB7為行;
        PORTB=0X0F; //列輸出高電平,行輸出低電平;
        DDRB=0XF0;
        delayus(10); //延時2毫秒,讀列狀態;
        keycode=PINB;
        keycode&=0x0f; //讀列狀態,屏蔽行狀態;
        DDRB=0XFF;
        PORTB=0XF0;
        DDRB=0X0F;
        delayus(10);
        PINB&=0Xf0; //讀行狀態,屏蔽列狀態;
        keycode|=PINB;
        delayus(10);
        do{
        }while(key_press()==1); //按鍵是否釋放;
        switch(keycode)
        {
        case 0xee:
        keynum=0;
        break;
        case 0xde:
        keynum=1;
        break;
        case 0xbe:
        keynum=2;
        break;
        case 0x7e:
        keynum=3;
        break;
        case 0xed:
        keynum=4;
        break;
        case 0xdd:
        keynum=5;
        break;
        case 0xbd:
        keynum=6;
        break;
        case 0x7d:
        keynum=7;
        break;
        case 0xeb:
        keynum=8;
        break;
        case 0xdb:
        keynum=9;
        break;
        case 0xbb:
        keynum=10;
        break;
        case 0x7b:
        keynum=11;
        break;
        case 0xe7:
        keynum=12;
        break;
        case 0xd7:
        keynum=13;
        break;
        case 0xb7:
        keynum=14;
        break;
        case 0x77:
        keynum=15;
        break;
        default :
        keynum=16;
        break;
        }
        }
        return keynum;
        }

        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 舞阳县| 南宫市| 安图县| 岗巴县| 新平| 电白县| 昌平区| 大庆市| 旬邑县| 东乡县| 昭平县| 甘肃省| 曲水县| 家居| 二连浩特市| 咸宁市| 颍上县| 哈尔滨市| 屯门区| 绩溪县| 西平县| 罗田县| 望奎县| 固安县| 孟连| 曲松县| 平度市| 泗洪县| 盐池县| 岳阳县| 闸北区| 威远县| 桦川县| 随州市| 巴里| 凤山县| 房产| 汤原县| 邵武市| 泸溪县| 荥经县|