реклама на сайте
подробности

 
 
> Протокол обмена данными с клавиатурой Satel CA-6 KLED, думаю что пригодится
MicronSys
сообщение Apr 1 2008, 14:54
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



Описание клавы сдесь http://satel.pl/rus/products/ca6manled.php
Цена очень интересная в Украине от 22 у.е.

рабочий код WinAvr Atmega32 7,3728 Мег



// данные на клаву
#define LED_KEY_ZONE_1 15
#define LED_KEY_ZONE_2 14
#define LED_KEY_ZONE_3 13
#define LED_KEY_ZONE_4 12

#define LED_KEY_ZONE_5 7
#define LED_KEY_ZONE_6 6
#define LED_KEY_ZONE_7 5
#define LED_KEY_ZONE_8 4


#define LED_KEY_ACDC 11
#define LED_KEY_MODEM 10
#define LED_KEY_TRABLE 9
#define LED_KEY_BUZZER 8

#define LED_KEY_GUARD_1 3
#define LED_KEY_GUARD_2 2
#define LED_KEY_ALARM_1 1
#define LED_KEY_ALARM_2 0

// Данные от клавы
#define ST_KEY_TAMPER 0

#define ST_KEY_ROW_1 1
#define ST_KEY_ROW_2 2
#define ST_KEY_ROW_3 3

#define ST_KEY_COL_4 4
#define ST_KEY_COL_3 5
#define ST_KEY_COL_2 6
#define ST_KEY_COL_1 7

#define ST_KEY_Z2_OK 8
#define ST_KEY_Z2_KZ 9

#define ST_KEY_Z1_OK 10
#define ST_KEY_Z1_KZ 11


#define ST_KEY_ADR_A 12
#define ST_KEY_ADR_B 13
#define ST_KEY_ADR_C 14
#define ST_KEY_ADR_D 15



#define LED_PORT PORTB
#define LED_DDR DDRB
#define LED_PIN PINB

#define CON_PORT PORTC
#define CON_DDR DDRC
#define CON_PIN PINC

#define MOD_DDR DDRD
#define MOD_PORT PORTD
#define MOD_PIN PIND

#define STON 0x01
#define STOFF 0x00

#define PIN_MODEM (1<<0)
#define PIN_VCC (1<<1)
#define PIN_SOUND (1<<2)
#define PIN_CONTROL (1<<3)
#define PIN_LEDS_1 (1<<4)
#define PIN_LEDS_2 (1<<5)
#define PIN_GROUP_1 (1<<6)
#define PIN_GROUP_2 (1<<7)


#define PIN_LED_CORE (1<<7)

#define PIN_KEY_DATA (1<<0)
#define PIN_KEY_CLK (1<<1)
#define PIN_KEY_IN (1<<2)



#define ON_KEY_CLK LED_PORT &= ~(PIN_KEY_CLK)
#define OFF_KEY_CLK LED_PORT |= (PIN_KEY_CLK)

#define ON_KEY_DATA LED_PORT &= ~(PIN_KEY_DATA)
#define OFF_KEY_DATA LED_PORT |= (PIN_KEY_DATA)


#define IS_KEY_DATA LED_PIN & PIN_KEY_IN





#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\signal.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
#include <avr\eeprom.h>
#include <mydef.h>

extern uint8_t out_m_buffer[MODEM_BUFFER];
extern void ModemSend(uint8_t *buf,uint8_t size);
//********************************************************************************
**************
extern uint8_t ReadEE(uint8_t addr); -- чтение eeprom

uint8_t key_data[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // данные для отправки на клаву
uint8_t key_state[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // данные от клавы
uint8_t key_buffer[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // буфер нажатых клавиш

uint8_t table_leds [8] ={15,14,13,12,7,6,5,4};
uint8_t old_key = 'Z';
uint8_t key_data_index = 'Z';


void Init_Key(void);
void Read_Key(void);
void Write_Key(void);
void Work_Key(void);

void delay_key(uint8_t times)
{
for (uint8_t i = 0;i<times;i++)
{
asm("nop");
}
}
//********************************************************************************
**************
void Init_Key(void) //
{
OFF_KEY_DATA;ON_KEY_CLK;
for (uint8_t i = 0;i<16;i++)
{
OFF_KEY_CLK;delay_key(96);
ON_KEY_CLK;delay_key(96);
}
}
//********************************************************************************
**************
void Read_Key(void)
{
ON_KEY_DATA;ON_KEY_CLK;
for (uint8_t i = 0;i<16;i++)
{
OFF_KEY_CLK;delay_key(96);
key_state[i] = ~IS_KEY_DATA;
ON_KEY_CLK;delay_key(96);
}

}
//********************************************************************************
**************
void Write_Key(void)
{
ON_KEY_DATA;ON_KEY_CLK;
for (uint8_t i = 0;i<16;i++)
{
if (key_data[i] == 0) OFF_KEY_DATA; else ON_KEY_DATA;
OFF_KEY_CLK;delay_key(96);
ON_KEY_CLK;delay_key(96);
}
}

//********************************************************************************
**************
void Work_Key(void)
{
uint8_t inp_key = 'Z';
Read_Key();
Write_Key();
key_data[LED_KEY_BUZZER] = 0;

if (key_state[1])
{
key_data[LED_KEY_BUZZER] = 1; // ROW 1
if (key_state[7]) inp_key = '1';
if (key_state[6]) inp_key = '4';
if (key_state[5]) inp_key = '7';
if (key_state[4]) inp_key = '*';
}
if (key_state[2])
{
key_data[LED_KEY_BUZZER] = 1; // ROW 2
if (key_state[7]) inp_key = '2';
if (key_state[6]) inp_key = '5';
if (key_state[5]) inp_key = '8';
if (key_state[4]) inp_key = '0';
}
if (key_state[3])
{
key_data[LED_KEY_BUZZER] = 1; // ROW 3
if (key_state[7]) inp_key = '3';
if (key_state[6]) inp_key = '6';
if (key_state[5]) inp_key = '9';
if (key_state[4]) inp_key = '#';
}
if (old_key != inp_key)
{
old_key = inp_key;
if (inp_key !='Z')
{
key_buffer[key_data_index] = inp_key;
key_data_index ++;

if(key_data_index >15) key_data_index = 0;
if(inp_key == '*') key_data_index = 0; // сброс буфера *

if(inp_key == '#') // конец ввода #
{

// данные в буфере

memset(Core.Keys.data_buffer,0x00,16);
Core.Keys.data_index = 0;
}
}

}


if (key_state[ST_KEY_TAMPER]) // чтение состояния тампера

if (key_state[ST_KEY_ADR_A]) // чтение состояние адреса A
if (key_state[ST_KEY_ADR_B]) // чтение состояние адреса A
if (key_state[ST_KEY_ADR_C]) // чтение состояние адреса A
if (key_state[ST_KEY_ADR_D]) // чтение состояние адреса A




// Чтение 1 шлейфа

if( key_state[ST_KEY_Z1_OK]) // если 1 то в норме
if( key_state[ST_KEY_Z1_KZ]) // если 1 то короткое замыкание





if( key_state[ST_KEY_Z2_OK]) // Чтение 2 шлейфа
if( key_state[ST_KEY_Z2_KZ])



}

a14.gif пример рабочий
думаю что пригодится


применение

SIGNAL(SIG_OVERFLOW0)
{
TCNT0=76; // 25 ms
Work_Key();
}

int main(void)
{

TCNT0 = 0x7F; TCCR0 = 0x05; TIMSK|= (1<<TOIE0);

InitKey();

while(1)
{

}
}

Сообщение отредактировал MicronSys - Apr 1 2008, 14:58
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016