程序主題不長,本人萌新,制作了一個計時程序。
程序是利用Arduino軟件寫的,板子是Arduino UNO, 還有TM1638,8位數碼管。
該程序會從1數到100000,按鍵也可以使用,按第一個按鍵會使亮度降低,第二個會使亮度增高,亮度會利用數字上方的led燈顯示,共8級。
其余的按鍵則不會有用。
改程序并不長,寫法比較直白。程序將會列在下方,并有附件。謝謝大家。
tm1638.jpg (126.68 KB, 下載次數: 85)
下載附件
2021-8-27 17:49 上傳
Arduino源程序如下:
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
const int TM1638_STB = 7;
const int TM1638_CLK = 9;
const int TM1638_DIO = 8;
int brightness=0x88; //set light,0x88-0x8f
int Led_light=1;
//----------------------------------------------------------------
void writeByte(int value)
{
unsigned char i;
pinMode(TM1638_DIO,OUTPUT);
for(i=0;i<8;i++)
{
digitalWrite(TM1638_CLK,LOW);
if(value&0X01){
digitalWrite(TM1638_DIO,HIGH);
}
else{
digitalWrite(TM1638_DIO,LOW);
}
value>>=1;
digitalWrite(TM1638_CLK,HIGH);
}
digitalWrite(TM1638_CLK,LOW);
}
//-----------------------------------------------------------------------
void sendCommand(uint8_t value)
{
digitalWrite(TM1638_STB, LOW);
writeByte(value);
digitalWrite(TM1638_STB, HIGH);
}
//------------------------------------------------------------------------
void reset()
{
sendCommand(0x40); // set auto increment mode
digitalWrite(TM1638_STB, LOW);
writeByte(0xc0); // set starting address to 0
for(uint8_t i = 0; i < 8; i++)
{
writeByte(0x00);
}
digitalWrite(TM1638_STB, HIGH);
}
//---------------------------------------------------------------------
void setup()
{
//Serial.begin(9600); // 初始化串口
pinMode(TM1638_STB, OUTPUT);
pinMode(TM1638_CLK, OUTPUT);
pinMode(TM1638_DIO, OUTPUT);
reset();
sendCommand(brightness);
}
//---------------------------------------------------------------------
void loop()
{
for(int i = 0;i < 10000000; i++)
{
showNumber(i);
//------------------------------
buttonLoop();
//------------------------------
brightnessSet();
}
}
//--------------------------------------------------------------------------
int readByte(void) //read a byte.
{
unsigned char i;
int value=0;;
pinMode(TM1638_DIO,INPUT); //set input mode.
for(i=0;i<8;i++)
{
value>>=1;
digitalWrite(TM1638_CLK,LOW);
delay(1);
if(digitalRead(TM1638_DIO)==HIGH)
value|=0x80;
digitalWrite(TM1638_CLK,HIGH);
}
digitalWrite(TM1638_CLK,LOW);
pinMode(TM1638_DIO,OUTPUT);//set output mode.
return value;
}
//--------------------------------------------------------------------------
int readButtons(void)
{
int buttons = 0;
digitalWrite(TM1638_STB, LOW);
pinMode(TM1638_DIO, OUTPUT);
shiftOut(TM1638_DIO, TM1638_CLK, LSBFIRST, 0x42);
pinMode(TM1638_DIO, INPUT);
for (uint8_t i = 0; i < 4; i++)
{
int v = readByte() << i;
buttons |= v;
}
pinMode(TM1638_DIO, OUTPUT);
digitalWrite(TM1638_STB, HIGH);
return buttons;
}
//--------------------------------------------------------------------------
void setLed(int value, int position)
{
pinMode(TM1638_DIO, OUTPUT);
sendCommand(0x44);
digitalWrite(TM1638_STB, LOW);
writeByte(0xC1 + (position << 1));
writeByte(value);
digitalWrite(TM1638_STB, HIGH);
}
//-----------------------------------------------------------------------
void showNumber(int number)
{
const int digital[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
int pos = 7;
while(pos >=0){
digitalWrite(TM1638_STB, LOW);
writeByte(0xc0 + pos * 2);
if(number > 0){
int dig = number % 10;
writeByte(digital[dig]);
number /= 10;
}
else{
writeByte(0);
}
digitalWrite(TM1638_STB, HIGH);
pos--;
}
}
//------------------------------------------------------------------
void buttonLoop()
{
int buttons = readButtons();
int xx;
for(int position = 0; position < 8; position++)
{
int mask = 0x01 << position;
setLed(buttons & mask ? 1 : 0 , position); // ?前面條件為真,取:前面的1
switch(brightness)
{
case 0x88:
setLed(1 , 8);
break;
case 0x89:
setLed(1 , 8);setLed(1 , 1);
break;
case 0x8a:
setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);
break;
case 0x8b:
setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);
break;
case 0x8c:
setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);setLed(1 , 4);
break;
case 0x8d:
setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);setLed(1 , 4);setLed(1 , 5);
break;
case 0x8e:
setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);setLed(1 , 4);setLed(1 , 5);setLed(1 , 6);
break;
case 0x8f:
setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);setLed(1 , 4);setLed(1 , 5);setLed(1 , 6);setLed(1 , 7);
break;
}
}
}
//------------------------------------------------------------------
void brightnessSet()
{
int buttons = readButtons();
switch(buttons)
{
case 1:
if (brightness > 0x88)
{
brightness--;
sendCommand(brightness);
}
else brightness = 0x88;
delay(200);
break;
case 2:
if (brightness < 0x8f)
{
brightness++;
sendCommand(brightness);
}
else brightness = 0x8f;
delay(200);
break;
}
}
|