// Реализация функции чтения и записи, основные функции работы микросхемы FD650 // #include "FD650.H" //++++++++++++++++++++++++++++++++++++ #ifndef _FD650_H #define _FD650_H typedef unsigned char u_int8; typedef unsigned short u_int16; typedef unsigned long u_int32; #define DELAY os_delay_us(5) // макрос задержки задержки, // управляет скоростью SCL и SDA, рекомендуется выше 5 мксек #define FD650_SCL () // определить порт ввода-вывода #define FD650_SDA () // определить порт ввода-вывода //------ Команды установки системных параметров ------------------ #define FD650_BIT_ENABLE 0x01 // бит включения / отключения #define FD650_BIT_SLEEP 0x04 // бит управления спящим режимом //#define FD650_BIT_7SEG 0x08 // 7-сегментный управляющий бит #define FD650_BIT_INTENS1 0x10 // яркость уровня 1 #define FD650_BIT_INTENS2 0x20 // яркость уровня 2 #define FD650_BIT_INTENS3 0x30 // яркость уровня 3 #define FD650_BIT_INTENS4 0x40 // яркость уровня 4 #define FD650_BIT_INTENS5 0x50 // яркость уровня 5 #define FD650_BIT_INTENS6 0x60 // яркость уровня 6 #define FD650_BIT_INTENS7 0x70 // яркость уровня 7 #define FD650_BIT_INTENS8 0x00 // яркость уровня 8 #define FD650_SYSOFF 0x0400 // выключить дисплей, выключить клавиатуру #define FD650_SYSON ( FD650_SYSOFF | FD650_BIT_ENABLE ) // включить дисплей и клавиатуру #define FD650_SLEEPOFF FD650_SYSOFF // отключить спящий режим #define FD650_SLEEPON ( FD650_SYSOFF | FD650_BIT_SLEEP ) // включить спящий режим //#define FD650_7SEG_ON ( FD650_SYSON | FD650_BIT_7SEG ) // включить семисегментный режим #define FD650_8SEG_ON ( FD650_SYSON | 0x00 ) // включить восьмисегментный режим #define FD650_SYSON_1 ( FD650_SYSON | FD650_BIT_INTENS1 ) // включить дисплей уровень яркости 1 #define FD650_SYSON_2 ( FD650_SYSON | FD650_BIT_INTENS2 ) // включить дисплей уровень яркости 2 #define FD650_SYSON_3 ( FD650_SYSON | FD650_BIT_INTENS3 ) // включить дисплей уровень яркости 3 #define FD650_SYSON_4 ( FD650_SYSON | FD650_BIT_INTENS4 ) // включить дисплей уровень яркости 4 #define FD650_SYSON_5 ( FD650_SYSON | FD650_BIT_INTENS5 ) // включить дисплей уровень яркости 5 #define FD650_SYSON_6 ( FD650_SYSON | FD650_BIT_INTENS6 ) // включить дисплей уровень яркости 6 #define FD650_SYSON_7 ( FD650_SYSON | FD650_BIT_INTENS7 ) // включить дисплей уровень яркости 7 #define FD650_SYSON_8 ( FD650_SYSON | FD650_BIT_INTENS8 ) // включить дисплей уровень яркости 8 // ------------ команды загрузки слова данных ---------------------------- #define FD650_DIG0 0x1400 // Отображение разряда 0, необходимо добавить 8 бит данных #define FD650_DIG1 0x1500 // Отображение разряда 1, необходимо добавить 8-бит данных #define FD650_DIG2 0x1600 // Отображение разряда 2, необходимо добавить 8-бит данных #define FD650_DIG3 0x1700 // Отображение разряда 3, необходимо добавить 8-бит данных #define FD650_DOT 0x0080 // Отображение десятичной точки // -------------- команды чтение кодов кнопок клавиатуры ------------------- #define FD650_GET_KEY 0x0700 // Получить код кнопки, вернуть код кнопки // --------- внешние функции ------------------------ extern u_int8 FD650_Read( void ); // прочитать код кнопки из FD650 extern void FD650_Write( u_int16 cmd ); // отправить команду операции на FD650 #endif //+++++++++++++++++++++++++++++++++++ extern unsigned char m_nLastSDA; extern unsigned char m_nLastSCL; #define SDA_HIGH 1 #define SDA_LOW 0 #define SCL_HIGH 1 #define SCL_LOW 0 #define FD650_SCL_SET i2c_master_setDC(m_nLastSDA, SCL_HIGH) // установить высокий уровень SCL #define FD650_SCL_CLR i2c_master_setDC(m_nLastSDA, SCL_LOW) // установить низкий уровень SCL #define FD650_SCL_D_OUT {} // Установить SCL в качестве направления вывода и переключиться на вывод // для двунаправленного ввода/вывода #define FD650_SDA_SET i2c_master_setDC(SDA_HIGH, m_nLastSCL) // установить SDA на высокий уровень #define FD650_SDA_CLR i2c_master_setDC(SDA_LOW, m_nLastSCL) // установить SDA на низкий уровень #define FD650_SDA_IN i2c_master_getDC() // когда в качестве направления ввода задан SDA, значение уровня чтения #define FD650_SDA_D_OUT {} // Установите SDA в качестве направления вывода. // Для двунаправленного ввода-вывода его необходимо переключить на вывод. // Рекомендуется не устанавливать его как двухтактный, чтобы избежать ступенчатой формы сигнала // при подтверждении #define FD650_SDA_D_IN {} // Установить SDA как направление ввода, переключиться // на ввод для двунаправленного ввода/вывода //-------------------------- Start ------------------------------------------ /* @brief FD650 @param Нет @return Нет @note Зафиксируйте спадающий фронт SDA во время высокого уровня SCL, чтобы FD650 начал работать */ void FD650_Start( void ) { FD650_SDA_SET; FD650_SDA_D_OUT; FD650_SCL_SET; FD650_SCL_D_OUT; DELAY; FD650_SDA_CLR; DELAY; FD650_SCL_CLR; } //--------------------------- Stop ----------------------------------------- /* @brief FD650 @param Нет @return Нет @note Захват нарастающего фронта SDA во время высокого уровня SCL, чтобы FD650 закончил работать */ void FD650_Stop( void ) { FD650_SDA_CLR; FD650_SDA_D_OUT; DELAY; FD650_SCL_SET; DELAY; FD650_SDA_SET; DELAY; FD650_SDA_D_IN; } //--------------------------- Запись байта ----------------------------------------- /* @brief Отправить байт (8 бит) данных на FD650 @param беззнаковые 8-битные данные @return Нет @note Запись в FD650 по переднему фронту SCL, включая 9-й байт, считанный в ответный сигнал */ void FD650_WrByte( u_int8 dat ) { u_int8 i; FD650_SDA_D_OUT; for( i = 0; i != 8; i++ ) { if( dat & 0x80 ) { FD650_SDA_SET; } else { FD650_SDA_CLR; } DELAY; FD650_SCL_SET; dat <<= 1; DELAY; // необязательная задержка FD650_SCL_CLR; } FD650_SDA_SET; FD650_SDA_D_IN; DELAY; FD650_SCL_SET; DELAY; FD650_SCL_CLR; } //--------------------------- Чтение байта ----------------------------------------- /** * @brief Чтение значения кода кнопки FD650 * @param Нет * @return беззнаковые 8-битные данные * @note Чтение FD650 по заднему фронту SCL, включая 9-й байт, для отправки недопустимого ответа */ u_int8 FD650_RdByte( void ) { u_int8 dat,i; FD650_SDA_SET; FD650_SDA_D_IN; dat = 0; for( i = 0; i != 8; i++ ) { DELAY; // необязательная задержка FD650_SCL_SET; DELAY; // необязательная задержка dat <<= 1; if( FD650_SDA_IN ) dat++; FD650_SCL_CLR; } FD650_SDA_SET; DELAY; FD650_SCL_SET; DELAY; FD650_SCL_CLR; return dat; } //--------------------------- Драйвер ----------------------------------------- /* @defgroup FD650_Driver Модуль драйвера FD650 Модуль драйвера FD650 предоставляет простые и унифицированные функции интерфейса и определения пользовательских макросов для завершения работы по управлению FD650. */ /* @ingroup FD650_Driver @brief Отправить параметр команды cmd FD650 @param cmd FD650, беззнаковое 16-битное 2-байтовое число определяется определением макроса @return Нет @note Отправьте 16-битный 2-байтовый параметр команды, чтобы завершить настройку команды FD650 и функцию отображения данных. Цифровой индикатор может напрямую использовать функцию FD650_Write и взаимодействовать с соответствующими инструкциями. Формат команды: Выбор номера разряда индикатора (обязательно) | Значение кода отображаемого символа на индикаторе (обязательно) | Десятичная точка на индикаторе (необязательно) @code FD650_Write(FD650_SYSON_8);// Включаем дисплей и клавиатуру, 8-сегментный режим отображения // Отправляем данные для отображения FD650_Write( FD650_DIG0 | (u_int8)data[0] ); // Включаем первую цифру индикатора if(sec_flag) FD650_Write( FD650_DIG1 | (u_int8)data[1] | FD650_DOT ); // Включаем вторую цифру и отображаем десятичную точку else FD650_Write( FD650_DIG1 | (u_int8)data[1] ); if(Lock) FD650_Write( FD650_DIG2 | (u_int8)data[2] | FD650_DOT ); // Включаем третью цифру и отображаем десятичная точка else FD650_Write( FD650_DIG2 | (u_int8)data[2] ); FD650_Write( FD650_DIG3 | (u_int8)data[3] ); // Включаем четвертую цифру @endcode */ //--------------------------- Запись ----------------------------------------- void FD650_Write( u_int16 cmd ) { FD650_Start(); FD650_WrByte(((u_int8)(cmd>>7)&0x3E)|0x40); FD650_WrByte((u_int8)cmd); FD650_Stop(); return; } //--------------------------- Чтение ----------------------------------------- /* @ingroup FD650_Driver @brief Чтение кода кнопки клавиатуры FD650 @param нет @return keycode Чтение значения клавиши в нажатом состоянии клавиши, беззнаковое 8-битное 1-байтовое число и возврат 0, если считано недопустимое значение клавиши @note Прочтите кодовое слово кнопки FD650, нажмите клавишу, чтобы вернуть значение кода кнопки, нажмите клавишу no, чтобы вернуть 0. См. таблицу ниже для таблицы значений кода кода кнопки. @code Таблица значений кодов кнопок адрес DIG1 DIG2 DIG3 DIG4 KI1 47H 46H 45H 44H KI2 4FH 4EH 4DH 4CH KI3 57H 56H 55H 54H KI4 5FH 5EH 5DH 5CH KI5 67H 66H 65H 64H KI6 6FH 6EH 6DH 6CH KI7 77H 76H 75H 74H KI1+KI2 7FH 7EH 7DH 7CH Keycode = FD650_Read(); // keycode является значением кода кнопки Key_Fun(Keycode) ; // функция обработки кодов кнопок @endcode */ //--------------------------- Чтение ----------------------------------------- u_int8 FD650_Read( void ) { u_int8 keycode = 0; FD650_Start(); FD650_WrByte((u_int8)(FD650_GET_KEY>>7)&0x3E|0x01|0x40); keycode=FD650_RdByte(); FD650_Stop(); if( (keycode&0x00000040)== 0) keycode = 0; return keycode; }