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