C++ ASM I/O引脚HCS12微控制器

C++ ASM I/O引脚HCS12微控制器,c++,c,assembly,microcontroller,C++,C,Assembly,Microcontroller,Iam使用HCS12微控制器。我使用的以下程序从车载键盘获取输入,并根据按下的键向车载LCD显示字母(我只附加了处理输入/输出的代码部分,如果需要,我可以附加其余部分,但这样对眼睛更容易) 我想做的是摆脱被用作输入的键盘,而是使用我拥有的一个传感器,它通过3个单独的引脚发送有效的低电平信号。这样,每当传感器读取其中一个读数(PortA1、Porta2或Porta3)时,它将显示正确的字母,而不是每次都必须按下键盘 init_键盘功能将PortA0-PortA3设置为输入 在getkey函数中,我

Iam使用HCS12微控制器。我使用的以下程序从车载键盘获取输入,并根据按下的键向车载LCD显示字母(我只附加了处理输入/输出的代码部分,如果需要,我可以附加其余部分,但这样对眼睛更容易)

我想做的是摆脱被用作输入的键盘,而是使用我拥有的一个传感器,它通过3个单独的引脚发送有效的低电平信号。这样,每当传感器读取其中一个读数(PortA1、Porta2或Porta3)时,它将显示正确的字母,而不是每次都必须按下键盘

init_键盘功能将PortA0-PortA3设置为输入

在getkey函数中,我不确定如何将if语句单独更改为PortA0-PortA3

void init_keypad(void){
    DDRA = 0xf0;  // PA7-PA4 output; PA3-PA0 input
    DDRB = 0xf0;
    PUCR |= 1;   // PUPAE =1 (enable pull-up on all PORTA inputs) 
}

char getkey(void){
    PORTA = 0xe0;       // selects row 0     
    if ((PORTA & 1) == 0){
    cmdwrt(0x01);
      delay(20);
      if ((PORTA & 1) == 0) return('L');//true if '1' key still active after 20 ms
    }
    PORTA = 0xd0;
    if ((PORTA & 1) == 0){
    cmdwrt(0x01);
      delay(20);
      if ((PORTA & 1) == 0) return('S');//true if '1' key still active after 20 ms
    }
    PORTA = 0xb0;  
    if ((PORTA & 1) == 0){
    cmdwrt(0x01);
      delay(20);
      if ((PORTA & 1) == 0) return('R');//true if '1' key still active after 20 ms
    }

假设您已经将输入从PORTA读入变量,我们将命名为
input

在这种情况下,测试
输入的各个位类似于:

if (input & 1) { 
   // bit 0 was set
}
if (input & 2) {
   // bit 1 was set
}
if (input & 4) {
   // bit 2 was set
}

如果您正在使用CodeWarrior IDE之类的工具进行HCS12编程,您会注意到HCS12项目中包含了一个头文件。它将是您要编译的芯片的名称,例如
mc9s12c32.h
。在该文件中,您可以看到地址的定义,以及每个可用寄存器的内容<例如,code>PORTA
被定义为指向内存中
0x0
的变量。为了能够读取端口a上的特定pin,可以使用以下命令来帮助缓解任何混淆

if(PORTA & PORTA_BIT0_MASK)
{
    //Do something if bit 0 was set
}
if(PORTA & PORTA_BIT1_MASK)
{
    //Do something if bit 1 was set
}
if(PORTA & PORTA_BIT2_MASK)
{
    //Do something if bit 2 was set
}

上面所做的是测试端口a的全部内容,以及是否在该端口上设置了每个单独的位
PORTA_BIT0_MASK
恰好定义为
1
PORTA_BIT1_MASK
定义为
2
PORTA_BIT2_MASK
定义为
4
您的问题是什么?我如何单独检查每个端口(A0-A3)?这样,我就可以更改if语句来检查端口的状态,而不是键盘。访问单个端口有什么问题?我不知道如何单独访问它们。您是说您的输入显示为位0,PORTA的1和2?为什么用2和4进行and?因为2是二进制的
00000010
,而4是二进制的
00000100
,所以用它们进行anding分别隔离第二位和第三位。