Простенький проект на PIC12F683(MicroC PIC v8.2.0.0.) - HELP

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт фев 14, 2008 16:12:52

Сообщение Alex_NEMO »

Мужики, помогите - что-то туго мне программированеи контроллеров дается, на элементарном туплю...
Не получается по каждому нажатию менять "картинку" на индикаторе, и то что находится в switch/case... Ткните носом - где "накосячил".
Ещё вопрос - как сделать что бы после "не нажимания" кнопок секунд 10 (типа - закончили выбор) сохранить "выбор" в EEPROM, что бы при след. включении вчитать и "применить" это значение? Понимаю что надо использовать таймер, вопрос как? Если можно - конкретный пример.

Код: Выделить всё

///////////////////////////////////////////////////////////////
//                                                           //
//     КОНТРОЛЛЕР PIC12F683             //
//  (внутренний генератор 4Mhz)      //
//                                                           //
///////////////////////////////////////////////////////////////
#define REG_PIN_DATA  GPIO.F4 // DATA 4094/74xx164
#define REG_PIN_CLK   GPIO.F5 // CLK  4094/74xx164
#define sw            GPIO.F3 // Button In

#define RESET         GPIO.F0

#define REG_DATA_ON   REG_PIN_DATA = 1;
#define REG_DATA_OFF  REG_PIN_DATA = 0;
#define REG_CLK  {REG_PIN_CLK = 1; asm nop; asm nop; REG_PIN_CLK = 0;}

unsigned short zz, oldstate;

// unsigned char digs[5]={0x3F, 0x06, 0x5B, 0x4F, 0x00}; // Общ. катод
unsigned char digs[5]= {0xC0, 0xF9, 0xA4, 0xB0, 0xFF}; // Общ. анод

void Register(char tmp)   // Процедура загрузки в регистр
{
  char i, dig;

  dig = digs[tmp];
  for(i=8; i>0; i--)
    {

      if(dig & 0x80)
        {
          REG_DATA_ON
        }
      else
        {
          REG_DATA_OFF
        }

      dig <<=1;
      REG_CLK
    }
}

void Register_init(void)  // Процедура иниц. регистра
{
  char i;

  for(i=0; i<8; i++)
    {
      REG_DATA_OFF;
      REG_CLK
    }
}

void SW(void)
{
//              zz++;
//              if (zz > 3) zz = 0;
              switch (zz)  {
                case 0:
                {
                  Register(0);
                  break;
                }
                case 1:
                {
                  Register(1);
                  break;
                }
                case 2:
                {
                  Register(2);
                  break;
                }
                case 3:
                {
                  Register(3);
                  break;
                }
                default : Register(4);
                }
}

void main()
{

  GPIO = 0;

  CMCON0 = 0b00000111;
  ANSEL  = 0b00000000;
  TRISIO = 0b00001000;

  do
    {
      Register(4);
      zz = 0;
  if (Button(&GPIO, 3, 10, 0)) oldstate = 1;
  if (oldstate && Button(&GPIO, 3, 10, 1))
    {
              zz++;
              if (zz > 3) zz = 0;
              SW();
              RESET = 1;
              Delay_ms(500);
              RESET = 0;
              oldstate = 0;
            }
    }
  while (1);
}
Проект с исходником во вложении, и схема в Протеусе.
My_proj.zip
Схема, пошивка, исходник.
(17.66 КБ) 237 скачиваний
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»