#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); //给定延时 } }