久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 881|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機,為什么我的鍵盤沒反應(yīng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1139566 發(fā)表于 2024-12-14 16:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg51.h>

// 定義 LCD 控制端口
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;

unsigned int speed = 0; // 轉(zhuǎn)速(0-3000 r/min)
unsigned int angle = 0; // 角位移(2-9999 °)

// 延時函數(shù)
void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 123; j++);
}

// LCD 使能函數(shù)
void lcd_enable() {
    EN = 1;
    delay(1);
    EN = 0;
}

// 發(fā)送命令到 LCD
void lcd_command(unsigned char cmd);

// 發(fā)送數(shù)據(jù)到 LCD
void lcd_data(unsigned char data_byte);

// 初始化 LCD
void lcd_init();

// 在 LCD 上顯示字符串
void lcd_string(char *str);

// 設(shè)置 LCD 光標位置
void lcd_set_cursor(unsigned char row, unsigned char col);

// 控制步進電機
void step_motor(unsigned char pattern);

// 鍵盤掃描
char key_scan();

// 更新 LCD 顯示
void update_display();

// 輸入值
void input_value(unsigned int *value, unsigned int min, unsigned int max);

// 清除 LCD 顯示
void lcd_clear();

// 發(fā)送命令到 LCD
void lcd_command(unsigned char cmd) {
    P0 = cmd;
    RS = 0;
    RW = 0;
    lcd_enable();
}

// 發(fā)送數(shù)據(jù)到 LCD
void lcd_data(unsigned char data_byte) {
    P0 = data_byte;
    RS = 1;
    RW = 0;
    lcd_enable();
}

// 初始化 LCD
void lcd_init() {
    delay(15);          // 等待超過 15ms 后上電
    lcd_command(0x38);  // 功能設(shè)置:8 位,2 行,5x7 點
    delay(5);           // 等待超過 4.1ms
    lcd_command(0x38);  // 功能設(shè)置:8 位,2 行,5x7 點
    delay(1);           // 等待超過 100us
    lcd_command(0x38);  // 功能設(shè)置:8 位,2 行,5x7 點
    lcd_command(0x0C);  // 顯示開,光標關(guān),閃爍關(guān)
    lcd_command(0x06);  // 輸入模式設(shè)置:光標遞增,不移動
    lcd_command(0x01);  // 清屏,光標移到首頁
    delay(2);           // 等待超過 1.53ms
}

// 在 LCD 上顯示字符串
void lcd_string(char *str) {
    while (*str) {
        lcd_data(*str++);
    }
}

// 設(shè)置 LCD 光標位置
void lcd_set_cursor(unsigned char row, unsigned char col) {
    unsigned char addr;
    if (row == 0)
        addr = 0x80 + col;
    else
        addr = 0xC0 + col;
    lcd_command(addr);
}

// 控制步進電機
void step_motor(unsigned char pattern) {
    P1 = pattern;
    delay(speed / 10); // 通過調(diào)整延時來控制速度
}

// 鍵盤掃描
char key_scan() {
    static unsigned char last_key = '\0';
    unsigned char rows[] = {0xF7, 0xFB, 0xFD, 0xFE}; // 行掃描碼
    unsigned char cols[] = {0xEF, 0xDF, 0xBF, 0x7F}; // 列掃描碼
    unsigned char key_matrix[4][4] = {
        {'1', '2', '3', 'A'},
        {'4', '5', '6', 'B'},
        {'7', '8', '9', 'C'},
        {'*', '0', '#', 'D'}
    };
    unsigned char row, col;

    for (row = 0; row < 4; row++) {
        P3 = rows[row]; // 設(shè)置行掃描碼
        for (col = 0; col < 4; col++) {
            if (!(P3 & cols[col])) { // 檢測列掃描碼
                delay(50); // 增加延時時間以消除抖動
                if (last_key != key_matrix[row][col]) {
                    last_key = key_matrix[row][col];
                    return last_key;
                }
            }
        }
    }
    last_key = '\0'; // 沒有按鍵按下
    return '\0';
}

// 更新 LCD 顯示
void update_display() {
    lcd_set_cursor(0, 0);
    lcd_string("Speed:");
    lcd_data((speed / 1000) + '0');
    lcd_data(((speed % 1000) / 100) + '0');
    lcd_data(((speed % 100) / 10) + '0');
    lcd_data((speed % 10) + '0');
    lcd_string(" RPM");

    lcd_set_cursor(1, 0);
    lcd_string("Angle:");
    lcd_data((angle / 1000) + '0');
    lcd_data(((angle % 1000) / 100) + '0');
    lcd_data(((angle % 100) / 10) + '0');
    lcd_data((angle % 10) + '0');
    lcd_string(" DEG");
}

// 輸入值
void input_value(unsigned int *value, unsigned int min, unsigned int max) {
    unsigned int temp_value = 0;
    char key_pressed;
    char buffer[5];
    unsigned char index = 0;

    lcd_clear(); // 清屏
    lcd_set_cursor(0, 0);
    lcd_string("Enter Value:");

    while (1) {
        key_pressed = key_scan();
        if (key_pressed >= '0' && key_pressed <= '9') {
            if (index < 4) {
                buffer[index++] = key_pressed;
                lcd_data(key_pressed);
                temp_value = temp_value * 10 + (key_pressed - '0');
            }
        } else if (key_pressed == '#') {
            if (temp_value >= min && temp_value <= max) {
                *value = temp_value;
                break;
            } else {
                lcd_set_cursor(1, 0);
                lcd_string("Invalid! Retry:");
                delay(2000);
                lcd_clear();
                lcd_set_cursor(0, 0);
                lcd_string("Enter Value:");
                temp_value = 0;
                index = 0;
            }
        }
    }
}

// 清除 LCD 顯示
void lcd_clear() {
    lcd_command(0x01);
    delay(2);
}

void main() {
    unsigned char patterns[] = {0x06, 0x0E, 0x1E, 0x3E, 0x3F, 0x2F};
    unsigned char key_pressed;
    unsigned char i;

    lcd_init();
    update_display();

    while (1) {
        key_pressed = key_scan();
        switch (key_pressed) {
            case '1':
                input_value(&speed, 0, 3000);
                update_display();
                break;
            case '2':
                input_value(&speed, 0, 3000);
                update_display();
                break;
            case '3':
                input_value(&angle, 2, 9999);
                update_display();
                break;
            case '4':
                input_value(&angle, 2, 9999);
                update_display();
                break;
            default:
                break;
        }

        for (i = 0; i < 6; i++) {
            step_motor(patterns[i]);
        }
    }
}


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

使用道具 舉報

沙發(fā)
ID:517951 發(fā)表于 2025-1-24 13:11 | 只看該作者
要用邏輯分析儀測試一下,char key_scan()函數(shù)中的 delay_ms(50)是不是確實有50ms, 這個與晶振的數(shù)值有很大關(guān)系.
回復(fù)

使用道具 舉報

板凳
ID:161164 發(fā)表于 2025-1-26 16:03 | 只看該作者
原理圖呢?用什么開發(fā)板?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产最新精品视频 | 日韩精品一区二区三区视频播放 | 激情综合五月天 | www.性色 | 欧美性精品 | 午夜精品久久久久99蜜 | 女人毛片a毛片久久人人 | 精品影院| 一区二区中文字幕 | 亚洲欧美日韩国产 | 国产精品久久 | 日韩精品视频在线播放 | 久草高清视频 | 四虎在线播放 | www.欧美| 亚洲一区二区三区免费 | 欧美日韩综合 | 爱爱视频在线观看 | 天天射网站 | 91精品国产麻豆 | 成人精品国产 | 狠狠躁夜夜躁人人爽天天高潮 | 欧美久久一区 | 91福利网址 | 伊人婷婷 | 婷婷综合网 | 久久久久久美女 | 中国av在线免费观看 | 欧美一级在线观看 | 久久精品小视频 | 精品久久国产 | 亚洲一区免费在线 | 特级丰满少妇一级aaaa爱毛片 | 午夜在线视频一区二区三区 | 欧美精品久久久久 | 精品国产一区二区在线 | 成人福利在线观看 | 高清久久 | 99视频免费 | 精品久久久久一区二区国产 | 国产精品久久777777 |