[AVR学习资料]testdled[20060316]

#include <mega16.h>     //包含MAGE16,这个主要是声明一些寄存器的名称与地址的关系
#include <USART.h>      //包含USART,这个是为了串口通讯调用相关资料使用的。内容没有研究
#include <delay.h>      //这个是一个延时用的函数

// Declare your global variables here
#define LED_A 0b00000001  //LED_A,是让LED的一个段为1,也就是让这个段亮。比如是A段。
#define LED_B 0b00000010  //如上,也是另一段为1,让另一段亮,如B,
#define LED_C 0b00000100  //如上
#define LED_D 0b00001000  //如上
#define LED_E 0b00010000  //如上
#define LED_F 0b00100000  //如上
#define LED_G 0b01000000  //如上
#define LED_T 0b10000000  //如上

unsigned char ShowLed(unsigned char LED)  //显示的函数,加了LED的变量
{
  unsigned char LEDS[20]={   //定义了一个20个的数组
   0x7F&(~LED_G),                  //0X7F是01111111,与LED—G进行非,就是001111111,所以这个应该是0
   LED_B|LED_C,                    //LED—B,C进行与,正好是00000110,只有二个,所以是1
   LED_A|LED_B|LED_G|LED_E|LED_D,  //2,如上所示,自己研究
   LED_A|LED_B|LED_G|LED_C|LED_D,  //3,如上所示,自己研究
   LED_F|LED_G|LED_B|LED_C,        //4,如上所示,自己研究
   LED_A|LED_F|LED_G|LED_C|LED_D,  //5,如上所示,自己研究
   0x7F&(~LED_B),                  //6,如上所示,自己研究
   LED_A|LED_B|LED_C,              //7 ,如上所示,自己研究
   0x7F,                           //8,如上所示,自己研究
   0x7F&(~LED_E),                  //9,如上所示,自己研究
   LED_F|LED_E|LED_G|LED_B|LED_C,  //H,如上所示,自己研究
   LED_A|LED_F|LED_G|LED_E|LED_D,  //ERR,如上所示,自己研究
   LED_A,                          //A,如上所示,自己研究
   LED_B,                          //B,如上所示,自己研究
   LED_C,                          //C,如上所示,自己研究
   LED_D,                          //D,如上所示,自己研究
   LED_E,                          //E,如上所示,自己研究
   LED_F,                          //F,如上所示,自己研究
   LED_G,                          //G,如上所示,自己研究
   LED_T                           //.,如上所示,自己研究
  };
  unsigned char LEDSHOW;  //定义了LEDSHOW
 if (LED<=11)             //如果变量LED小于等于11。
   {LEDSHOW = LEDS[LED];} //那么LEDSHOW=LEDS(这个变量)LEDSHOW是要返回的值。这个LEDS是取到了应该显示哪一个的字
 else if ((LED>='0') && (LED<='9')) //如果输入的变量是大于等于0并且,LED小于等于9
   {LEDSHOW = LEDS[LED-'0'];}       //那么LEDS等LED-'0',如果LED是字符0到九,那么ASC相应的位置减去0的ASC就得到了一个数据
 else if (LED=='.')                 //如果LED等于点
   {LEDSHOW = LEDS[19];}            //取点所在的段。
 else if ((LED>='a') && (LED<='g')) //如果送来的LED是A与G之间的。
   {LEDSHOW = LEDS[LED-'a'+12];}    //那么,这个字母的ASC码减去a,再加12,因为从十二开始才是a
 else if ((LED>='A') && (LED<='G')) //如果是大写的A与G之间
   {LEDSHOW = LEDS[LED-'A'+12];}    //那么。这个字母的ASC码减去A,再加12,因为从十二开始才是A
 else if (LED=='-')                 //如果等-
   {LEDSHOW = LEDS[19];}            //那么去取-
 else if ((LED=='H')||(LED=='h'))   //如果LED等于H或是小写的H。
   {LEDSHOW = LEDS[10];}            //那么去取10个的。
 else 
   {LEDSHOW = LEDS[11];}            //如果都被否掉了。去取11
 return LEDSHOW;                    //函数反回LEDSHOW。
}


void main(void)  //主程序
{
unsigned char LED[6];   //六个LED,就有一个LED[6]
unsigned char State;    //定义了一个状态字。
unsigned char Index;    //定义了一个INDEX。
unsigned int i;         //定义了一个整型的I,上面的都是字符型的。
PORTB=0x00;             //PORTB口为00
DDRB=0x00;              //PORTB为输出(PIC里是输出,不知道AVR里还是不是了。)        

PORTC=0x00;             //PORTC为00
DDRC=0xFF;              //C口为输入,怎么记的清,输入是有东西了,当然是1好了,输出是给别人,自己是0了。嘿嘿。

PORTD=0x00;             //D口为00
DDRD=0xFF;              //D为输入

PORTA=0x00;             //A口为00
DDRA=0xFF;              //A口为输入

State=0;                //状态字为0
USART_Init(47);         //3.6864M=23,   7.3728M=47  这里不太知道,等下一节课听。估计是分频之流的东西。

for (i=0;i<6;i++) LED[i]=ShowLed(i);  //给六个循环,让LED从一到六全部显示12345,反向显示。
Index=0;                              //索引字为0
while (1)                             //进入循环,死的,除非遇到BREAK
      {
       	if (UCSRA&(1<<RXC))           //如果UCSRA位是1,也就是UCSRA,与RXC左移一步进行与,还是1。
       	 {
       	   State=0;                   //状态字为0
	         for (i=5;i>=1;i--) LED[i]=LED[i-1]; //这里是给定五个循环,把位置前提了一位。
	         LED[0]=ShowLed(UDR);                //让最后一位,0位,显示UDR,即串口送来的数
       	 }
      if (!PINB.0)  //如果系统没有串口的数据,如果KEY0是0的话,因为加!了,所以当0时才会是TRUE,
      {
       State=3;     //状态字为3,写到这里我还是不知道这个状态字有什么用,估计到后面就知道了。
      }
      if (!PINB.1)  //如果KEY1是0时
      {
       State=4;     //状态字为4
      }
        PORTA=~LED[Index];  //for M16;   让PORTA,等于LED[第INDEX位]取反!
        PORTC=1<<Index;     //让PORTC的左移INDEX位等于1
        Index++;            //累加     哦。因为这个PORTC是选择那个LED有效,所以是移位进行的。
        if (Index>=6) Index=0;      //如果INDEX加到了等于六了,那么让他等于0  
       switch (State)       //现在用到了STATE,给出判断
      {
      case 3:               //如果等于三
         {
         for (i=0;i<6;i++) LED[i]=ShowLed(8);  //说明KEY0被按下去了。那么让LED全显示8
         break;             //并且跳出WHILE
         }
      case 4:               //如果等于四,说明KEY1按下去了。
        {
         for (i=0;i<6;i++) LED[i]=ShowLed(i);  //那么还是显示12345,反向
         break;             //跳出WHILE
         }
      }
     delay_ms(1);   //给定延时
      }

}
原文地址:https://www.cnblogs.com/aipeli/p/352005.html