Чт июн 06, 2019 16:59:57
// подключение ЖКИ модуля
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_D6 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD6_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D7_Direction at TRISC7_bit;
sbit LCD_D6_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD6_bit;
// завершение подключения ЖКИ модуля
// переменные используемые в программе
int a;
// обработка прерываний
void interrupt()
{
if(INTCON.RBIF == 1) // убеждаемся что прерывание от PORTB
{
INTCON.RBIE = 0; // отключение прерываний
if(PORTB.F4 == 1) // если на выводе RB4 (ECHO) лог.1
T1CON.F0 = 1; // запуск таймера TMR1
if(PORTB.F4 == 0) // если на выводе RB4 (ECHO) лог.0
{
T1CON.F0 = 0; // остановка таймера TMR1
a = (TMR1L | (TMR1H<<8))/58.82; // рассчёт расстояния, перевод в см
}
}
INTCON.RBIF = 0; // сброс флага прерывания PORTB
INTCON.RBIE = 1; // разрешение прерываний PORTB
}
// конец обработки прерываний
// основная программа
void main()
{
char txt[7];
Lcd_Init(); // Инициализация ЖКИ
Lcd_Cmd(_LCD_CLEAR); // Очистка экрана
Lcd_Cmd(_LCD_CURSOR_OFF); // Отключение курсора
TRISB = 0b00010000;
INTCON.GIE = 1; // Разрешение глобальный прерываний
INTCON.RBIF = 0; // сброс флага прерывания PORTB
INTCON.RBIE = 1; // разрешение прерываний PORTB
Lcd_Out(1,6,"Digital"); // вывод приветствия
Lcd_Out(2,4,"level meter");
Delay_ms(3000); // задержка 3 с
Lcd_Cmd(_LCD_CLEAR); // очистка экрана
T1CON = 0x10; // настройка таймера TMR1
while(1)
{
TMR1H = 0; // сброс значения таймера первого регистра
TMR1L = 0; // сброс значения таймера второго регистра
a = 0; // сброс переменной измерения
PORTB.F0 = 1; // установка лог.1 на выводе RB0 (TRIG)
Delay_us(10); // задержка 10 мкс
PORTB.F0 = 0; // установка лог.0 на выводе RB0 (TRIG)
Delay_ms(100); // задержка 100 мс
a = a + 1; // постоянная для исключения ошибки
if(a>=2 && a<=400) // проверка расстояния
{
IntToStr(a,txt); // перевод значения в строку для ЖКИ
Ltrim(txt); // удаление непечатных симлов перед строкой
Lcd_Cmd(_LCD_CLEAR); // очистка экрана
Lcd_Out(1,1,"Distance = "); // вывод текста на 1 строке
Lcd_Out(1,12,txt); // вывод результата на 2 строке
Lcd_Out(1,15,"cm"); // вывод ед.измерения на 2 строке
}
else
{
Lcd_Cmd(_LCD_CLEAR); // очистка экрана
Lcd_Out(1,1,"Out of Range"); // вывод текста на 1 строке
}
Delay_ms(400); // задержка 400 мс
}
}
Чт июн 06, 2019 17:22:39
Чт июн 06, 2019 18:04:36
Чт июн 06, 2019 18:17:16
Чт июн 06, 2019 18:39:11
Чт июн 06, 2019 18:55:59
Пт июн 07, 2019 17:05:16
Пт июн 07, 2019 18:00:28
Пт июн 07, 2019 18:41:18
// подключение ЖКИ модуля
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_D6 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD6_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D7_Direction at TRISC7_bit;
sbit LCD_D6_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD6_bit;
// завершение подключения ЖКИ модуля
// переменные используемые в программе
int a;
// обработка прерываний
void interrupt()
{
if(INTCON.INTF == 1) // убеждаемся что прерывание от PORTB
{
INTCON.INTE = 0; // отключение прерываний
while (PORTB.F0 = 1) // если на выводе RB0 (ECHO) лог.1
T1CON.F0 = 1; // запуск таймера TMR1
if (PORTB.F0 == 0) // если на выводе RB0 (ECHO) лог.0
{
T1CON.F0 = 0; // остановка таймера TMR1
a = (TMR1L | (TMR1H<<8))/58.82; // рассчёт расстояния, перевод в см
}
}
INTCON.INTF = 0; // сброс флага прерывания PORTB
INTCON.INTE = 1; // разрешение прерываний PORTB
}
// конец обработки прерываний
// основная программа
void main()
{
char txt[7];
ANSEL = 0; // установка портов в качестве цифровых
ANSELH = 0; // входов/выходов
C1ON_bit = 0; // отключение комапараторов
C2ON_bit = 0;
Lcd_Init(); // Инициализация ЖКИ
Lcd_Cmd(_LCD_CLEAR); // Очистка экрана
Lcd_Cmd(_LCD_CURSOR_OFF); // Отключение курсора
TRISB = 0b11101111; // настройка PORTB
PORTB = 0; // сброс значений PORTB
INTCON.INTF = 0; // сброс флага внеш. прерывания (RB0)
INTCON.INTE = 1; // разрешение внеш. прерывания (RB0)
OPTION_REG.INTEDG = 1; // прерывание по фронту (RB0)
//INTCON.PEIE = 1; // разрешение прерываний от периферии
INTCON.GIE = 1; // разрешение глобальный прерываний
//INTCON.RBIF = 0; // сброс флага прерывания PORTB
//INTCON.RBIE = 1; // разрешение прерываний PORTB
Lcd_Out(1,6,"Digital"); // вывод приветствия
Lcd_Out(2,4,"level meter");
Delay_ms(3000); // задержка 3 с
Lcd_Cmd(_LCD_CLEAR); // очистка экрана
T1CON = 0x00; // настройка таймера TMR1
while(1)
{
TMR1H = 0; // сброс значения таймера первого регистра
TMR1L = 0; // сброс значения таймера второго регистра
a = 0; // сброс переменной измерения
PORTB.F4 = 1; // установка лог.1 на выводе RB4 (TRIG)
Delay_us(10); // задержка 10 мкс
PORTB.F4 = 0; // установка лог.0 на выводе RB4 (TRIG)
Delay_ms(100); // задержка 100 мс
a = a + 1; // постоянная для исключения ошибки
if(a>=2 && a<=400) // проверка расстояния
{
IntToStr(a,txt); // перевод значения в строку для ЖКИ
Ltrim(txt); // удаление непечатных симлов перед строкой
Lcd_Cmd(_LCD_CLEAR); // очистка экрана
Lcd_Out(1,1,"Distance = "); // вывод текста на 1 строке
Lcd_Out(1,12,txt); // вывод результата на 2 строке
Lcd_Out(1,15,"cm"); // вывод ед.измерения на 2 строке
}
else
{
Lcd_Cmd(_LCD_CLEAR); // очистка экрана
Lcd_Out(1,1,"Out of Range"); // вывод текста на 1 строке
}
Delay_ms(400); // задержка 400 мс
}
}