[英]Rx and Tx pin of Arduino Uno not usable as input with serial communication via USB?
我目前正在从事一个涉及 LCD、传感器和键盘的项目。
Arduino Uno 有 14 个输入/输出引脚(0-13,0 为 Rx,1 为 Tx)。
LCD 本身占用 5 个引脚(引脚 8-12)、传感器 1(引脚 7)和键盘7(引脚 0-6),这很好,因为我有 14 个潜在引脚。
所以我下载了一个基本程序来快速测试键盘并调整必要的变量。 我想通过串行通信在计算机上显示数字。 第 1 行和第 4 行有效,第 2 行和第 3 行无效。 键盘不可能有故障,因为我测量了每个组合的电阻。 然后我意识到保存第 2 行和第 3 行信息的引脚连接到 Arduino Uno(Rx 和 Tx)的引脚 0 和 1。
串行通信处于活动状态时是否可以使用引脚 0 和 1 作为输入?
如果是,它必须是代码:
/* SparkFun Keypad Pinout:
Rows and columns are connected as such:
-------------
R1 | 1 | 2 | 3 | - 5 (grün)
R2 | 4 | 5 | 6 | - 0 (braun)
R3 | 7 | 8 | 9 | - 1 (schwarz)
R4 | * | 0 | # | - 3 (violett)
-------------
|C1 |C2 |C3
4(blau) 6(gelb) 2(weiß)
*/
// Pins 1-7 of the keypad connected to the Arduino respectively:
int keypadPins[7] = {0, 1, 2, 3, 4, 5, 6};
int keypadStatus; // Used to monitor which buttons are pressed.
int timeout; // timeout variable used in loop
void setup()
{
Serial.begin(9600);
for (int i=0; i<7; i++)
{
pinMode(keypadPins[i], INPUT); // Set all keypad pins as inputs
digitalWrite(keypadPins[i], HIGH); // pull all keypad pins high
}
}
void loop()
{
keypadStatus = getKeypadStatus(); // read which buttons are pressed
if (keypadStatus != 0) // If a button is pressed go into here
{
sendKeyPress(keypadStatus); // send the button over USB
timeout = 2000; // top of the repeat delay
while ((getKeypadStatus() == keypadStatus) && (--timeout)) // Decrement timeout and check if key is being held down
delayMicroseconds(1);
while (getKeypadStatus() == keypadStatus) // while the same button is held down
{
sendKeyPress(keypadStatus); // continue to send the button over USB
delay(50); // 50ms repeat rate
}
}
}
/* sendKeyPress(int key): This function sends a single key over USB
It requires an int, of which the 12 LSbs are used. Each bit in
key represents a single button on the keypad.
This function will only send a key press if a single button
is being pressed */
void sendKeyPress(int key)
{
switch(key)
{
case 1: // 0x001
Serial.print('1'); // Sends a keyboard '1'
break;
case 2: // 0x002
Serial.print('2');
break;
case 4: // 0x004
Serial.print('3');
break;
case 8: // 0x008
Serial.print('4');
break;
case 16: // 0x010
Serial.print('5');
break;
case 32: // 0x020
Serial.print('6');
break;
case 64: // 0x040
Serial.print('7');
break;
case 128: // 0x080
Serial.print('8');
break;
case 256: // 0x100
Serial.print('9');
break;
case 512: // 0x200
Serial.print('*');
break;
case 1024: // 0x400
Serial.print('0'); // Sends a keyboard '0'
break;
case 2048: // 0x800
Serial.print('\n'); // Sends the 'ENTER' key
break;
}
}
/* getKeypadStatus(): This function returns an int that represents
the status of the 12-button keypad. Only the 12 LSb's of the return
value hold any significange. Each bit represents the status of a single
key on the button pad. '1' is bit 0, '2' is bit 1, '3' is bit 2, ...,
'#' is bit 11.
This function doesn't work for multitouch.
*/
int getKeypadStatus()
{
int rowPins[4] = {keypadPins[5], keypadPins[0], keypadPins[1], keypadPins[3]}; // row pins are 5, 0, 1, and 3 of the keypad
int columnPins[3] = {keypadPins[4], keypadPins[6], keypadPins[2]}; // column pins are pins 2, 4, and 6 of the keypad
int keypadStatus = 0; // this will be what's returned
/* initialize all pins, inputs w/ pull-ups */
for (int i=0; i<7; i++)
{
pinMode(keypadPins[i], INPUT);
digitalWrite(keypadPins[i], HIGH);
}
for (int row=0; row<4; row++)
{ // initial for loop to check all 4 rows
pinMode(rowPins[row], OUTPUT); // set the row pin as an output
digitalWrite(rowPins[row], LOW); // pull the row pins low
for (int col=0; col<3; col++)
{ // embedded for loop to check all 3 columns of each row
if (!digitalRead(columnPins[col]))
{
keypadStatus |= 1 << ((row+1)*3 + (col+1) - 4); // set the status bit of the keypad return value
}
}
pinMode(rowPins[row], INPUT); // reset the row pin as an input
digitalWrite(rowPins[row], HIGH); // pull the row pin high
}
return keypadStatus;
}
是否可以在进行通信时使用 Pin 0 和 1 作为输入?
我从未使用过这部分,但我仍然只花了几分钟时间就找到了 RTFM ATmega328P p.71 的相关文本
• TXD/PCINT17——端口 D,位 1 TXD,发送数据(用于 USART 的数据 output 引脚)。 当 USART 发送器使能时,无论 DDD1 的值如何,该引脚都配置为 output。
• RXD/PCINT16——端口 D,位 0 RXD,接收数据(USART 的数据输入引脚)。 当 USART 接收器使能时,无论 DDD0 的值如何,该引脚都被配置为输入。 当 USART 强制该引脚为输入时,上拉仍然可以由 PORTD0 位控制。
因此,我建议您熟悉友好的 MCU 手册,而不是 Arduino 这个和 Arduino。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.