Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- byte command1 = B01000000; //Команда записи данных в регистр дисплея
- byte command2 = B11000000; //Команда "начальный адрес дисплея"
- byte symbol_1 = 0x22;//Символ_1
- byte symbol_2 = 0x55;//Символ_2
- byte symbol_3 = 0x4D;//Символ_3
- byte symbol_4 = 0x33;//Символ_4
- byte symbol_5 = 0x51;//Символ_5
- byte symbol_6 = 0x8E;//Символ_6
- byte command3 = B10001111; //Яркость и ON/OFF дисплея
- byte command4 = B01000010;//Команда чтения клавиатуры.
- unsigned int bit_n;
- unsigned int WAIT_HL = 0;
- unsigned int pack = 0x01;
- unsigned int send_byte;
- unsigned int SCL_TM1637 = B00001000; //Задаем 3 пин, как выход SCL
- unsigned int SDA_TM1637 = B00000100; //Задаем 2 пин, как шину SDA
- volatile boolean SCL_STAT = true;//Переменная, в которой хранится текущее состояние выхода SCL
- volatile boolean ACK_tm1637 = false; //Переменная в которой возвращается проверка сигнала ACK (подтверждение приема байта)
- void setup() {
- TIMSK2 &= ~(1<<TOIE2);// Запрещаем прерывания, сбросив бит TOIE2 в регистре TIMSK2.
- TCCR2A &= ~((1<<COM2A1) | (1<<COM2A0) | (1<<COM2B1) | (1<<COM2B0) | (1<<WGM21) | (1<<WGM20));//Сбрасываем биты 7 - 4 в регистре TCCR2A, так как переключение выходов OC2A и OC2B нас пока не интересует, а также отключаем режим ШИМ (WGM).
- TIMSK2 |= (1<<TOIE2);// Разрешаем прерывания, установив бит TOIE2 в регистре TIMSK2. Прерывание будет переворачивать сигнал на SCL
- DDRD |= B00001100; //Инициализируем третий и второй пины порта D как выходы.
- PORTD |= B00001100; //Выводим HIGH на третий и второй пины порта D.
- Serial.begin(9600);
- }
- void generator_SCL(){
- PORTD ^= PORTD | SCL_TM1637; //Инвертируем третий пин порта D. Тем самым формируем сигнал SCL.
- SCL_STAT = !SCL_STAT; //Записываем состояние SCL в переменную SCL_STAT
- }
- void start_transfer(){
- DDRD |= B00001100; //Инициализируем третий и второй пины порта D как выходы.
- PORTD |= B00001000; //Выводим HIGH на SCL
- delay(1);
- PORTD |= B00000100; // Выводим HIGH на SDA (Конец передачи)
- delay(1);
- PORTD &= B11111011; // Посылаем на SDA LOW, тем самым отправляем приемнику сигнал о старте передачи данных (SCL = HIGH).
- TCCR2B = 0x02; //Подключаем 2 Мгц к Таймеру2. Таймер начинает считать до 255, вызывать подпрограмму прерывания (generator_SCL()) и сбрасываться в 0.
- }
- void end_transfer(){
- DDRD |= B00000100; //Инициализируем второй пин порта D (SDA) как выход.
- PORTD &= B11111011; //Выводим на SDA LOW.
- TCCR2B = 0x00; //Останавливаем Таймер2.
- PORTD |= B00001000; //Выводим на SCL HIGH
- SCL_STAT = true; // Не забываем присвоить переменной статуса SCL значение true
- TCNT2 = 0; //Обнуляем таймер.
- PORTD |= B00000100; //Выводим на SDA HIGH.
- }
- void wait_ack(){
- ACK_tm1637 = 0;
- DDRD &= B11111011; //Инициализируем пин SDA как вход
- PORTD |= B00000100; //Подключаем подтягивающий резистор к SDA
- while(WAIT_HL < 2000){ //Начинаем слушать шину SDA не более 2000 циклов
- if(!(PIND & B00000100)){//Если SDA = LOW,
- WAIT_HL = 2000;
- ACK_tm1637 = 1; //присваиваем переменной ACK_tm1637 значение 1, как подтверждение получения ACK
- }
- WAIT_HL += 1;
- }
- if(ACK_tm1637 == 0){
- Serial.print("NO ACK!");
- }
- WAIT_HL = 0;
- while(WAIT_HL < 2000){ //Ждем положительного фронта на SCL (см. DATASHEET TM1637
- if(PIND & B00000100){ //Если пришел положительный фронт,
- WAIT_HL = 2000; //уходим в loop
- }
- WAIT_HL += 1;
- }
- WAIT_HL = 0;
- }
- void byte_send(){
- send_byte = pack;
- DDRD |= B00000100; //Инициализируем второй пин (SDA) порта D как выход.
- bit_n = 0;
- while(bit_n <= 7){ //отправляем байт на SDA
- if(!SCL_STAT){ //Если пин SCL переключился на LOW
- if(send_byte & B00000001){ //Если младший бит равен 1,
- PORTD |= SDA_TM1637; //выводим 1 на пин SDA,
- send_byte = send_byte >> 1; //сдвигаем байт на 1 бит вправо и переходим к отправке следующего бита.
- bit_n += 1;
- while(!SCL_STAT){} //Ждем HIGH на SCL
- } else{ //Если младший бит равен 0
- PORTD &= ~SDA_TM1637; //выводим на SDA 0,
- send_byte = send_byte >> 1; //сдвигаем байт вправо на 1 бит и переходим к отправке следующего бита
- bit_n += 1;
- while(!SCL_STAT){} //Ждем HIGH на SCL
- }
- }
- }
- }
- void loop() {
- delay(1000);
- start_transfer();
- pack = command1;
- byte_send();
- wait_ack();
- pack = command2;
- byte_send();
- wait_ack();
- pack = symbol_1;
- byte_send();
- wait_ack();
- pack = symbol_2;
- byte_send();
- wait_ack();
- pack = symbol_3;
- byte_send();
- wait_ack();
- pack = symbol_4;
- byte_send();
- wait_ack();
- pack = symbol_5;
- byte_send();
- wait_ack();
- pack = symbol_6;
- byte_send();
- wait_ack();
- pack = command3;
- byte_send();
- wait_ack();
- pack = command4;
- byte_send();
- wait_ack();
- end_transfer();
- }
- ISR(TIMER2_OVF_vect) {
- generator_SCL();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement