/******************************************************************************************************************** -вывод строки -работа с АЦП и вывод 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; }