Простенький проект на PIC12F683(MicroC PIC v8.2.0.0.) - HELP
Добавлено: Пт апр 02, 2010 21:19:25
Мужики, помогите - что-то туго мне программированеи контроллеров дается, на элементарном туплю...
Не получается по каждому нажатию менять "картинку" на индикаторе, и то что находится в switch/case... Ткните носом - где "накосячил".
Ещё вопрос - как сделать что бы после "не нажимания" кнопок секунд 10 (типа - закончили выбор) сохранить "выбор" в EEPROM, что бы при след. включении вчитать и "применить" это значение? Понимаю что надо использовать таймер, вопрос как? Если можно - конкретный пример.
Проект с исходником во вложении, и схема в Протеусе.
Не получается по каждому нажатию менять "картинку" на индикаторе, и то что находится в 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);
}