Программирование на C для 8051: направления SFR в качестве аргументов

В настоящее время я делаю очень простую игру в крестики-нолики с AT89C51RC2, и у меня возникают проблемы с правильным вводом кнопок.

По сути, вход представляет собой матрицу кнопок 3x3, которую я хочу использовать, просматривая строки с помощью импульса, проверяя столбцы на наличие соединения; довольно простой. Однако я хотел сделать это путем создания уникального метода scroll, который получил параметр строки и соответственно установил для него значение HIGH.

у меня уже есть

sbit R1 = P1^0; 

все необходимые входные данные, но я не уверен, правильно ли это.

Затем, используя свой основной метод, я запускаю что-то вроде

while(TRUE)
{
    scroll(R1);
}

который называется свитком, у меня есть это

void scroll (bit P)
{
   P = HIGH; //Sets the row being checked to HIGH (HIGH is already defined as a 1). Same goes with the aformentioned TRUE
   ...
}

Итак, это не работает. Я знаю, что делаю это неправильно, но мне нужно было с чего-то начать. Возможно ли то, что я пытаюсь сделать? Отправка одного PIN-адреса в качестве перегрузки для метода? Если да, то какой это должен быть тип данных? Я жонглировал между углем и битой, но не мог остановиться.

Надеюсь, мой вопрос понятен! Если нет, я с удовольствием доработаю и, возможно, опубликую весь код (хотя он довольно грязный). Всем заранее спасибо!


person BretonDP    schedule 17.07.2014    source источник
comment
Как вы думаете, что делает P1^0?   -  person David Schwartz    schedule 17.07.2014
comment
@DavidSchwartz, он, вероятно, делает то, что он думает. Это расширение компилятора для обращения к диапазону битовой адресации памяти в 8051.   -  person Phil Wetzel    schedule 17.07.2014


Ответы (2)


Если я правильно понял ваш вопрос, я мог бы расширить ваши фрагменты кода, чтобы они выглядели так:

sbit R1 = P1^0;
sbit R2 = P1^1;
sbit R3 = P1^2; 

while(TRUE)
{
    scroll(R1);
    scroll(R2);
    scroll(R3);
}

(Ваша scroll функция остается как есть). Вы пытаетесь определить одну функцию, которую можно вызывать несколько раз, передавая другой вывод для подтверждения каждый раз, когда вы вызываете функцию.

К сожалению, я не знаю, как сделать именно то, что вы хотите, потому что вы не можете определять sbits в функции ни как локальные, ни как параметры. Я уверен, что есть неинтуитивный способ сделать это во встроенной сборке с помощью инструкций SETB и CLR (возможно, кто-то еще может вмешаться), но с одним компилятором C Keil это не годится.

Вместо этого, возможно, вы могли бы создать вспомогательную функцию для назначения контактов. Это позволит вам сделать что-то вроде этого:

void setRow(char whichRow, bit whatValue)
{
    switch (whichRow)
    {
        case 1:
            R1 = whatValue;
            break;
        case 2:
            R2 = whatValue;
            break;
        case 3:
            R3 = whatValue;
            break;
        default:
            break;
    }
}

void scroll (char row)
{
    setRow(row, HIGH); //Sets the row being checked to HIGH (HIGH is already defined as a 1). Same goes with the aformentioned TRUE    
    ...
}

А затем в вашем основном:

while(TRUE)
{
    scroll(1);
    scroll(2);
    scroll(3);
}

Удачи.

person Phil Wetzel    schedule 17.07.2014
comment
Спасибо за ваш ответ. Действительно, я пытался использовать sbit в качестве параметра, и это не сработало. Было указано, что указатели тоже не работают, поэтому, думаю, мне придется жестко их закодировать. Ваш оператор switch - хорошая рекомендация, но я думаю, что будет меньше строк кода, если я просто закодирую его. В конце концов, это всего лишь три ряда. Спасибо, что нашли время ответить! - person BretonDP; 18.07.2014

Я видел, что мы используем Keil (действительно хороший компилятор 8051 IMO). Этот компилятор предоставляет вам файл заголовка для используемого вами MCU, который уже объявляет отдельные биты порта для доступа к каждому из них на странице Keil, посвященной компилятору 8051 семейства Atmel.

(Веб-страница AT89C51RC2 Кейла http://www.keil.com/dd/chip/3681.htm)

Таким образом, получить доступ к каждому SFR вашего чипа будет намного проще, чем переопределить их (UART, TIMER и т. Д.).

Обычно компилятор, поддерживающий микросхему, разрабатывает файл заголовка для своих клиентов.

Затем вы можете, после включения этого файла заголовка в свой проект, получить доступ следующим образом:

unsigned char ucBTN = P1_0; //ucBTN equals P1_0 value;

В большинстве случаев это одно и то же для всех 8051, которые вы будете использовать, поскольку они используют одну и ту же архитектуру CORE.

person Jean-francois    schedule 17.07.2014
comment
В следующий раз попробую использовать конкретный заголовок. Я использовал REG51X.h, потому что это было то, чему я учился в школе, AT89C51X.h или что-то в этом роде). Я определенно должен попробовать определенные заголовки (я думаю, что это AT. Спасибо за вашу рекомендацию. - person BretonDP; 18.07.2014