步驟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設置為高電平以鎖定并發送數據
}
-
LED顯示屏
+關注
關注
36文章
1825瀏覽量
98904 -
Arduino
+關注
關注
188文章
6471瀏覽量
187308
發布評論請先 登錄
相關推薦
評論