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