170110

2019-04-13 11:33发布

1625-5    王子昂    总结《2016年1月10日》  【连续第102天总结】 A.arduino一章 100% B.这一块缺乏很多基础知识_(:з」∠)_数电模电什么的,寄存器什么的都不知道是什么 教程里用它来扩展引脚 在网上找了面包板的模拟器,调试了LED和七段显示器,把各种例程都自己写了一遍。 LED尝试了定时闪烁、滑动变阻调亮度的例程,以及五个LED循环闪动。 没有完全参照例程,写完以后对照的时候发现例程中是把LED所连接的引脚依次放入一个数组中,进行使用。而我是直接使用变量循环叠加的方式。在引脚无规律的情况下以数组方式提供,虽然代码冗长一些,但很可靠。是一个很好的思路。不过在引脚是连续的情况下应该还是变量叠加的方法简单一些。 int change=1; int i=9; void setup()
{
  for(int i=9;i<14;i++)
  pinMode(i,OUTPUT);
}
void loop()
{
  digitalWrite(i,HIGH);
  delay(300);
  digitalWrite(i,LOW);
  i+=change;
  if(i==9||i==13)change*=-1;
}
七段显示器的倒数感觉最难的是八个引脚的接线……花式接错,调试了好久_(:з」∠)_ 把线路校正以后,代码反而相对不是很难。将准备好的数字和灯管的对应放入一个二维数组中,然后依次显示即可
byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
                                 { 0,1,1,0,0,0,0 },  // = 1
                                 { 1,1,0,1,1,0,1 },  // = 2
                                 { 1,1,1,1,0,0,1 },  // = 3
                                 { 0,1,1,0,0,1,1 },  // = 4
                                 { 1,0,1,1,0,1,1 },  // = 5
                                 { 1,0,1,1,1,1,1 },  // = 6
                                 { 1,1,1,0,0,0,0 },  // = 7
                                 { 1,1,1,1,1,1,1 },  // = 8
                                 { 1,1,1,0,0,1,1 }   // = 9
                             };

void light(int x)
{
  for(int i=0;i<7;i++)
      digitalWrite(i+2,!seven_seg_digits[x][i]);
}
void setup()
{
  for(int i=2;i<9;i++)
  pinMode(i,OUTPUT);
}


void loop()
{ int i=0;
  light(i);
  i++;
  if(i==9)
i=0;   delay(1000);
 
  
  
} 四位七段显示器的使用: 本来以为会有多达8*4+2个引脚,没想到是利用视觉暂留现象,每次只点亮一位数字,只提供四个数字的共阳极,这样就只有8+4个引脚 这个方法称为共工。 另外arduino直接接上四个数字的灯管的共阳极时,电压会无法供给。因此需要使用四颗PNP电晶体作为开关。 代码与七段显示器类似,只是要在它的基础上增加四个数字循环显示
读取4x4键盘的输入: 例程里是4x3,接的引脚也比较杂乱。 看了一下模拟程序里面只有4x4的pad,接脚也很整齐,所以接了从2-5和10-13的引脚。 例程中是输出到serialport中,然后看到下面有跟帖说,可不可以做一个密码验证系统,对了就亮灯这样的。 想了一下很简单,就做出来了。 之后又优化了一下port的输出,看起来比较方便一些。 再一想,那直接安个LCD显示好了呀。 可是arduino的脚位不够了_(:з」∠)_ 尝试用用移位寄存器好了…虽然不太懂原理,但应该是按位输出的方式。 连了半天发现LCD的调用是封装好的,并没有办法具体修改呀…… 然后发现教程里有通过移位寄存器使用LCD的! 不过是另加了一个库shiftlcd.h 模拟网页里没有这个库…… 然后翻墙去原网页上找了这个库的全部内容直接复制到代码里,还是会花式报错。猜测是系统不一致导致的兼容问题_(:з」∠)_ 最后没办法,digital脚位不够,analog脚位来凑好啦! 成功把用户输入的密码输出在屏幕上了! 虽然期间因为没接电阻把LCD玩爆了一次233 挺好玩的呀233 #include
#include
char password[7]="123456";
char inputpw[7];


const byte ROWS=4;
const byte COLS=4;
  int i=0;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};




byte rowPins[ROWS]={5,4,3,2};
byte colPins[COLS]={13,12,11,10};


Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);
void setup()
{
  lcd.begin(16, 2);
  Serial.begin(9600);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
}


void loop()
{
char key=keypad.getKey();
  if(key!=NO_KEY){
  inputpw[i]=key;
      Serial.print(key);
    lcd.print(key);
    i++;
    if(i==6)
    {
      Serial.print(' ');
      if(strcmp(inputpw,password))
      digitalWrite(8,HIGH);
      else
        digitalWrite(7,HIGH);
      
 delay(3000);
 digitalWrite(7,LOW);
   digitalWrite(8,LOW);
      lcd.setCursor(0,0);
      lcd.print("      ");
      lcd.setCursor(0, 0);
      i=0;
    }
  }
  delay(10);
}

热门文章