專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

AVR單片機(jī)綜合流水燈C程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年06月15日   【字體:

     端午節(jié)哪里都沒有去,自己焊了塊實(shí)驗(yàn)板,就是研究了一下AVR單片機(jī),因?yàn)榍懊嬉荒陼r(shí)間里一直苦戰(zhàn)51單片機(jī),有了一定的基礎(chǔ),所以看了一下視頻,原來 AVR單片機(jī)主要有三個(gè)寄存器設(shè)置IO口,DDR(X)、PORT(X) BIT(X)等寄存器,至于其它的編程思想,我認(rèn)為和51那些差不多,看來前輩說得對(duì)啊,“學(xué)會(huì)了一種單片機(jī),學(xué)其它的很容易入手”,今天總算得到了驗(yàn)證,于是寫出了下面的流水燈程序!

#include <iom16v.h>//AVR單片機(jī)頭文件包含
#define uchar unsigned char//宏定義
#define uint unsigned int//
/*************************************************************/
/*********************延時(shí)子程序******************************/
/*************************************************************/
void delay(uint z)//一個(gè)帶參數(shù),不帶返回值的子函數(shù)
{
 uint x,y;//定義兩個(gè)變量
 for(x=0;x<100;x++)//外循環(huán)
 for(y=z;y>0;y--);//內(nèi)循環(huán)
}
/*************************************************************/
/*********************左移流水燈******************************/
/*************************************************************/
void zouyi()
{
  uchar shu,j;//定義兩個(gè)變量,shu表示要存的數(shù),j表示循環(huán)變量
  shu=0x01;//先將數(shù)變量賦值,即讓左邊第1顆燈亮起
  for(j=0;j<9;j++)//循環(huán)9次
  {
    PORTA=~shu;//將要顯示的數(shù)給寄存器
 delay(3550);//調(diào)用延時(shí)子程序
 shu<<=1;//將要顯示的數(shù)左移1位,這樣就形成了左移
  }
}
/*************************************************************/
/*********************右移流水燈******************************/
/*************************************************************/
void youyi()
{
 uchar shu,j;//定義兩個(gè)變量,shu表示要存的數(shù),j表示循環(huán)變量
  shu=0x80;//先將數(shù)變量賦值,即讓右邊第1顆燈亮
  for(j=0;j<9;j++)//循環(huán)9次
  {
    PORTA=~shu;//將要顯示的數(shù)給寄存器
 delay(3550);//調(diào)用延時(shí)子程序
 shu>>=1;//將要顯示的數(shù)右移1位,這樣就形成了右移
  }
}
/*************************************************************/
/*********************左移跑馬燈******************************/
/*************************************************************/
void zoupao()
{
  uchar shu,j;//定義兩個(gè)變量,shu表示要存的數(shù),j表示循環(huán)變量
  shu=0xfe;//先將數(shù)變量賦值,即讓左邊第1顆燈亮
  for(j=0;j<9;j++)//循環(huán)9次
  {
    PORTA=shu;//將要顯示的數(shù)給寄存器
 delay(1000);//調(diào)用延時(shí)子程序
 shu<<=1;//將要顯示的數(shù)左移1位,這樣就亮起2顆燈.....3顆燈
  }            
}
/*************************************************************/
/*********************右移跑馬燈******************************/
/*************************************************************/
void youpao()
{
 uchar shu,j;//定義兩個(gè)變量,shu表示要存的數(shù),j表示循環(huán)變量
 shu=0x7f;//先將數(shù)變量賦值,即讓右邊第1顆燈亮
  for(j=0;j<9;j++)//循環(huán)9次
  {
    PORTA=shu;//將要顯示的數(shù)給寄存器
 delay(1000);//調(diào)用延時(shí)子程序
 shu>>=1;//將要顯示的數(shù)右移1位,這樣就亮起2顆燈.....3顆燈
  }   
}
/*************************************************************/
/******************中間到兩邊跑馬燈***************************/
/*************************************************************/
void zhongjian()
{
 uchar shu,j;//定義兩個(gè)變量,shu表示要存的數(shù),j表示循環(huán)變量
 shu=0x08;//先將數(shù)變量賦值,即中間那顆LED亮
  for(j=0;j<6;j++)//循環(huán)6次
  {
    PORTA=~shu;//將要顯示的數(shù)給寄存器
 delay(2000);//調(diào)用延時(shí)子程序
 shu<<=1;//將要顯示的數(shù)左移1位,這樣就形成了從中間到左邊亮起
  } 
  shu=0x08;//先將數(shù)變量賦值,即中間那顆LED亮
  for(j=0;j<5;j++)//循環(huán)5次
  {
    PORTA=~shu;//將要顯示的數(shù)給寄存器
 delay(2000);//調(diào)用延時(shí)子程序
 shu>>=1;//將要顯示的數(shù)右移1位,這樣就形成了從中間到右邊亮起
  }    
}
/*************************************************************/
/************************主程序*******************************/
/*************************************************************/
void main()
{
 uchar shu,j;//定義兩個(gè)變量,shu表示要存的數(shù),j表示循環(huán)變量
 DDRA=0xff;//設(shè)置PA口全為輸出口
 while(1)//大循環(huán)
 {
  zouyi();//調(diào)用左流水燈子程序
  youyi();//調(diào)用右流水燈子程序
  zoupao();//調(diào)用左跑馬燈子程序
  youpao();//調(diào)用右跑燈子程序
  zhongjian();//調(diào)用從中間到兩邊流水燈子程序
  zoupao();//調(diào)用左跑馬燈子程序
  zhongjian();//調(diào)用從中間到兩邊流水燈子程序
  youyi();//調(diào)用右流水燈子程序
  zouyi();//調(diào)用左流水燈子程序
  zhongjian();//調(diào)用從中間到兩邊流水燈子程序
 }
}

 

關(guān)閉窗口

相關(guān)文章