最終更新日:2023/3/9
//Demo for 4-Digit Display only by Catalex //Hardware: A 4-Digit Display //Board: Catduino or Arduino UNO R3,Arduino Mega2560... //IDE: Arduino-1.0 //Function: Display the time on the digital tube. //Store: http://www.aliexpress.com/store/1199788 /*********************************************************************/ #include <TimerOne.h> #include "TM1637.h" #define ON 1 #define OFF 0 int8_t TimeDisp[] = {0x00,0x00,0x00,0x00}; unsigned char ClockPoint = 1; unsigned char Update; unsigned char halfsecond = 0; unsigned char second; unsigned char minute = 0; unsigned char hour = 12; #define CLK 3//pins definitions for TM1637 and can be changed to other ports #define DIO 2 TM1637 tm1637(CLK,DIO); void setup() { tm1637.set(); tm1637.init(); Timer1.initialize(500000);//timing for 500ms Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR } void loop() { if(Update == ON) { TimeUpdate(); tm1637.display(TimeDisp); } } void TimingISR() { halfsecond ++; Update = ON; if(halfsecond == 2){ second ++; if(second == 60) { minute ++; if(minute == 60) { hour ++; if(hour == 24)hour = 0; minute = 0; } second = 0; } halfsecond = 0; } // Serial.println(second); ClockPoint = (~ClockPoint) & 0x01; } void TimeUpdate(void) { if(ClockPoint)tm1637.point(POINT_ON); else tm1637.point(POINT_OFF); TimeDisp[0] = hour / 10; TimeDisp[1] = hour % 10; TimeDisp[2] = minute / 10; TimeDisp[3] = minute % 10; Update = OFF; } |
TM1637で制御する7セグLED4桁のモジュールをW5500-EVB-PICOに接続した場合のコードです。 |
/* * 2023/03/09 T.Wanibe * 方法論が見つかったので記録に残す * 結局dot表示を制御するためには8bitのセグメント制御をするしかなさそう * 数字のセグメント情報はTM1637.hに記載があるので対応はできる * custom_display()というAPIを用意して対応する。 * W5500-EVB-PICO は 16..21がNICと接続されているのでそれを避けた配線としている。 * 最大1044480バイトのフラッシュメモリのうち、スケッチが55604バイト(5%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が7552バイト(2%)を使っていて、ローカル変数で254592バイト使うことができます。 */ #define TIMER_INTERRUPT_DEBUG 1 #define _TIMERINTERRUPT_LOGLEVEL_ 4 #include "RPi_Pico_TimerInterrupt.h" #include "TM1637.h" #define SEG_DP 0x80 #define ON 1 #define OFF 0 #define TIMER0_INTERVAL_MS 1000 #define CLK 28 //pins definitions for TM1637 and can be changed to other ports #define DIO 27 int8_t TimeDisp[] = {0x00, 0x00, 0x00, 0x00}; unsigned char ClockPoint = 1; unsigned char Update; unsigned char halfsecond = 0; unsigned char second; unsigned char minute = 0; unsigned char hour = 12; static int8_t tube_tab[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; //0~9,A,b,C,d,E,F TM1637 tm1637(CLK, DIO); RPI_PICO_Timer ITimer0(0); //-------------- void custom_display(uint8_t bit_addr, uint8_t seg_data) { tm1637.start(); tm1637.writeByte( 0x44 ); tm1637.stop(); tm1637.start(); tm1637.writeByte(bit_addr | 0xc0); tm1637.writeByte(seg_data); tm1637.stop(); tm1637.start(); tm1637.writeByte(tm1637.cmd_disp_ctrl); tm1637.stop(); } //-------------- bool TimingISR(struct repeating_timer *t) { halfsecond ++; Update = ON; if (halfsecond == 2) { second ++; if (second == 60) { minute ++; if (minute == 60) { hour ++; if (hour == 24) { hour = 0; } minute = 0; } second = 0; } halfsecond = 0; } // Serial.println(second); ClockPoint = (~ClockPoint) & 0x01; return true; } //-------------- void TimeUpdate(void) { tm1637.point(POINT_OFF); TimeDisp[0] = hour / 10; TimeDisp[1] = hour % 10; TimeDisp[2] = minute / 10; TimeDisp[3] = minute % 10; if (ClockPoint) { custom_display( 0, tube_tab[TimeDisp[0]]); custom_display( 1, tube_tab[TimeDisp[1]] | SEG_DP); custom_display( 2, tube_tab[TimeDisp[2]]); custom_display( 3, tube_tab[TimeDisp[3]]); } else { custom_display( 0, tube_tab[TimeDisp[0]]); custom_display( 1, tube_tab[TimeDisp[1]]); custom_display( 2, tube_tab[TimeDisp[2]]); custom_display( 3, tube_tab[TimeDisp[3]]); } Update = OFF; } //-------------- void setup() { tm1637.set(7); //0..7 tm1637.clearDisplay(); //Timer1.initialize(500000);//timing for 500ms //Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR //マイクロ秒単位の間隔 if (ITimer0.attachInterruptInterval(TIMER0_INTERVAL_MS * 500, TimingISR)){ if(Serial){ Serial.print(F("Starting ITimer0 OK, millis() = ")); Serial.println(millis()); } }else{ if(Serial){ Serial.println(F("Can't set ITimer0. Select another freq. or timer")); } } } //-------------- void loop() { if (Update == ON) { TimeUpdate(); } } |
本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。
Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。