SHARE
TWEET

Untitled

sonprao Aug 23rd, 2016 60 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //tốc độ chạy chữ, càng lớn chạy càng lâu
  2. const byte SPEED = 4;
  3.  
  4. //kéo lên HIGH để cháy đèn LED, xài chung cho ROW và COL
  5. const byte LATCH = 2;
  6.  
  7. const byte CLOCK_ROW = 3;
  8. const byte DATA_ROW = 4;
  9.  
  10. const byte CLOCK_COL = 5;
  11. const byte DATA_COL = 6;
  12.  
  13. //Dùng cho ROW, ứng với {00000001, 00000010, 00000100, 00001000, 00010000, 00100000, 01000000, 10000000};
  14. const byte ROWS[8] = {1, 2, 4, 8, 16, 32, 64, 128};
  15.  
  16. //Ma trận gồm 8 dòng và 24 cột
  17. //Mỗi byte trong 8 byte của một phần tử trong mảng sau ứng với 1 cột của ma trận. Vậy tại sao có 8 byte trong khi chỉ cần 5 cột là đủ biểu diễn một kí tự?
  18. //Đó là vì dư ra cho tiện cho làm thêm các hình khác, trái tim chẳng hạn
  19.  
  20. //Mình chỉ làm kí tự hoa, số và vài kí tự đặt biệt
  21. //Chữ thường làm hơi xấu nên sẽ tính sau
  22.  
  23. //Mình cũng sẽ đăng một phần mềm nhỏ nhỏ do mình viết dùng để tạo các kí tự
  24. byte up[26][8] = {
  25.   {B00111111, B01010000, B10010000, B01010000, B00111111, B00000000, B00000000, B00000000},//A
  26.   {B11111111, B10010001, B10010001, B10010001, B01101110, B00000000, B00000000, B00000000},//B
  27.   {B01111110, B10000001, B10000001, B10000001, B10000001, B00000000, B00000000, B00000000},//C
  28.   {B11111111, B10000001, B10000001, B10000001, B01111110, B00000000, B00000000, B00000000},//D
  29.   {B11111111, B10010001, B10010001, B10010001, B10010001, B00000000, B00000000, B00000000},//E
  30.   {B11111111, B10010000, B10010000, B10010000, B10010000, B00000000, B00000000, B00000000},//F
  31.   {B01111110, B10000001, B10000001, B10001001, B01001110, B00001000, B00000000, B00000000},//G
  32.   {B11111111, B00010000, B00010000, B00010000, B11111111, B00000000, B00000000, B00000000},//H
  33.   {B10000001, B10000001, B11111111, B10000001, B10000001, B00000000, B00000000, B00000000},//I
  34.   {B10000011, B10000001, B11111111, B10000000, B10000000, B00000000, B00000000, B00000000},//J
  35.   {B11111111, B00011000, B00100100, B01000010, B10000001, B00000000, B00000000, B00000000},//K
  36.   {B11111111, B00000001, B00000001, B00000001, B00000001, B00000000, B00000000, B00000000},//L
  37.   {B11111111, B01000000, B00100000, B01000000, B11111111, B00000000, B00000000, B00000000},//M
  38.   {B11111111, B01000000, B00100000, B00010000, B11111111, B00000000, B00000000, B00000000},//N
  39.   {B01111110, B10000001, B10000001, B10000001, B01111110, B00000000, B00000000, B00000000},//O
  40.   {B11111111, B10010000, B10010000, B10010000, B01100000, B00000000, B00000000, B00000000},//P
  41.   {B01111110, B10000001, B10000001, B10000101, B01111110, B00000001, B00000000, B00000000},//Q
  42.   {B11111111, B10011000, B10010100, B10010010, B01100001, B00000000, B00000000, B00000000},//R
  43.   {B01100001, B10010001, B10010001, B10010001, B01001110, B00000000, B00000000, B00000000},//S
  44.   {B10000000, B10000000, B11111111, B10000000, B10000000, B00000000, B00000000, B00000000},//T
  45.   {B11111110, B00000001, B00000001, B00000001, B11111110, B00000000, B00000000, B00000000},//U
  46.   {B11111100, B00000010, B00000001, B00000010, B11111100, B00000000, B00000000, B00000000},//V
  47.   {B11111111, B00000010, B00000100, B00000010, B11111111, B00000000, B00000000, B00000000},//W
  48.   {B11000011, B00100100, B00011000, B00100100, B11000011, B00000000, B00000000, B00000000},//X
  49.   {B11100000, B00010000, B00001111, B00010000, B11100000, B00000000, B00000000, B00000000},//Y
  50.   {B10000111, B10001001, B10010001, B10100001, B11000001, B00000000, B00000000, B00000000}//Z
  51. };
  52.  
  53. byte num[10][8] = {
  54.   {B01111110, B10000001, B10000001, B10000001, B01111110, B00000000, B00000000, B00000000},//0
  55.   {B00100001, B01000001, B11111111, B00000001, B00000001, B00000000, B00000000, B00000000},//1
  56.   {B01000011, B10000101, B10001001, B10010001, B01100001, B00000000, B00000000, B00000000},//2
  57.   {B01000001, B10010001, B10010001, B10010001, B01101110, B00000000, B00000000, B00000000},//3
  58.   {B11110000, B00010000, B00010000, B11111111, B00000000, B00000000, B00000000, B00000000},//4
  59.   {B11110001, B10010001, B10010001, B10010001, B10001110, B00000000, B00000000, B00000000},//5
  60.   {B01111110, B10010001, B10010001, B10010001, B10001110, B00000000, B00000000, B00000000},//6
  61.   {B10000000, B10000000, B10011111, B10100000, B11000000, B00000000, B00000000, B00000000},//7
  62.   {B01101110, B10010001, B10010001, B10010001, B01101110, B00000000, B00000000, B00000000},//8
  63.   {B01100000, B10010001, B10010001, B10010001, B01111110, B00000000, B00000000, B00000000}//9
  64. };
  65.  
  66. byte specials[5][8] = {
  67.   {B00011000, B00100100, B01000010, B00100001, B01000010, B00100100, B00011000, B00000000},//HEART
  68.   {B00000001, B00000110, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000},//,
  69.   {B00000001, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000},//.
  70.   {B11111101, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}//!
  71. };
  72.  
  73. //Lưu trữ giá trị để biểu diễn ma trận, 24 byte là 24 cột
  74. //1 byte = 8 bit ứng mỗi điểm trên cột
  75. byte leds[24];
  76.  
  77. void copyArr(byte target[8], byte source[8]) {
  78.   for (byte i = 0; i < 8; i++) {
  79.     target[i] = source[i];
  80.   }
  81. }
  82.  
  83. //Tìm xem một kí tự ứng với đâu trong các mảng UP, NUM, SPECIALS)
  84. void getArrFromChar(char ch, byte arr[8]) {
  85.   byte ind = (byte) ch; //Lấy mã ASCII của kí tự
  86.  
  87.   if ((ind >= 48) && (ind <= 57)) {
  88.     copyArr(arr, num[ind - 48]);
  89.     return;
  90.   }
  91.  
  92.   if ((ind >= 65) && (ind <= 90)) {
  93.     copyArr(arr, up[ind - 65]);
  94.     return;
  95.   }
  96.  
  97.   switch (ch) {
  98.     case '$': {
  99.         copyArr(arr, specials[0]);
  100.         break;
  101.       }
  102.     case ',': {
  103.         copyArr(arr, specials[1]);
  104.         break;
  105.       }
  106.     case '.': {
  107.         copyArr(arr, specials[2]);
  108.         break;
  109.       }
  110.     case '!': {
  111.         copyArr(arr, specials[3]);
  112.         break;
  113.       }
  114.   };
  115. }
  116.  
  117. //Thêm một kí tự, sau đó gọi hàm addCol để hiển thị từng phần của kí tự
  118. void addChar(char chr) {
  119.   byte arr[8];
  120.   getArrFromChar(chr, arr);
  121.   for (byte i = 0; i < 8; i++) {
  122.     if (arr[i] != 0) {
  123.       addCol(arr[i]);
  124.     }
  125.   }
  126.   addCol(0);
  127. }
  128.  
  129. //Thêm vào một cột vào mảng leds để hiển thị
  130. void addCol(byte col) {
  131.   moveLeft();
  132.   leds[23] = col;
  133.   show(leds, SPEED);
  134. }
  135.  
  136. void moveLeft() {
  137.   for (byte i = 0; i < 23; i++) {
  138.     leds[i] = leds[i + 1];
  139.   }
  140. }
  141.  
  142.  
  143. void parseString(String s) {
  144.   s += "      ";
  145.   for (byte i = 0; i < s.length(); i++) {
  146.     if (s.charAt(i) == ' ') {
  147.       addCol(0);
  148.       addCol(0);
  149.     } else {
  150.       addChar(s.charAt(i));
  151.     }
  152.   }
  153. }
  154.  
  155. //Hiển thị mảng leds ra ma trận
  156. void show(byte leds[24], byte hold) {
  157.   for (byte k = 0; k < hold; k++) {
  158.     for (byte i = 0; i < 8; i++) {
  159.       byte d[3] = {0, 0, 0};
  160.  
  161.       for (byte j = 0; j < 24; j++) {
  162.         d[  j / 8] = d[j / 8] | ((leds[j] >> i & 1) * ROWS[7 - j % 8]);
  163.       }
  164.  
  165.       digitalWrite(LATCH, LOW);
  166.       shiftOut(DATA_ROW, CLOCK_ROW, LSBFIRST, ROWS[i]);
  167.       shiftOut(DATA_COL, CLOCK_COL, MSBFIRST, d[0]);
  168.       shiftOut(DATA_COL, CLOCK_COL, MSBFIRST, d[1]);
  169.       shiftOut(DATA_COL, CLOCK_COL, MSBFIRST, d[2]);
  170.       digitalWrite(LATCH, HIGH);
  171. //      delay(10); bỏ comment nếu bạn muốn tìm hiểu kĩ thuật quét LED
  172.     }
  173.   }
  174. }
  175.  
  176. void initPin() {
  177.   pinMode(LATCH, OUTPUT);
  178.   pinMode(CLOCK_COL, OUTPUT);
  179.   pinMode(DATA_COL, OUTPUT);
  180.   pinMode(CLOCK_ROW, OUTPUT);
  181.   pinMode(DATA_ROW, OUTPUT);
  182. }
  183.  
  184. void setup() {
  185.   Serial.begin(9600);
  186.   initPin();
  187. }
  188.  
  189. void loop() {
  190.   parseString("HAPPY NEW YEAR 2016");
  191. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top