Arduino 驅動TM1638顯示十位的共陽數碼管
阿新 • • 發佈:2018-12-20
Arduino 驅動TM1638顯示十位的共陽數碼管
二話不說先上圖:
這個是電路圖,下面我在上傳TM1638的手冊
哈哈太亂了先湊合著看吧!效果是實現了,畫了板還沒有發過來。
我也不多說什麼了上程式碼(基於Arduino)
#include "tm1638.h" //庫的標頭檔案 #include "Timers.h" // 看門狗定時器 String comdata = ""; String str = ""; boolean MD = 0; //看門狗標記 void setup() { pinMode(STB, OUTPUT); //讓三個腳都是輸出狀態 pinMode(CLK, OUTPUT); pinMode(DIO, OUTPUT); pinMode(13, OUTPUT); //初始化外部看門狗引腳 Serial.begin(115200); //初始化串列埠 delay(2); TCs.AddFunc(0, WDT, 200); //看門狗200MS一次 init_TM1638(); //初始化數碼管 } void loop() { comdata = ""; int a; while (Serial.available()) //時刻讀取硬體串列埠資料 { comdata += char(Serial.read()); delay(2); } while (Serial.read() >= 0) {} //清除串列埠快取 if (comdata.length() > 0) { if (comdata.startsWith("@") && comdata.endsWith("\r\n")) { displaySrest (); //清屏 a = comdata.length(); str = comdata.substring(1, a); a = str.length(); str = str.substring(0, a - 2); displayString(str); str = ""; comdata = ""; } } } //看門狗函式 void WDT () { MD = !MD; if (MD) digitalWrite(13, 1); else digitalWrite(13, 0); } void displayString (String number) { byte a, j = 0; char c; number.trim(); //清空空格 lastIndexOf(S) a = number.length(); //字元長度 if (a > 0 && number.lastIndexOf('.') >= 0) { j = 1; //判斷有無點 } if (j == 0) { //無小數點的時候 for (int i = 0; i < a; i++) { c = number[a - (1 + i)]; displaySS(c, 1 + i, 0); } } if (j != 0) { for (int i = 0; i < a; i++) { c = number[a - (1 + i)]; if (c == '.') { c = number[a - (1 + i) - 1]; a--; displaySS(c, 1 + i, 1); } else { displaySS(c, 1 + i, 0); } } } } void displaySrest() //清空顯示 { byte a, j = 0; char c; String number = " "; a = number.length(); for (int i = 0; i < a; i++) { c = number[i]; displaySS(c, 1 + i, 0); } } void displaySS(unsigned char number, unsigned char cnt1, bool glf) { if (glf == 1) { NE_C(ss[number] | 0x80, cnt1); //資料變換 } else { NE_C(ss[number], cnt1); } send_command(0x40); //設定資料命令:普通模式、地址自增1,寫資料到視訊記憶體 send_command(0xc0); //設定顯示地址命令:從00H開始 Write_String(BCD_LABLE_anode, 16); //連續寫入 16個位元組 因為1629系列總共有16個視訊記憶體 digitalWrite(STB, 1); send_command(cmd_dis_mode); } /***************傳送8bit資料,從低位開始**************/ void send_8bit(unsigned char DATA) //寫資料函式 { unsigned char i; for (i = 0; i < 8; i++) { digitalWrite(CLK, LOW); if (DATA & 0X01) digitalWrite(DIO, HIGH); else digitalWrite(DIO, LOW); digitalWrite(CLK, HIGH); DATA >>= 1; } digitalWrite(CLK, LOW); digitalWrite(DIO, LOW); } /******************傳送控制命令***********************/ void send_command(unsigned char word) { digitalWrite(STB, 1); digitalWrite(STB, 0); send_8bit(word); } void Write_String(unsigned char *p, unsigned char cnt) //cnt最大14byte { unsigned char i; for (i = 0; i < cnt; i++) //連續寫入資料 { send_8bit(*p++); } } /*************************************************** 8段數碼顯示的共陰資料到共陽資料的轉換 外加數碼位移 -- 實質是一個數組的轉置 並且只改變位 ****************************************************/ void NE_C(unsigned char ydata, unsigned char cnt) { char i = 0, j = 0; if (cnt > 0) { if (cnt > 8) { //myflag |= 0x01; cnt = cnt - 9; for (i = 1; i < 16; i = i + 2) { if (ydata & 0x01 == 0x01) { BCD_LABLE_anode[i] |= (0x01 << cnt); } else { BCD_LABLE_anode[i] &= ~(0x01 << cnt); //清零 } ydata = (ydata >> 1); } } else { cnt = cnt - 1; for (i = 0; i < 16; i = i + 2) { if ((ydata & 0x01) == 0x01) { BCD_LABLE_anode[i] |= (0x01 << cnt); } else { BCD_LABLE_anode[i] &= ~(0x01 << cnt); //清零 } ydata = (ydata >> 1); } } } } /************************************************************************************ 按照SEG1-SEG8 分別表示1-8位數碼管,函式引數含義如下: cnt1 :表示第cnt1個數碼管; number: 表示要顯示的資料,如number=1 顯示數字1; display(0,1): 表示在第1位數碼管上顯示0. BCD_LABLE_ALL[0]:表示0x3f, 即共陰極資料0,客戶可以根據需要建立陣列填入自己所需資料即可 ************************************************************************************/ void display(unsigned char number, unsigned char cnt1) { NE_C(BCD_LABLE_ALL[number], cnt1); //資料變換 send_command(0x40); //設定資料命令:普通模式、地址自增1,寫資料到視訊記憶體 send_command(0xc0); //設定顯示地址命令:從00H開始 Write_String(BCD_LABLE_anode, 16); //連續寫入 16個位元組 因為1629系列總共有16個視訊記憶體 digitalWrite(STB, 1); send_command(cmd_dis_mode); } void display_fixedadd(unsigned char number, unsigned char cnt1) { NE_C(BCD_LABLE_ALL[number], cnt1); send_command(0x44); //設定資料命令:普通模式、地址固定模式,寫資料到視訊記憶體 send_command(0xc2); send_8bit(0x00);//在02地址寫00 digitalWrite(STB, 0); send_command(cmd_dis_mode); digitalWrite(STB, 0); } //TM1638初始化函式 void init_TM1638(void) { unsigned char i; send_command(0x8f); //亮度 (0x88-0x8f)8級亮度可調 send_command(0x40); //採用地址自動加1 digitalWrite(STB, LOW); // send_8bit(0xc0); //設定起始地址00H for (i = 0; i < 16; i++) //傳送16個位元組的資料 send_8bit(0x00); digitalWrite(STB, HIGH); }
第一次寫多多見諒!有意見望各位網友提出。