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);
}