cwjyyds806231 2024-08-11 20:17 采纳率: 25%
浏览 17
已结题

8乘8点阵显示I Love you,要求看下文

一.用KIEL软件
二.取字模软件
三.8乘8点阵配合74HC595芯片,并搭配独立按键实现以下功能:
1.没有任何独立按键按下的时候,点阵按字母逐个显示"I Love you"
1.重新回到中心点,当K1按键按下点阵显示"I Love you"并一个字母接着一个字母往上移动。
2.重新回到中心点,当K2按键按下点阵显示"I Love you"并一个字母接着一个字母往下移动
3.重新回到中心点,当K3按键按下点阵显示"I Love you"并一个字母接着一个字母往左移动
4.重新回到中心点,当K4按键按下点阵显示"I Love you"并一个字母接着一个字母往右移动

img

img

  • 写回答

15条回答 默认 最新

  • 专家-皆知 2024-08-11 20:18
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    要实现您描述的功能,我们将分步进行。首先,我们需要准备几个关键部分的代码:字符点阵数据、74HC595控制代码、独立按键扫描及处理逻辑、以及动画循环控制。下面我会逐一提供指导和代码示例。

    1. 字符点阵数据获取

    首先,使用取字模软件(例如:LCDSample)获取"I Love you"每个字符的8x8点阵数据。这里直接提供点阵数据以简化流程(实际应用中,您需自行生成):

    // 示例点阵数据,实际应根据取字模软件获取
    const uint8_t I_LOVE_YOU[12][8] = {
        // 'I' 点阵
        {0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
        // 后续字符数据依此类推...
    };
    

    2. 74HC595控制代码

    74HC595是串入并出的移位寄存器,用于扩展单片机的输出端口。控制代码如下:

    void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) {
        for (uint8_t i = 0; i < 8; i++) {
            if (bitOrder == LSBFIRST)
                digitalWrite(dataPin, !!(val & (1 << i)));
            else
                digitalWrite(dataPin, !!(val & (1 << (7 - i))));
            digitalWrite(clockPin, HIGH);
            digitalWrite(clockPin, LOW);
        }
    }
    
    void sendTo74HC595(uint8_t data) {
        digitalWrite(SRCLR, LOW);  // 清除锁存器
        shiftOut(DPb, SRCLK, LSBFIRST, data);  // 通过DPb发送数据
        digitalWrite(SRCLK, HIGH);
        digitalWrite(SRCLK, LOW);
        digitalWrite(SRCLR, HIGH);  // 设置锁存器
    }
    

    3. 独立按键扫描及处理

    #define K1 P00
    #define K2 P01
    #define K3 P02
    #define K4 P03
    
    bool readButton(uint8_t pin) {
        return digitalRead(pin) == LOW;
    }
    
    void handleButtons() {
        static bool k1Pressed = false, k2Pressed = false, k3Pressed = false, k4Pressed = false;
    
        if (readButton(K1) && !k1Pressed) {
            // K1 按下逻辑
            k1Pressed = true;
        } else if (!readButton(K1)) {
            k1Pressed = false;
        }
    
        // 类似地处理其他按键...
    
        delay(10);  // 防止按键抖动
    }
    

    4. 动画循环控制

    根据您的需求,我们需要在主循环中实现不同的动画效果。

    int positionX = 4;  // 初始位置
    int positionY = 4;  // 假设点阵中心位置
    bool movingUp = false, movingDown = false, movingLeft = false, movingRight = false;
    int directionCounter = 0;  // 计数器用于控制移动速度
    
    void loop() {
        handleButtons();
    
        if (!movingUp && !movingDown && !movingLeft && !movingRight) {
            // 显示 "I Love you" 并逐个字母移动
            // 实现逻辑...
        } else {
            // 根据按键状态调整位置
            if (movingUp) positionY--;
            else if (movingDown) positionY++;
            else if (movingLeft) positionX--;
            else if (movingRight) positionX++;
    
            // 限制位置范围,避免超出点阵边界
            positionX = constrain(positionX, 0, 7);
            positionY = constrain(positionY, 0, 7);
    
            // 显示当前字符
            displayCharacterAtPosition(positionX, positionY, currentChar);  // currentChar 需要根据当前显示的字符更新
        }
    
        delay(100);  // 控制动画速度
    }
    
    void displayCharacterAtPosition(int x, int y, uint8_t character) {
        // 根据点阵数据和位置显示字符
        // 实现逻辑...
    }
    

    以上代码仅为框架和思路展示,具体实现时还需结合实际硬件接线和逻辑细节进行调整。比如displayCharacterAtPosition函数需要依据74HC595的具体控制逻辑来实现字符在指定位置的显示。同时,每个字符的点阵数据需要正确赋值给I_LOVE_YOU数组,并且在主循环中通过索引正确访问到每个字符。

    请注意,由于篇幅限制和具体实现的复杂性,这里没有提供所有细节代码。您可能需要根据实际情况调整和完善上述代码片段。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月12日
  • 创建了问题 8月11日

悬赏问题

  • ¥60 如何批量获取json的url
  • ¥15 对法兰连接元件所承受的表面载荷等效转化为法兰开孔接触面上的等效表面载荷?
  • ¥15 comsol仿真压阻传感器
  • ¥15 Python线性规划函数optimize.linprog求解为整数
  • ¥15 llama3中文版微调
  • ¥15 pg数据库导入数据序列重复
  • ¥15 三分类机器学习模型可视化分析
  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
  • ¥30 python,LLM 文本提炼