电子说
步骤1:
直接从Arduino/Atmega 328
通过Arduino/Atmega 328的移位寄存器
直接从Arduino/Atmega 328进行直接端口操作
通过Arduino/Atmega 328/按钮计数器的移位寄存器多路复用
通过Arduino/Atmega 328/电位器计数器的移位寄存器多路复用
1-直接从Arduino/Atmega 328
自动从零计数到九,然后重复
代码
///感谢Grumpy Mike http://www.thebox.myzen .co.uk/Tutorial/Arrays.html
//字节内的LED段分配= {DP ABCDEFG}
int引脚[] = {2、3、4、5、6、7、8、9} ;//分配给DP但未使用的引脚9(char tenCode中二进制数组的第一个元素)
int digit [] = {0,1,2,3,4,5,6,7,7,8,9,10 };
int计数器= 0;//将计数器初始化为零
int timer = 1000;//延迟计时器间隔
char tenCode [] = {B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,B01111111,B01111011};
void setup()
{
(int i = 0; i 《8; i ++)//将数字引脚设置为OUTPUTS
pinMode(pins [i],OUTPUT);
}
void loop()
{
for(int j = 0; j 《10; j ++)
{ displayEleven(digit [j]);
delay(timer);
}
}
void displayEleven( int num)
{
int mask = 1; for(int i = 0; i 《8; i ++)
{((mask&tenCode [num])== 0)
digitalWrite(pins [i],LOW);
else digitalWrite(pins [i],HIGH);
mask = mask 《《1;
}
}
步骤2:
2-通过Arduino/Atmega 328的移位寄存器
从零自动计数到九,然后重复
代码
//字节= {内的LED段分配ABCDEFG DP}
int闩锁Pin = 8;//连接到移位寄存器的引脚12
int dataPin = 11;//连接到移位寄存器的引脚14
int clockPin = 12;////连接到移位寄存器的引脚11
int i = 0;
字节数字[] = {B11111100,B01100000,B11011010,B11110010,B01100110,B10110110,B10111110,
B11100000,B11111110,B11110110};
void setup()
{
pinMode(dataPin,OUTPUT);//将dataPin配置为OUTPUT
pinMode(latchPin,OUTPUT);//将闩锁引脚配置为OUTPUT
pinMode(clockPin,OUTPUT);//将clockPin配置为OUTPUT
}
void loop()
{
for(i = 0; i 《10; i ++)
{
digitalWrite(latchPin,LOW);//将锁存器拉低以开始发送数据
shiftOut(dataPin,clockPin,LSBFIRST,digit [i]);//发送数据
digitalWrite(latchPin,HIGH);//将闩锁拉到高电平以停止发送数据
delay(1000);
}
}
步骤3:
3-直接从Arduino/Atmega 328直接进行端口操作
从零开始自动计数到9,然后重复
代码
////因为直接端口操作使用引脚0和1,即RX和TX
//分别为引脚,上传代码时必须断开这些引脚
//字节= {DP ABCDEFG}
字节i = 0内的LED段分配;
字节数字[10] = {B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,B01111111,B01111011};
无效setup()
{
DDRD = B11111111;//将PORTD(数字7〜0)设置为输出
}
void count()
{
for(i = 0; i 《10; i ++)
{
PORTD = digit [i];
delay(1000);
PORTD = 0;
}
}
void loop()
{
count();
}
步骤4:
4-通过从Arduino/Atmega 328/按钮计数器
按钮在0到8之间递增和递减计数器
代码
//7段LED计数器,使用74HC595 8位移位寄存器多路复用,通过按钮开关将计数器从0递增到8到零
//从这些源代码一起整理代码-感谢法尔斯
//http://www.sweeting.org/mark/blog/2011/11/27/arduino-74hc595-shift-register-and-a-7-segment-led-显示
//http://thecustomgeek.com/2011/06/29/multiplexing-for-a-7-yearold/
const int闩锁Pin = 5;//引脚连接到74HC595的引脚12(锁存器)
const int dataPin = 6;//引脚连接到74HC595的引脚14(数据)
const int clockPin = 7;//引脚连接到74HC595的引脚11(时钟)
int upPin = 12;//按钮连接到引脚12
int downPin = 13;//按钮连接到引脚12
int currUpState = 1;//将currUpState初始化为HIGH
int currDownState = 1;//将currDownState初始化为HIGH
int prevUpState = 0;
int prevDownState = 0;
int counter = 0;//将计数器初始化为零
const字节编号[10] =//用显示段0、1、2、3、4、5、6、7、8、9 《描述每个数字/p》
{
B11111100,
B01100000,
B11011010,
B11110010,
B01100110,
B10110110,
B10111110,
B11100000,
B11111110,
B11100110,
};
void setup()
{
pinMode(latchPin,OUTPUT);//将SR引脚设置为输出
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(upPin,INPUT);//将引脚12设置为按钮输入
pinMode(downPin,INPUT);//将引脚13设置为按钮输入
}
void loop()
{
currUpState = digitalRead(upPin);
if(prevUpState!= currUpState)//状态从
{//从高变为低,反之亦然
prevUpState = currUpState;
if(currUpState == HIGH)//如果按下按钮
counter ++;//将计数器加1
//延迟(1);
}
if(counter》 8)
计数器-= 1;
show(numbers [counter]);//显示当前数字
currDownState = digitalRead(downPin);
如果(prevDownState!= currDownState)//状态从
{//从高到低,反之亦然
prevDownState = currDownState;
if(currDownState == HIGH)//如果按下按钮
counter- = 1 ;//将计数器减1
//delay(1);
}
if(counter 《0)
counter ++ ;
show(numbers [counter]);//显示当前数字
}
void show(字节数)
{
////使用循环和按位AND移至组成
//七段显示的每一位(从左到右,A =》 G),然后检查
//看是否应该
for(int j = 0; j 《= 7; j ++)
{
byte toWrite = number&(B10000000 》》 j );
if(!toWrite){
Continue;
}//如果所有位均为0,则将其写入移位寄存器没有意义,因此
shiftIt(toWrite);继续操作。////否则将其移入寄存器
}
}
void shiftIt(字节数据)
{
digitalWrite(latchPin,LOW);//将这8位时钟输入到寄存器中时将闩锁引脚LOW
for(int k = 0; k 《= 7; k ++)
{
digitalWrite(clockPin,LOW);//ClockPin在发送位之前为低电平
if(data&(1 《
{
digitalWrite(dataPin,HIGH);//打开“
}
else
{
digitalWrite(dataPin,LOW);//将“关闭”
}
digitalWrite(clockPin,HIGH);//并为
}
digitalWrite(clockPin,LOW)中的位提供时钟//停止移出数据
digitalWrite(latchPin,HIGH);//将闩锁Pin设置为高电平以锁定并发送数据
}
步骤5:
5-通过Arduino/Atmega 328/电位计计数器的移位寄存器多路复用
电位计用于在0到8之间递增和递减计数器
Code
//7段LED计数器,使用74HC595 8位移位寄存器进行多路复用,通过电位计将计数器从0递增为8到0 资料来源-感谢法尔斯
//http://www.sweeting.org/mark/blog/2011/11/27/arduino-74hc595-shift-register-and-a-7-segment-led-display
//http://thecustomgeek.com/2011/06/29/multiplexing-for-a-7-yeard/
const int闩锁Pin = 5;//引脚连接到74HC595的引脚12(锁存器)
const int dataPin = 6;//引脚连接到74HC595的引脚14(数据)
const int clockPin = 7;//引脚连接到74HC595的引脚11(时钟)
int counter = 0;//将计数器初始化为零
int potReading = 0;
const字节编号[10] =//用显示段0、1、2、3、4、5来描述每个数字6,7,8,9
{
B11111100,
B01100000,
B11011010,
B11110010,
B01100110,
B10110110,
B10111110,
B11100000,
B11111110,
B11100110,
};
void setup()
{
pinMode(latchPin,OUTPUT);//将SR引脚设置为输出
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
}
void loop()
{
potReading =模拟读取(A0);
potReading = map(potReading,0,1023,0,8);
{
if(potReading》 8)
potReading-;
show(numbers [potReading]);
}
{
if(potReading 《0)
potReading ++;
show(numbers [potReading] );
}
}
void show(字节数)
{
//使用循环和按位AND移至使向上
//七段显示(从左到右,A =》 G),然后检查
//是否应打开
for(int j = 0; j 《= 7; j ++)
{
要写入的字节=数字&(B10000000 》》 j);
if(!toWrite){
continue;
}//如果全部位为0,则无意义将其写入移位寄存器,因此请中断并继续执行下一段。
shiftIt(toWrite);//否则将其移入寄存器
}
}
void shiftIt(字节数据)
{
digitalWrite(latchPin,LOW);//将这8位时钟输入到寄存器
时将闩锁引脚LOW设置为(int k = 0; k 《= 7; k ++)
{
digitalWrite(clockPin,LOW);//ClockPin在发送位之前为低电平
////请注意,在我们的示例中,对于
//“ On”,我们需要将pinState设置为0(LOW),因为74HC595吸收电流时使用常见的
//阳极显示器。如果要使用公共阴极显示器,则
//将其切换。
if(data&(1 《 {
digitalWrite(dataPin,HIGH);//打开“
}
else
{
digitalWrite(dataPin,LOW);//关闭“
}
digitalWrite(clockPin,HIGH);//并时钟
}
digitalWrite(clockPin,LOW);中的位//停止移出数据
digitalWrite(latchPin,HIGH);//将闩锁Pin设置为高电平以锁定并发送数据
}
全部0条评论
快来发表一下你的评论吧 !