Chat
Danh mục
Kỹ thuật quét led ma trận 8x32

Kỹ thuật quét led ma trận 8x32

Số lượng:
Thêm vào giỏ
Kỹ thuật quét led ma trận 8x32 đã được thêm vào giỏ hàng

1.      Sơ đồ nguyên lý mạch

Sơ đồ khối điều khiển



Sơ đồ khối hiển thị

2.      Mã nguồn

Bảng mã ASCII cho các ký tự
//******************BANG MA ASCII on LED matrix font 5x7 ****************
// bang ma ASCII thong thuong bao gom 128 ky tu (tu 0 -> 127)
// tuy nhien 32 (tu 0 -> 31) ky tu dau tien la ky tu dieu khien,
// cho nen ta khong can phai tao font cho chung
// khi doc ma ASCII trong chuong trinh ta lay gia tri doc duoc tru di 32
// la ra duoc font tuong ung

unsigned char code code_Tab[97][6]={
              0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//  SPACE 0
              0xFF,0xFF,0xA0,0xFF,0xFF,0xFF,//  ! 1
              0xFF,0xFF,0xF8,0xF4,0xFF,0xFF,//  ' 2
              0xEB,0x80,0xEB,0x80,0xEB,0xFF,//  # 3
              0xDB,0xD5,0x80,0xD5,0xED,0xFF,//  $ 4
              0xD8,0xEA,0x94,0xAB,0x8D,0xFF,//  % 5
              0xC9,0xB6,0xA9,0xDF,0xAF,0xFF,//  & 6
              0xFF,0xFF,0xF8,0xF4,0xFF,0xFF,//  ' 7
              0xFF,0xE3,0xDD,0xBE,0xFF,0xFF,//  ( 8
              0xFF,0xBE,0xDD,0xE3,0xFF,0xFF,//  ) 9
              0xD5,0xE3,0x80,0xE3,0xD5,0xFF,//  * 10
              0xF7,0xF7,0xC1,0xF7,0xF7,0xFF,//  + 11
              0xFF,0xA7,0xC7,0xFF,0xFF,0xFF,//  , 12
              0xF7,0xF7,0xF7,0xF7,0xF7,0xFF,//  - 13
              0xFF,0x9F,0x9F,0xFF,0xFF,0xFF,//  x 14
              0xFF,0xC9,0xC9,0xFF,0xFF,0xFF,//  / 15
              0xC1,0xAE,0xB6,0xBA,0xC1,0xFF,//  0 16
              0xFF,0xBD,0x80,0xBF,0xFF,0xFF,//  1 17
              0x8D,0xB6,0xB6,0xB6,0xB9,0xFF,//  2 18
              0xDD,0xBE,0xB6,0xB6,0xC9,0xFF,//  3 19
              0xE7,0xEB,0xED,0x80,0xEF,0xFF,//  4 20
              0xD8,0xBA,0xBA,0xBA,0xC6,0xFF,//  5 21
              0xC3,0xB5,0xB6,0xB6,0xCF,0xFF,//  6 22
              0xFE,0x8E,0xF6,0xFA,0xFC,0xFF,//  7 23
              0xC9,0xB6,0xB6,0xB6,0xC9,0xFF,//  8 24
              0xF9,0xB6,0xB6,0xD6,0xE1,0xFF,//  9 25
              0xFF,0xC9,0xC9,0xFF,0xFF,0xFF,//  : 26
              0xFF,0xA4,0xC4,0xFF,0xFF,0xFF,//  // 27
              0xF7,0xEB,0xDD,0xBE,0xFF,0xFF,//  < 28
              0xEB,0xEB,0xEB,0xEB,0xEB,0xFF,//  = 29
              0xFF,0xBE,0xDD,0xEB,0xF7,0xFF,//  > 30
              0xFD,0xFE,0xAE,0xF6,0xF9,0xFF,//  ? 31
              0xCD,0xB6,0x8E,0xBE,0xC1,0xFF,//  @ 32
              0x83,0xF5,0xF6,0xF5,0x83,0xFF,//  A 33
              0xBE,0x80,0xB6,0xB6,0xC9,0xFF,//  B 34
              0xC1,0xBE,0xBE,0xBE,0xDD,0xFF,//  C 35
              0xBE,0x80,0xBE,0xBE,0xC1,0xFF,//  D 36
              0x80,0xB6,0xB6,0xB6,0xBE,0xFF,//  E 37
              0x80,0xF6,0xF6,0xFE,0xFE,0xFF,//  F 38
              0xC1,0xBE,0xB6,0xB6,0xC5,0xFF,//  G 39
              0x80,0xF7,0xF7,0xF7,0x80,0xFF,//  H 40
              0xFF,0xBE,0x80,0xBE,0xFF,0xFF,//  I 41
              0xDF,0xBF,0xBE,0xC0,0xFE,0xFF,//  J 42
              0x80,0xF7,0xEB,0xDD,0xBE,0xFF,//  K 43
              0x80,0xBF,0xBF,0xBF,0xFF,0xFF,//  L 44
              0x80,0xFD,0xF3,0xFD,0x80,0xFF,//  M 45
              0x80,0xFD,0xFB,0xF7,0x80,0xFF,//  N 46
              0xC1,0xBE,0xBE,0xBE,0xC1,0xFF,//  O 47
              0x80,0xF6,0xF6,0xF6,0xF9,0xFF,//  P 48
              0xC1,0xBE,0xAE,0xDE,0xA1,0xFF,//  Q 49
              0x80,0xF6,0xE6,0xD6,0xB9,0xFF,//  R 50
              0xD9,0xB6,0xB6,0xB6,0xCD,0xFF,//  S 51
              0xFE,0xFE,0x80,0xFE,0xFE,0xFF,//  T 52
              0xC0,0xBF,0xBF,0xBF,0xC0,0xFF,//  U 53
              0xE0,0xDF,0xBF,0xDF,0xE0,0xFF,//  V 54
              0xC0,0xBF,0xCF,0xBF,0xC0,0xFF,//  W 55
              0x9C,0xEB,0xF7,0xEB,0x9C,0xFF,//  X 56
              0xFC,0xFB,0x87,0xFB,0xFC,0xFF,//  Y 57
              0x9E,0xAE,0xB6,0xBA,0xBC,0xFF,//  Z 58
              0xFF,0x80,0xBE,0xBE,0xFF,0xFF,//  [ 59
              0xFD,0xFB,0xF7,0xEF,0xDF,0xFF,//  \ 60
              0xFF,0xBE,0xBE,0x80,0xFF,0xFF,//  ] 61
              0xFB,0xFD,0xFE,0xFD,0xFB,0xFF,//  ^ 92
              0x7F,0x7F,0x7F,0x7F,0x7F,0xFF,//  _ 63
              0xFF,0xFF,0xF8,0xF4,0xFF,0xFF,//  ' 64
              0xDF,0xAB,0xAB,0xAB,0xC7,0xFF,//  a 65
              0x80,0xC7,0xBB,0xBB,0xC7,0xFF,//  b 66
              0xFF,0xC7,0xBB,0xBB,0xBB,0xFF,//  c 67
              0xC7,0xBB,0xBB,0xC7,0x80,0xFF,//  d 68
              0xC7,0xAB,0xAB,0xAB,0xF7,0xFF,//  e 69
              0xF7,0x81,0xF6,0xF6,0xFD,0xFF,//  f 70
              0xF7,0xAB,0xAB,0xAB,0xC3,0xFF,//  g 71
              0x80,0xF7,0xFB,0xFB,0x87,0xFF,//  h 72
              0xFF,0xBB,0x82,0xBF,0xFF,0xFF,//  i 73
              0xDF,0xBF,0xBB,0xC2,0xFF,0xFF,//  j 74
              0xFF,0x80,0xEF,0xD7,0xBB,0xFF,//  k 75
              0xFF,0xBE,0x80,0xBF,0xFF,0xFF,//  l 76
              0x83,0xFB,0x87,0xFB,0x87,0xFF,//  m 77
              0x83,0xF7,0xFB,0xFB,0x87,0xFF,//  n 78
              0xC7,0xBB,0xBB,0xBB,0xC7,0xFF,//  o 79
              0x83,0xEB,0xEB,0xEB,0xF7,0xFF,//  p 80
              0xF7,0xEB,0xEB,0xEB,0x83,0xFF,//  q 81
              0x83,0xF7,0xFB,0xFB,0xF7,0xFF,//  r 82
              0xB7,0xAB,0xAB,0xAB,0xDB,0xFF,//  s 83
              0xFF,0xFB,0xC0,0xBB,0xBB,0xFF,//  t 84
              0xC3,0xBF,0xBF,0xDF,0x83,0xFF,//  u 85
              0xE3,0xDF,0xBF,0xDF,0xE3,0xFF,//  v 86
              0xC3,0xBF,0xCF,0xBF,0xC3,0xFF,//  w 87
              0xBB,0xD7,0xEF,0xD7,0xBB,0xFF,//  x 88
              0xF3,0xAF,0xAF,0xAF,0xC3,0xFF,//  y 89
              0xBB,0x9B,0xAB,0xB3,0xBB,0xFF,//  z 90
              0xFB,0xE1,0xE0,0xE1,0xFB,0xFF,//  ^ 62
              0xE3,0xE3,0xC1,0xE3,0xF7,0xFF,//  -> 93
              0xF7,0xE3,0xC1,0xE3,0xE3,0xFF,//  <- 94
              0xEF,0xC3,0x83,0xC3,0xEF,0xFF,//         95
              0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//  BLANK CHAR 96
};

Chương trình chính:
#include <REGX52.H> 
#include <string.h> 
#include <font.c> 

sbit SDA = P2^0; 
sbit SCL = P2^1; 
sbit STR = P2^2; 
#define  DataPort P1 
#define  With_of_font 6 
//------------------------------------------- 
//------------------------------------------- 
unsigned char *String_input="hello"; 
// thay doi chu chay bat ky o day !! 
unsigned int Pos=0,lengh_STR; 
unsigned char Tic=0;
unsigned char  sel_font; //biến dùng để chọn font chữ
unsigned char  col_font; //biến dùng để chọn cột của font chữ

void main () 

    unsigned char Temp_code; 
    unsigned int j; 
     
    TMOD=0x01; 
    TH0=TL0=-100; 
    TR0=1; 
    ET0=1; 
     
    lengh_STR = strlen(String_input)*6; 
     
    EA=1; 
     
    while(1) 
    { 
        SDA=1; 
        for(j=Pos;j<32+Pos;j++) 
        {
            sel_font= String_input[(j%lengh_STR)/With_of_font]-32;
            col_font= j%With_of_font;

            Temp_code=code_Tab[sel_font][col_font]; 
            DataPort=0xFF; 
            SCL=1; 
            SCL=0; 
            STR=1; 
            STR=0; 
            DataPort = Temp_code; 
            SDA=0; 
        } 
    } 



void INT_Timer0()interrupt 1 

    Tic++; 
    if(Tic==2) 
    { 
        Tic=0; 
        Pos++; 
        if(Pos>=lengh_STR) 
            Pos=0; 
    } 
}  

3.      Hoạt động
Chương trình hoạt động theo phương pháp tra bảng mã ascii tương ứng của ký tự cần hiển thị. Bộ mã ascii được lưu trong file “font.c”. Cần lưu ý, bộ mã ascii thông thường bao gồm 128 ký tự, bắt đầu từ 0 đến 127. Trong đó 32 ký tự đầu tiên từ 0 đến 31 là ký tự điều khiển. Các ký tự này không có tác dụng trong việc hiển thị, cho nên khi tạo bảng font ta bỏ qua 32 ký tự này, nên số ký tự hiển thị chỉ còn 97 ký tự.

Ta tiến hành phân tích chương trình bằng cách tách ra thành 3 đoạn nhỏ để dễ hiểu và quản lý chương trình hơn.

a.      Đọc độ dài của chuỗi ký tự hiển thị
lengh_STR = strlen(String_input)*6

Xem đoạn code trên ta thấy nó sử dụng hàm strlen(). Đây là hàm trả về độ dài của một chuỗi ký tự. Hàm này thuộc thư viện string.h do đó để sử dụng hàm này ta phải include thư viện string.h vào chương trình.

Như đã thấy trong bộ font của ta là font 5x7 bao gồm 5 cột và 7 dòng. Gọi là font 5x7 nhưng thực tế nó là font 6x7 vì độ rộng một ký tự là 6 cột tuy nhiên có một cột ta dùng làm khoảng cách giữa các ký tự với nhau để các ký tự không bị sát nhau khi hiển thị. Do đó độ rộng thực tế của một ký tự là 6.
Vì vậy, độ rộng của một chuỗi ký tự thực tế sẽ là giá trị trả về của hàm strlen() và được nhân với độ rộng một ký tự là 6. Giá trị này được lưu trong biến lengh_STR. Biến này có tác dụng quan trọng trong việc lấy giá trị ascii của từng ký tự sau này.

VD: Có chuỗi ký tự là *string=”1234” thì câu lệnh
            Do_dai_chuoi = strlen(string)*6;
Sẽ trả về giá trị là 24 và được lưu trong biến Do_dai_chuoi.

b.      Tách và xuất chuỗi ra led ma trận
Ta xét đoạn code sau:
while(1) 

    SDA=1; 
    for(j=Pos;j<32+Pos;j++) 
    { 
        sel_font= String_input[(j%lengh_STR)/With_of_font]-32;
        col_font= j%With_of_font;

        Temp_code=code_Tab[sel_font][col_font]; 
        DataPort=0xFF; 
        SCL=1; 
        SCL=0; 
        STR=1; 
        STR=0; 
        DataPort = Temp_code; 
        SDA=0; 
    } 


Trong đoạn code trên ta chú ý đến câu lệnh được bôi đỏ là
Temp_code=code_Tab[sel_font][col_font]; 
Ta xét 2 đối số nằm trong code_Tab[ ][ ]
Ø  sel_font= String_input[(j%lengh_STR)/With_of_font]-32;

-          Đoạn code này có tác dụng trả về mã ascii tương ứng của ký tự tương ứng trong chuỗi hiển thị. Với With_of_font = 6 là độ rộng của font mà ta đã định nghĩa trong chương trình bằng tiền tố #define.

-           Tuy nhiên như đã nói từ đầu là bảng mã ascii này ta bỏ qua 32 ký tự điều khiển đầu tiên, do đó ta cần trừ đi 32 để đúng với vị trí font trong bảng mã font đã tạo.

VD: Khi ta hiển thị chữ “a” thì câu lệnh trên sẽ trả về giá trị là 97 – 32 = 65, ứng với vị trí chữ “a” trong bảng mã ta đã tạo trong file font.c

-          Biến j là biến đếm của vòng lặp for(j=0;j<32;i++), trong đó 32 là số cột của led ma trận chứ không phải như “32” ở đoạn code phía trên

Ø  col_font= j%With_of_font;

-          Đoạn code này có tác dụng chọn cột của font. Bộ font của ta thực tế là font 6x7. Đoạn code này sẽ lấy giá trị của biến đếm j chia lấy dư cho with_of_font=6 nghĩa là j%6.
-          Lưu ý: Một số a chia lấy phần dư với một số b thì phần dư luôn có giá trị lớn hơn hoặc bằng 0 và nhỏ hơn b (0 <= phần dư < b).
-          Do đó câu lệnh j%With_of_font luôn có giá trị từ 0 đến 5, tương ứng với 6 cột của font.

c.       Dịch chuỗi cần hiển thị từ phải qua trái
Ta xét đoạn code trong chương trình ngắt Timer0
void INT_Timer0()interrupt 1 

    Tic++; 
    if(Tic==2) 
    { 
        Tic=0; 
        Pos++; 
        if(Pos>=lengh_STR) 
            Pos=0; 
    } 
}  
   
Trong đoạn chương trình này, biến Tic có tác dụng tăng hoặc giảm thời gian dịch chuỗi. Ta có thể bỏ biến Tic, thay vào đó là thay đổi giá trị nạp vào thanh ghi TH0 và TL0 để thay đổi thời gian dịch. Biến Pos kết hợp với biến đếm j ở đoạn chương trình thứ 2 có tác dụng dịch phải chuỗi cần hiển thị

Nguồn tri-iuh

Điện Tử | Tin Học - echipkool.com - Chia sẻ kiến thức - Kết nối đam mê điện tử