Микроконтроллер 8051 с матричной клавиатурой и светодиодным дисплеем

У меня есть такая программа, работает. Я получаю номер от нажатой кнопки на светодиодном дисплее. Но мне нужно изменить эту программу, чтобы она показывала на дисплее последние 2 нажатых цифры, когда я нажимаю * или #. Например, я нажимаю «1 2 3 4 5 #». На дисплее я вижу только две последние цифры «4 5». Как я могу это сделать?

#include <REGX52.h>
#define SEG P1
#define keypad P2

sbit r1 = P2^0; 
sbit r2 = P2^1; 
sbit r3 = P2^2; 
sbit r4 = P2^3; 

sbit c1 = P2^4; 
sbit c2 = P2^5; 
sbit c3 = P2^6; 
sbit c4 = P3^7;

void scan(void);

unsigned int Display[12] = {0x0, 0x1, 0x2, 0x3,0x4,0x5,0x6,0x7,0x8,0x9};

void main(void)
{
while(1)
{
    scan();
}
}

void scan(void){
r1=0;
r2=r3=r4=1;

if(c1==0)
{
    while(c1==0){
        P1=Display[1];
    }
}
    if(c2==0)
    {
        while(c2==0){
            P1=Display[2];
}
}
    if(c3==0)
{
    while(c3==0){
        P1=Display[3];
    }
}
r2=0;
r1=r3=r4=1;
if(c1==0)
{
    while(c1==0){
        P1=Display[4];
    }
}
if(c2==0)
    {
        while(c2==0){
            P1=Display[5];
}
}
    if(c3==0)
{
    while(c3==0){
        P1=Display[6];
    }
}
r3=0;
r1=r2=r4=1;
if(c1==0)
{
    while(c1==0){
        P1=Display[7];
    }
}
if(c2==0)
    {
        while(c2==0){
            P1=Display[8];
}
}
    if(c3==0)
{
    while(c3==0){
        P1=Display[9];
    }
}
r4=0;
r1=r2=r3=1;
if(c2==0)
{
    while(c2==0){
        P1=Display[0];
}
    }

схема


person LuckyProgrammer    schedule 23.03.2017    source источник


Ответы (1)


unsigned int last_two_buttons[2] = {0x0, 0x0}; /* array of 2 elements to remember the last two buttons pressed. */

unsigned int update_display = 0; //flag to indicate if LED display needs to be updated.

Теперь вместо того, чтобы назначать P1 = Display[x] для каждой нажатой кнопки, вы просто запоминаете/сохраняете нажатую кнопку в этом массиве следующим образом:

last_two_buttons[0] = last_two_buttons[1]; 
last_two_buttons[1] = Display[x]; //x here indicates the button pressed, the same way as you have been using in your code.

Теперь улучшите функцию scan(), чтобы обнаружить кнопки * и #.

r4=0;
r1=r2=r3=1;
if(c1==0)
{
    while(c1==0){
        update_display = 1; // * button pressed
}

if(c3==0)
{
    while(c3==0){
        update_display = 1; // # button pressed
}

if(update_display)
{

    P1 = last_two_buttons[0] <<4 + last_two_buttons[1];
    update_display = 0; //reset the variables for next scan.
    last_two_buttons[0] = 0; 
    last_two_buttons[1] = 0;

}

Здесь предполагается, что если пользователь нажимает только одну кнопку, скажем, 5#, то мы будем отображать 0 и 5 как две последние нажатые кнопки.

Надеюсь это поможет.

person UKAgr    schedule 28.03.2017