zoukankan      html  css  js  c++  java
  • [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);   //给定延时
          }
    
    }
    
  • 相关阅读:
    数据库新秀 postgresql vs mongo 性能PK
    mongodb索引--1亿条记录的查询从55.7秒到毫秒级别<补充版>
    nodejs npm install -g 全局安装和非全局安装的区别
    nodejs express template (模版)的使用 (ejs + express)
    CSS3动画:YouTube的红色激光进度条
    IE bug之location.href没有referer
    工程师
    Shadow DOM的事件绑定
    IE回车的一个怪异行为
    CSS3全新的背景图片方案
  • 原文地址:https://www.cnblogs.com/aipeli/p/352005.html
Copyright © 2011-2022 走看看