<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Atmega16單片機(jī)實(shí)用程序

          Atmega16單片機(jī)實(shí)用程序

          作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
          /*********************************************************************
          MCU: ATmega16
          外部晶振: 8MHz
          程序功能: 4*4鍵盤識別,LED七段數(shù)碼管顯示,密碼功能模塊,直流電機(jī)正反轉(zhuǎn)控制
          AD轉(zhuǎn)換模塊, 模擬比較器,外部中斷應(yīng)用,12864液晶,C/T0
          硬件設(shè)計(jì): 參考PROTUES硬件仿真電路
          調(diào)試: 所有程序主要功能都軟硬件仿真通過,實(shí)際使用時(shí)要根據(jù)需要加入可靠性。
          編譯環(huán)境: 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,//共陽數(shù)據(jù);
          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延時(shí)子函數(shù)
          功能:延時(shí)指定的ms
          *********************************************************************/
          void delayms(int ms)
          {
          int i,j;
          for(i=ms;i>0;i--)
          {
          for(j=1722;j>0;j--); //8M時(shí)改為1141;
          } //12M時(shí)為1722;
          }
          /*******************************************************************
          名稱:us延時(shí)子程序
          功能:延時(shí)指定的us
          ********************************************************************/
          void delayus(uchar us)
          {
          for(us;us<0;us--);
          {
          } //12M時(shí)單位T為1.45US
          }
          /********************************************************************
          單參數(shù)LED 顯示
          硬件連接:數(shù)據(jù)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++) //顯示的位數(shù)為5
          {
          curnum = tmpnum % 10;
          tmpnum = tmpnum / 10;
          PORTD = tmp;
          PORTC = date[curnum];
          delayus(1);
          tmp = (tmp << 1) + 0x01; //補(bǔ)上移位造成的最右位為0;
          }
          }
          /*******************************************************
          名稱:七段LED共陽數(shù)碼管,在指定數(shù)位上顯示指定的數(shù),雙參數(shù)
          功能:在指定的位置上顯示制定的數(shù);
          硬件連接:PC口複用控制段選和位選,有2片573進(jìn)行數(shù)據(jù)鎖存;
          *******************************************************/
          void show(uchar dat,uchar num) //六位七段數(shù)碼管顯示程序OK;
          {
          PORTC=date[dat];
          PORTD|=BIT(0);
          PORTD&=~BIT(0); //送數(shù)據(jù);
          delayus(2);
          PORTC=0X00;
          delayus(1);
          PORTC=duan[num];
          PORTD|=BIT(1);
          delayus(2);
          PORTD&=~BIT(1);
          delayus(2);
          } //送選通信號;
          /************************************************************
          名稱:MCU端口初始化
          功能:設(shè)置MCU端口初始方向?yàn)檩敵龀跏紶顟B(tài)為低
          *************************************************************/
          void Gpioinit0()
          {
          DDRA=0XFF;
          PORTA=0X00;
          DDRB=0XFF;
          PORTB=0X00;
          DDRC=0XFF;
          PORTC=0X00;
          DDRD=0XFF;
          PORTD=0X00;
          }
          /***********************************************************
          名稱:MCU端口初始化
          功能:設(shè)置MCU端口初始為輸出初始狀態(tài)為高
          ************************************************************/
          void Gpioinit1()
          {
          DDRA=0Xff;
          PORTA=0XFF;
          DDRB=0xff;
          PORTB=0XFF;
          DDRC=0xff;
          PORTC=0XFF;
          DDRD=0xff;
          PORTD=0XFF;
          }
          /**************************************************
          名稱:單端口測試
          輸入:測試PC的任意端口號0~7
          功能:週期改變一個(gè)端口的電平
          **************************************************/
          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); //此處要加上適當(dāng)延時(shí)否則讀不到端口信息;
          key=PINB;
          key&=0x0f; //按下返回1,否則為0;
          if(key==0x0f)
          {
          return 0;
          }
          else
          return 1;
          }
          /***************************************************
          名稱:4*4矩陣按鍵掃描子程序
          功能:掃描一個(gè)4*4矩陣案件,比返回相應(yīng)按鍵值;
          硬件連接:PB0~PB3為行;PB4~pb7為列;
          ***************************************************/
          uchar keyscan() //4*4鍵盤掃面程序,調(diào)試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); //延時(shí)2毫秒,讀列狀態(tài);
          keycode=PINB;
          keycode&=0x0f; //讀列狀態(tài),屏蔽行狀態(tài);
          DDRB=0XFF;
          PORTB=0XF0;
          DDRB=0X0F;
          delayus(10);
          PINB&=0Xf0; //讀行狀態(tài),屏蔽列狀態(tài);
          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 下一頁

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();