Программное управление технологическим оборудованием
.pdf#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
