久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
單片機(jī),為什么我的鍵盤沒反應(yīng)
[打印本頁]
作者:
222222222jj
時間:
2024-12-14 16:35
標(biāo)題:
單片機(jī),為什么我的鍵盤沒反應(yīng)
#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 光標(biāo)位置
void lcd_set_cursor(unsigned char row, unsigned char col);
// 控制步進(jìn)電機(jī)
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); // 顯示開,光標(biāo)關(guān),閃爍關(guān)
lcd_command(0x06); // 輸入模式設(shè)置:光標(biāo)遞增,不移動
lcd_command(0x01); // 清屏,光標(biāo)移到首頁
delay(2); // 等待超過 1.53ms
}
// 在 LCD 上顯示字符串
void lcd_string(char *str) {
while (*str) {
lcd_data(*str++);
}
}
// 設(shè)置 LCD 光標(biāo)位置
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);
}
// 控制步進(jìn)電機(jī)
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]);
}
}
}
作者:
rayin
時間:
2025-1-24 13:11
要用邏輯分析儀測試一下,char key_scan()函數(shù)中的 delay_ms(50)是不是確實有50ms, 這個與晶振的數(shù)值有很大關(guān)系.
作者:
lkc8210
時間:
2025-1-26 16:03
原理圖呢?用什么開發(fā)板?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产欧美性成人精品午夜
|
日韩不卡一区二区
|
色偷偷人人澡人人爽人人模
|
国产精品美女一区二区
|
黄 色 毛片免费
|
久草视
|
国产99久久精品一区二区永久免费
|
九九热精品在线
|
久久婷婷麻豆国产91天堂
|
91精品国产综合久久久久久
|
欧美成人自拍视频
|
亚洲福利网站
|
在线视频 亚洲
|
国产91精品久久久久久久网曝门
|
久久精品91
|
成人一级片在线观看
|
国产一区免费视频
|
欧美福利视频
|
久久一级大片
|
你懂的免费在线
|
国产午夜影院
|
www.国产一区
|
欧美国产日韩在线观看成人
|
最新伦理片
|
久久久久久久久久久国产
|
亚洲国产成人av好男人在线观看
|
人人99
|
日韩成人一区二区
|
国产精品久久久久久久久久久久午夜片
|
麻豆av一区二区三区久久
|
99久久久久
|
99国产精品久久久
|
欧洲一区二区三区
|
一级黄色绿像片
|
亚洲精品自拍视频
|
精品欧美乱码久久久久久1区2区
|
黄色在线免费观看视频
|
国产亚洲精品综合一区
|
久久99精品国产
|
91精品一区二区三区久久久久
|
在线视频 亚洲
|