/********************************************************************************************************************
-вывод строки
-работа с АЦП и вывод HEX и DEC результатов измерения на LCD
********************************************************************************************************************/
#include "pic.h"
//биты PORTB (lcd)
#define rs 1
#define rw 2
#define en 3
//биты PORTA (adc)
#define d_io 0
#define clk 1
#define cs 2
#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
//#define Message "C-programm *LCD*"
//----------Функции---------------------
void delay(int); //задержка
void interrupt tc_ovf(void); //обработка прерывания по переполнению таймера
void wr_command_lcd(unsigned char);//запись кода комманд lcd
void wr_data_lcd(unsigned char);// запись кода данных lcd
void bin2bcd(unsigned char,unsigned char);
void adjbcd(unsigned char* );//adjbcd BIN - BCD
//-----------Глобальные переменные--------
unsigned char lcd @ 0x06; //адрес PORTB
const unsigned char StartMessage[16]= { //сообщение "PIC+LCD проверка"
0x50, 0x49, 0x43, 0x2B, 0x4C, 0x43, 0x44, 0x20, 0xBE, 0x70, 0x6F, 0xB3, 0x65, 0x70, 0xBA, 0x61
};
const unsigned char znakLCD[16]= {
0x30, // 0
0x31, // 1
0x32, // 2
0x33, // 3
0x34, // 4
0x35, // 5
0x36, // 6
0x37, // 7
0x38, // 8
0x39, // 9
0x41, // A
0x42, // B
0x43, // C
0x44, // D
0x45, // E
0x46 // F
};
unsigned char R_hi,R_md,R_lo; //регистры результата bin-bcd преобразования
main()
{
unsigned char i;
unsigned int bcdByte,adcByte;
TRISB=0x00;
TRISA=0b11111000; //RA0(d_io) на вывод, RA1 и RA2 на вывод
bitclr (PORTA,clk);
di();
//---------инициализация lcd-----------
lcd=0;
delay(1300);
lcd=0x30;
bitset (lcd, en); bitclr (lcd, en);// _/\_
delay(7);
bitset (lcd, en); bitclr (lcd, en);// _/\_
delay(230);
wr_command_lcd(0x20);
wr_command_lcd(0x28);
wr_command_lcd(0x0C);
wr_command_lcd(0x06);
wr_command_lcd(0x01);
delay(230);
//----------Загрузка строки --------
wr_command_lcd(0x80);
for (i=0;i<8;i++) wr_data_lcd(StartMessage[i]);
wr_command_lcd(0xC0);
for (i=8;i<16;i++) wr_data_lcd(StartMessage[i]);
delay(56000);
delay(56000);
while(1){
//-----слово адресации канала АЦП:
TRISA=0b11111000; //RA0(d_io) на вывод, RA1 и RA2,RA4 на вывод
bitclr (PORTA,d_io);
adcByte=0b00011011; //StartBit=1, Sgl=1, ODD=0, Sel_Ch=b'11'
bitclr (PORTA,cs);
for (i=0; i<8; i++) {
bitclr(PORTA,clk);
if(adcByte & 0x80) bitset(PORTA,d_io);
else bitclr(PORTA,d_io);
NOP();
bitset (PORTA,clk);
adcByte<<=1;
}
//----считывание результата измерения АЦП в adcByte:
adcByte=0;
TRISA=0b11111001; //RA0(d_io) на ввод, RA1 и RA2 на вывод
for (i=0; i<8; i++) {
bitclr(PORTA,clk);
NOP();
if (RA0) adcByte+=1;
bitset (PORTA,clk);
adcByte<<=1;
}
bitset (PORTA,cs);
//выввод на LCD 1-й строки:
wr_command_lcd(0x01); //очистить дисплей
wr_command_lcd(0x80);
i=adcByte;
i=(i>>=4) & 0x0F;
wr_data_lcd(znakLCD[i]);
i=adcByte;
i=i & 0x0F;
wr_data_lcd(znakLCD[i]);
//выввод на LCD 2-й строки:
wr_command_lcd(0xC0);
adcByte *= 0xC5;
bin2bcd((adcByte & 0xFF00)>>8,adcByte & 0x00FF);
i=R_hi;
i=i & 0x0F;
wr_data_lcd(znakLCD[i]);
wr_data_lcd(','); // ','(для латинских букв совпадает с ASCII)
i=R_md;
i=(i>>=4) & 0x0F;
wr_data_lcd(znakLCD[i]);
i=R_md;
i=i & 0x0F;
wr_data_lcd(znakLCD[i]);
wr_data_lcd(' '); // ' '
wr_data_lcd('V'); // 'V'
delay(28000);
}
}
/********** ФУНКЦИИ *********************************************/
//===== обработка прерывания по переполнению таймера =======
void interrupt tc_ovf(void) {
di();
TMR0=0x65;
T0IF=0;
ei();
}
//============-- задержка T=19us+k*13us __ k=(T-19us)/13us --==========
void delay(kmax)
{ unsigned int ki;
for (ki=0; ki<kmax; ki++);//"пустой" цикл для временной
} //задержки
//============= Запись кода комманд lcd =======
void wr_command_lcd(unsigned char cmd_lcd) {
bitclr (lcd,rs); bitclr (lcd,rw);
lcd=cmd_lcd & 0xF0;
bitset (lcd, en); bitclr (lcd, en);// _/\_
lcd=(cmd_lcd<<4) & 0xF0;
bitset (lcd, en); bitclr (lcd, en);// _/\_
delay(230);
}
// ============= Запись кода данных lcd =======
void wr_data_lcd(unsigned char dat_lcd) {
bitset (lcd,rs); bitclr (lcd,rw);
lcd=(dat_lcd & 0xF0) | 0x02;
bitset (lcd, en); bitclr (lcd, en);// _/\_
lcd=((dat_lcd<<4) & 0xF0) | 0x02;
bitset (lcd, en); bitclr (lcd, en);// _/\_
delay(230);
bitclr (lcd,rs);
}
//================ BIN - BCD ================
void bin2bcd(unsigned char h_byte, unsigned char l_byte)
{
unsigned char i;
di();
R_hi=0; R_md=0; R_lo=0;
for (i=0; i<16; i++)
{R_hi<<=1;
R_md<<=1;
if (CARRY) R_hi++;
R_lo<<=1;
if (CARRY) R_md++;
h_byte<<=1;
if (CARRY) R_lo++;
l_byte<<=1;
if (CARRY) h_byte++;
if(i==15) break;
adjbcd(&R_hi);
adjbcd(&R_md);
adjbcd(&R_lo);
}
ei();
} // Bin2Dec
void adjbcd(unsigned char *Ri)
{unsigned char Temp;
Temp=*Ri;
Temp += 0x03;
if(Temp & 0x08) *Ri=Temp;
Temp=*Ri;
Temp += 0x30;
if(Temp & 0x80) *Ri=Temp;
}
