Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программное управление технологическим оборудованием

.pdf
Скачиваний:
1
Добавлен:
29.11.2025
Размер:
11.79 Mб
Скачать

#define

LCD_DB7 LATBbits.LATB12 #define

LCD_DB6 LATBbits.LATB14 #define

LCD_DB5 LATBbits.LATB11 #define

LCD_DB4 LATBbits.LATB10

// Подпрограмма отправки тетрады данных в драйвер ЖКИ void LCD_set_half_byte(char x)

{

if (x & (0x01 << 3)) LCD_DB7 = 1;

else

LCD_DB7 = 0;

if (x & (0x01 << 2))

LCD_DB6 = 1;

else

LCD_DB6 = 0;

if (x & (0x01 << 1))

LCD_DB5 = 1;

else

LCD_DB5 = 0;

if (x & (0x01 << 0))

LCD_DB4 = 1;

else

LCD_DB4 = 0;

551

 

Delay_ms(

LCD_EN = 1;

1);

 

Delay_ms(

LCD_EN = 0;

1);

}

// Инициализация используемых линий порта

void LCD_InitPorts()

{

TRISBbits.TRISB

 

 

O

1

= 0;

// Out

E (RB1)

LATBbits.LATB1 = 0;

// OE

Lo

TRISAbits.TRISA

 

 

 

10

= 0;

// Out

En (RA10)

TRISCbits.TRISC

 

 

 

2

= 0;

// Out

R/W (RС2)

TRISAbits.TRISA

 

 

R

7

= 0;

// Out

S (RA7)

TRISBbits.TRISB

 

 

 

12

= 0;

// Out

DB7 (RB12)

TRISBbits.TRISB

 

 

 

14

= 0;

// Out

DB6 (RB14)

TRISBbits.TRISB

 

 

 

11

= 0;

// Out

DB5 (RB11)

TRISBbits.TRISB

 

 

 

10

= 0;

// Out

DB4 (RB10)

}

// Инициализация контроллера ЖКИ

void LCD_Init()

{

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

Delay_ms(30);

LCD_set_half_byte(0x03);

Delay_ms(5);

LCD_set_half_byte(0x03);

Delay_ms(100);

LCD_set_half_byte(0x03);

LCD_set_half_byte(0x02);

552

// 4-битный интерфейс, 2 строки, размер символа - 5х8

LCD_set_half_byte(0 x02); LCD_set_half_byte(0 x08); Delay_ms(37);

// Курсор выкл., мигание позиции выкл., индикатор вкл.

LCD_set_half_byte(0 x00); LCD_set_half_byte(0 x0C); Delay_ms(37);

// Очитска дисплея

LCD_set_half_byte(0x00);

LCD_set_half_byte(0x01);

Delay_ms(2);

// Направление перемещения курсора - вправо

LCD_set_half_byte(0x00); LCD_set_half_byte(0x06);

}

4.1 Отправление данных в DDRAM

контроллера ЖКИ void LCD_send_char(char c)

{

LCD_RS = 1; LCD_set_half_byte(c >> 4); LCD_set_half_byte(c & 0x0f); LCD_RS = 0;

}

4.2Вывод строки на ЖКИ

void LCD_WriteString(char str[])

{

char i = 0;

553

while (str[i] != 0)

{

LCD_send_char(str [i]); i++;

}

}

// Вывод числа на ЖКИ

void LCD_WriteValue(unsigned int value)

{

char strtmp[16]; utoa(strtmp, value, 10); LCD_WriteString(strt mp);

}

5.1 Перевод курсора ЖКИ в начальную позицию void LCD_Home()

{

LCD_RS = 0; LCD_set_half_byte(0x02 >> 4); LCD_set_half_byte(0x02 & 0x0f);

}

5.2 Очистка ЖКИ void LCD_Clear()

{

LCD_RS = 0; LCD_set_half_byte(0x01 >> 4); LCD_set_half_byte(0x01 & 0x0f);

554

}

 

 

 

TRISAbits.TRIS

 

#define SDA

A8

 

 

TRISAbits.TRIS

 

#define SCL

A9

 

#define READ_SDA PORTAbits.RA8

 

// Инициализация портов I2C

 

void I2C_Init()

 

 

{

 

 

ODCAbits.ODC

// Открытый коллектор

A8

= 1;

SDA

ODCAbits.ODC

// Открытый коллектор

A9

= 1;

SCL

LATAbits.LAT

 

A8

= 0;

 

LATAbits.LAT

 

A9

= 0;

 

SDA = 1;

 

 

SCL = 1;

 

 

}

 

 

// Формирование условия

 

СТАРТ void I2C_Start()

 

{

 

 

SDA = 0;

Delay_us(25);

 

}

 

 

// Повторное формирование условия

 

СТАРТ void I2C_ReStart()

 

{

 

 

SCL = 0;

Delay_us(25);

 

SDA = 1;

Delay_us(25);

 

SCL = 1;

Delay_us(25);

 

SDA = 0;

Delay_us(25);

 

SCL = 0;

Delay_us(25);

 

555

}

//Формирование условия СТОП void I2C_Stop()

{

SCL = 1; Delay_us(25); SDA = 1; Delay_us(25);

}

//Передача байта по интерфейсу I2C char I2C_Send(unsigned char c)

{

char b;

for (b = 7; b >= 0; b--)

{

SCL = 0; Delay_us(25);

if ((c & (1 << b)) != 0)

{

SDA = 1;

}

else

{

SDA = 0;

}

Delay_us(25);

SCL = 1; Delay_us(50);

}

1.ACK SCL = 0;

2.Отпустить линию

SDA = 1; Delay_us(25); SCL = 1; Delay_us(25);

char result;

if (READ_SDA == 0)

{

result = 0;

}

556

else

{

result = 1;

}

SCL = 0; Delay_us(25);

SDA = 0; Delay_us(25);

return result;

}

// Приѐм байта по интерфейсу I2C char I2C_Read(char ack)

{

SCL = 0;

SDA = 1;

Delay_us(50);

char b, data = 0;

for (b = 0; b < 8; b++)

{

SCL = 1; Delay_us(2 5); data <<= 1;

if (READ_SDA != 0)

{

data |= 1;

}

Delay_us(25);

SCL = 0; Delay_us(50);

}

SDA = 1;

SCL = 1;

return data;

}

557

// Запись байта в ПЗУ

void EE_WriteByte(unsigned int addr, char data)

{

char addrhi = (char)(addr >> 8); char addrlo = (char)(addr & 0x00FF);

I2C_Start();

I2C_Send(0xA0);

I2C_Send(addrhi);

I2C_Send(addrlo);

I2C_Send(data);

I2C_Stop();

Delay_us(10);

}

// Чтение байта из ПЗУ

char EE_ReadByte(unsigned int addr)

{

char addrhi = (char)(addr >> 8); char addrlo = (char)(addr & 0x00FF);

I2C_Start();

I2C_Send(0xA0);

I2C_Send(addrhi);

I2C_Send(addrlo);

I2C_ReStart();

I2C_Send(0xA1);

char data =

I2C_Read(0);

I2C_Stop();

return data;

558

}

 

 

 

 

// номер активного вывода

char _i = 0;

 

дешифратора

char _keys[4][3] = {{9, 8, 7},

// массив кнопок клавиатуры

 

 

{6, 5, 4},

 

 

{3, 2, 1},

 

 

{'#', 0, '*'}};

char _key = 0;

 

// текущая нажатая кнопка

char _keyPressed = 0;

// флаг нажатия кнопки

// Инициализация таймера

 

T1

 

 

void Init_Timer1()

 

{

 

 

T1CO

 

// сброс

N

= 0;

таймера

IFS0bits.T1IF = 0;

// сброс флага прерывания таймера

IEC0bits.T1IE = 1;

// разрешение прерывания от таймера

TMR

 

 

1

= 0x0000;

// обнуление текущего значения таймера

PR1

= 0x0E65;

// задание периода таймера

T1CONbits.TON = 1;

// разрешение работы таймера и его запуск

}

 

 

// Инициализация линий портов клавиатуры void Kbd_Init()

{

TRISBbits.TRISB6 = 0;

// Выход

A

(RB6)

TRISBbits.TRISB7 = 0;

// Выход

B

(RB7)

TRISBbits.TRISB8 = 0;

// Выход

C

(RB8)

TRISBbits.TRISB9 = 0;

// Выход

D

(RB9)

TRISCbits.TRISC6 = 0;

// Out

INA

(RC6)

TRISCbits.TRISC7 = 0;

// Out

INB

(RC7)

TRISCbits.TRISC8 = 0;

// Out

INC

(RC8)

TRISCbits.TRISC9 = 1;

// In

D

(RC9)

}

void Kbd_ReadCol(char row)

 

{

 

char column;

 

for (column = 0; column < 3; column++)

 

{

 

LATC &= ~(0x07 << 6);

// Выбор входа

LATC |= (column << 6);

 

559

__delay32(10L);

// Пауза для установки сигнала

// чтение

 

столбца

 

if

 

(!PORTCbits.RC

 

9)

 

{

 

_key = _keys[row][column]; // Сохранение нажатой кнопки

_keyPressed = 1; // Установка флага нажатия кнопки

}

}

}

// Прерывание таймера T1 по совпадению

void __attribute__((interrupt,no_auto_psv)) _T1Interrupt()

{

 

 

// Переключение на

LATB &= ~(0x0F << 6);

следующий

LATB |= (_i + 8) << 6;

// выход дешифратора

Kbd_ReadCol(_i);

// Сканирование столбца

_i++;

 

 

if (_i == 4)

 

{

 

 

 

_i = 0;

 

 

if (!_keyPressed)

 

 

{

 

 

_key = -1;

 

 

}

 

 

_keyPressed = 0;

// Сброс флага нажатия кнопки

}

 

 

 

 

// Сброс флага прерывания

IFS0bits.T1IF = 0;

таймера

TMR

 

 

1

= 0;

// Перезапуск таймера

}

// Ввод данных с клавиатуры с отображением

560

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]