亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3|回復: 0
打印 上一主題 下一主題
收起左側

基于51單片機的16×128 LED點陣滾動顯示系統(74HC154+595)

[復制鏈接]
跳轉到指定樓層
樓主
這個項目最初是為一個客戶定制的——采用51單片機驅動 16行 × 128列(8塊16×16點陣拼接)的LED點陣屏,實現文字滾動顯示。期間經歷了硬件搭建、驅動調試,最終成功實現了穩定的顯示效果。雖然由于某些原因項目未能最終交付(客戶原因),但我決定將整個工程開源,供有需要的電子愛好者、學生或創客參考、使用和改進,為真正進步的人提供資源
開源的意義:讓更多人能低成本玩轉大屏點陣,同時避免后來者踩我踩過的坑。如果你覺得有用,歡迎留言,或提出改進建議
不要黑幣,為技術發熱

  • 顯示尺寸:128列 × 16行(相當于8個16×16模塊水平拼接)
  • 驅動方式:動態掃描(逐行掃描),列數據串行移位
  • 主控芯片:STC89C52(或任何標準51單片機)
  • 行掃描:1片74HC154(4-16譯碼器),輸出經反相器后驅動行(高電平有效)
  • 列數據:16片74HC595級聯(每片控制8列,共128列),數據輸出低電平點亮
  • 顯示內容:支持任意16×16點陣字模(或更大),可自定義字符、漢字、圖形
  • 滾動效果:支持從左向右、從右向左、上下滾動等,速度可調

    [td]
    單片機引腳
    功能
    連接對象
    P2.0 ~ P2.3行選擇(4位地址)74HC154的A、B、C、D
    P2.4595移位時鐘(SH_CP)所有595的SH_CP并聯
    P2.5595數據輸入(DS)第一片595的DS
    P2.6595鎖存時鐘(ST_CP)所有595的ST_CP并聯



行掃描部分:
  • 74HC154的E0、E1接地(使能有效)。
  • 輸出端Y0~Y15分別接 反相器(如74HC04或三極管),反相器輸出接LED點陣的行公共端。
  • 原因:74HC154為低電平有效,而我們需要的行驅動是高電平有效(點亮行),因此必須加反相器。

列驅動部分:
  • 16片74HC595級聯:第一片的Q7'接第二片的DS,依次類推。
  • 所有595的OE腳接地(使能輸出),MR腳接VCC(禁止復位)。
  • 每個595的Q0~Q7分別接LED點陣的列陰極(因為列低電平點亮)。
    1. #include <reg52.h>
    2. #include <intrins.h>

    3. // ===================== 引腳定義 =====================
    4. sbit DS  = P2^5;   // 595 數據輸入
    5. sbit SH  = P2^4;   // 595 移位時鐘
    6. sbit ST  = P2^6;   // 595 鎖存時鐘

    7. // 行選宏:P2.0~P2.3 控制 74HC154,輸出低電平,經反相器后行實際為高電平點亮
    8. #define SetRow(n)  do { P2 = (P2 & 0xF0) | ((n) & 0x0F); } while(0)

    9. // ===================== 發送一個字節 =====================
    10. void SendByte(unsigned char dat) {
    11.     unsigned char i;
    12.     for (i = 0; i < 8; i++) {
    13.         DS = (dat & 0x80) ? 1 : 0;
    14.         SH = 0;
    15.         SH = 1;
    16.         dat <<= 1;
    17.     }
    18. }

    19. // ===================== 發送一行的128位列數據 =====================
    20. // row_data: 指向16字節數組,每個字節代表8列(低電平有效)
    21. void SendRowData(unsigned char *row_data) {
    22.     unsigned char i;
    23.     // 發送順序:先發最后一片(最右邊8列),再發第一片(最左邊8列)
    24.     // 若您的級聯順序相反,請將循環改為 for(i=0; i<16; i++)
    25.     for (i = 16; i > 0; i--) {
    26.         SendByte(row_data[i-1]);   // 直接發送,因為列低電平亮,0點亮
    27.     }
    28.     ST = 0;
    29.     ST = 1;
    30.     ST = 0;
    31. }

    32. // ===================== 微秒延時(調節亮度) =====================
    33. void delay_us(unsigned int t) {
    34.     while (t--) _nop_();
    35. }

    36. // ===================== 字模定義(16×16,列格式) =====================
    37. // 這里以“Hello”的字模示例,實際使用時可用取模軟件生成
    38. code unsigned char font_Hello[][32] = {
    39.     // 'H' (0)
    40.     {0x00,0x00, 0x00,0x00, 0x00,0x00, 0x82,0x00, 0x82,0x00, 0x82,0x00, 0x82,0x00, 0xFE,0x00,
    41.      0xFE,0x00, 0x82,0x00, 0x82,0x00, 0x82,0x00, 0x82,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00},
    42.     // 'e' (1)
    43.     {0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x3C,0x00, 0x42,0x00, 0x80,0x00,
    44.      0xFC,0x00, 0x82,0x00, 0x42,0x00, 0x3C,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00},
    45.     // 'l' (2)
    46.     {0x00,0x00, 0x00,0x00, 0x00,0x00, 0x40,0x00, 0x40,0x00, 0x40,0x00, 0x40,0x00, 0x40,0x00,
    47.      0x40,0x00, 0x40,0x00, 0x40,0x00, 0x7E,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00},
    48.     // 'l' (3) 同上
    49.     {0x00,0x00, 0x00,0x00, 0x00,0x00, 0x40,0x00, 0x40,0x00, 0x40,0x00, 0x40,0x00, 0x40,0x00,
    50.      0x40,0x00, 0x40,0x00, 0x40,0x00, 0x7E,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00},
    51.     // 'o' (4)
    52.     {0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x3C,0x00, 0x42,0x00, 0x82,0x00,
    53.      0x82,0x00, 0x42,0x00, 0x3C,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00}
    54. };

    55. #define CHAR_NUM  5          // 顯示字符個數
    56. #define CHAR_WIDTH 16        // 每個字符列數
    57. #define BLANK_COLS 32        // 左右空白列數
    58. #define TOTAL_COLS (BLANK_COLS + CHAR_NUM*CHAR_WIDTH + BLANK_COLS)
    59. #define SCREEN_COLS 128
    60. #define ROWS 16

    61. // ===================== 顯存(16行 × 16字節) =====================
    62. unsigned char display_buf[ROWS][16];

    63. // ===================== 更新顯存 =====================
    64. // offset: 當前窗口在總內容中的起始列索引
    65. void UpdateBuffer(unsigned int offset) {
    66.     unsigned char row, col_byte, bit_pos;
    67.     unsigned int src_col;
    68.     unsigned char char_idx, col_in_char;
    69.     unsigned char byte0, byte1;

    70.     // 1. 清空顯存(默認全滅,即所有位為1)
    71.     for (row = 0; row < ROWS; row++)
    72.         for (col_byte = 0; col_byte < 16; col_byte++)
    73.             display_buf[row][col_byte] = 0xFF;

    74.     // 2. 填充屏幕內的有效列
    75.     for (col_byte = 0; col_byte < 16; col_byte++) {
    76.         for (bit_pos = 0; bit_pos < 8; bit_pos++) {
    77.             src_col = offset + col_byte*8 + bit_pos;
    78.             if (src_col >= TOTAL_COLS) continue;
    79.             if (src_col < BLANK_COLS) continue;
    80.             char_idx = (src_col - BLANK_COLS) / CHAR_WIDTH;
    81.             col_in_char = (src_col - BLANK_COLS) % CHAR_WIDTH;
    82.             if (char_idx >= CHAR_NUM) continue;

    83.             // 從字模中獲取該列數據
    84.             byte0 = font_Hello[char_idx][col_in_char*2];
    85.             byte1 = font_Hello[char_idx][col_in_char*2 + 1];
    86.             // 將該列數據寫入每一行的對應列(注意:低電平亮,位0表示點亮)
    87.             for (row = 0; row < 8; row++) {
    88.                 if ((byte0 >> row) & 0x01)
    89.                     display_buf[row][col_byte] &= ~(0x80 >> bit_pos);
    90.             }
    91.             for (row = 0; row < 8; row++) {
    92.                 if ((byte1 >> row) & 0x01)
    93.                     display_buf[row+8][col_byte] &= ~(0x80 >> bit_pos);
    94.             }
    95.         }
    96.     }
    97. }

    98. // ===================== 顯示一幀(逐行掃描) =====================
    99. void DisplayFrame(void) {
    100.     unsigned char row;
    101.     for (row = 0; row < ROWS; row++) {
    102.         SetRow(row);
    103.         SendRowData(display_buf[row]);
    104.         delay_us(300);   // 調節亮度,總周期 < 16*300us ≈ 4.8ms,流暢無閃爍
    105.     }
    106. }

    107. // ===================== 定時器及滾動控制 =====================
    108. unsigned int offset = 0;
    109. unsigned char speed_cnt = 0;
    110. #define SPEED 8         // 速度值,越大越慢
    111. bit update_flag = 0;

    112. void Timer0_Init(void) {
    113.     TMOD = 0x01;
    114.     TH0 = (65536 - 10000) / 256;   // 10ms定時
    115.     TL0 = (65536 - 10000) % 256;
    116.     TR0 = 1;
    117.     ET0 = 1;
    118.     EA = 1;
    119. }

    120. void Timer0_ISR(void) interrupt 1 {
    121.     TH0 = (65536 - 10000) / 256;
    122.     TL0 = (65536 - 10000) % 256;
    123.     speed_cnt++;
    124.     if (speed_cnt >= SPEED) {
    125.         speed_cnt = 0;
    126.         offset++;
    127.         if (offset >= TOTAL_COLS - SCREEN_COLS) offset = 0;
    128.         update_flag = 1;
    129.     }
    130. }

    131. // ===================== 主函數 =====================
    132. void main(void) {
    133.     UpdateBuffer(0);
    134.     Timer0_Init();
    135.     while (1) {
    136.         DisplayFrame();
    137.         if (update_flag) {
    138.             update_flag = 0;
    139.             UpdateBuffer(offset);
    140.         }
    141.     }
    142. }
    復制代碼



3b6045c49916eb2d3c95444e3e670e0c.png (1007.29 KB, 下載次數: 0)

行跑馬燈演示

行跑馬燈演示

16方點陣滾動顯示.zip

145.89 KB, 下載次數: 0, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表