ASM I / O引脚HCS12微控制器

时间:2013-04-09 01:44:41

标签: c++ c assembly microcontroller

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

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

init_keypad函数将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
    }

2 个答案:

答案 0 :(得分:0)

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

在这种情况下,测试input的各个位看起来像:

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

答案 1 :(得分:0)

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

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恰好定义为1PORTA_BIT1_MASK定义为2PORTA_BIT2_MASK定义为4