Advertisement
sonprao

Untitled

Aug 23rd, 2016
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.49 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement