
#include<pic16f676.h>
#pragma config FOSC = INTRCIO        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // RA3/MCLR pin function select (RA3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#include <xc.h>
#include <htc.h>
#define _XTAL_FREQ 4000000
#define CSE RC0
#define RST RC1
#define DC RC2
#define DIN RC3
#define SCLK RC4
const unsigned char tab[]={
0x3E, 0x51, 0x49, 0x45, 0x3E,  //0    0
0x00, 0x42, 0x7F, 0x40, 0x00,  //5    1
0x42, 0x61, 0x51, 0x49, 0x46,  //10   2
0x21, 0x41, 0x45, 0x4B, 0x31,  //15   3
0x18, 0x14, 0x12, 0x7F, 0x10,  //20   4
0x27, 0x45, 0x45, 0x45, 0x39,  //25   5
0x3C, 0x4A, 0x49, 0x49, 0x30,  //30   6
0x01, 0x71, 0x09, 0x05, 0x03,  //35   7
0x36, 0x49, 0x49, 0x49, 0x36,  //40   8
0x06, 0x49, 0x49, 0x29, 0x1E,  //45   9
0x00, 0x36, 0x36, 0x00, 0x00,  //50   :
0x14, 0x08, 0x3E, 0x08, 0x14,  //55   *
0x00, 0x00, 0xA0, 0x60, 0x00,  //60   ,
0x7E, 0x11, 0x11, 0x11, 0x7E,  //65   A
0x1F, 0x20, 0x40, 0x20, 0x1F,  //70   V
0x7F, 0x08, 0x04, 0x04, 0x78,  //75   h
0x5C, 0x62, 0x02, 0x62, 0x5C,  //80   Омега
0x3F, 0x40, 0x40, 0x40, 0x3F,    // 85 U
0x00, 0x00, 0x00, 0x00, 0x00,   // 90 пробел
0x00, 0x00, 0x5F, 0x00, 0x00,   // 95 !
0x14, 0x14, 0x14, 0x14, 0x14,    //100  =
};
unsigned int U = 0;
unsigned char U100 = 0;
unsigned char U10 = 0;
unsigned char U1 = 0;
void vs(unsigned char);
void lcd_write_8_bit(unsigned char);
void lcd_gotoxy(unsigned char x, unsigned char y) // Nokia LCD 3310 Position cursor
{   
   lcd_write_8_bit(0x40|(y&0x07));     // Y : 0100 0yyy Y=0-5 possible
   lcd_write_8_bit(0x80|(x&0x7f));     // X : 1xxx xxxx X=0-83 possible
}
void vs(unsigned char simv) // вывод одного символа с маленьким пробелом-разделителем между символами
{
    for(unsigned char j=0; j<5; j++)
        {
        lcd_write_8_bit(tab[simv+j]); 
        }
        lcd_write_8_bit(0x00);          //пробел-разделитель
}
void lcd_write_8_bit(unsigned char adr)
{
    for (unsigned char i=8; i>0; i--)
    { CSE = 0; //CSE = 0
    SCLK = 0; //SCLK = 0
    if ((adr & 0b10000000) == 0){
        DIN = 0;}
    else {
        DIN = 1;}
        adr <<= 1;
        SCLK = 1;
        CSE = 1;
     }
}
void init_LCD(void){
    RST = 0;                        // начало инициализации
        __delay_us(0.6);            //RST задержка не менее 100ns
        RST = 1;
        DC = 0; //D/C = 0
        lcd_write_8_bit (0x21); 
        lcd_write_8_bit (0x13);
        lcd_write_8_bit (0x04);
        lcd_write_8_bit (0xC1);
        lcd_write_8_bit (0x20);
        lcd_write_8_bit (0x0C);     // конец инициализации
}
    void clean_LCD(void){
        lcd_write_8_bit (0x40);     // начало очистки дисплея
        lcd_write_8_bit (0x80);
        DC = 1;
        for ( int i=504; i>0; i--)
        {
        lcd_write_8_bit (0x00); 
        }
        DC = 0;                     // конец очистки дисплея
}
    void podgotovka (void)
    {
        TRISC = 0b000000;
        TRISA = 0b000111;
        ADCON1 = 0b00110000;
        ANSEL = 0b00000101;
        CMCON = 0b111;
        PORTA = 0b000000;
        PORTC = 0b000000;
        init_LCD();     //инициализация дисплея
        clean_LCD();    //очистка дисплея
    }

    void main (void)
    {
    podgotovka();
    while(1)
        {  
        //**************************вольтметр 1
        ADCON0 = 0b11000001;
	    __delay_us(100);
	    GO = 1;
        while(GO){}
        U = ((ADRESH<<8) + ADRESL);
        RA4 = 0;
        RA5 = 0;
        U >>= 1;
        //******Разложение на разряды***********************************
        U100 = (U/100);     // единицы вольт
        U10 = (U%100)/10;   // сотни миливольт
        U1 = ((U%100)%10);    // десятки миливольт
        /*U1 = (U-(U100*100+U10*10));      // десятки миливольт*/
        //***Вывод данных на дисплей*************************************
        
        lcd_gotoxy(0,0); //позиция курсора (Х =0...83 Y=0...4 )
        //*****************вывод символов на экран
        DC = 1;             
        vs(85); vs(5); vs(100); vs(U100*5); vs(U10*5); vs(U1*5); vs(70); 
        DC = 0;
        //**************************вольтметр 2
        ADCON0 = 0b11001001;
	    __delay_us(1000);
	    GO = 1;
        while(GO){}
        U = ((ADRESH<<8) + ADRESL);
        RA4 = 0;
        RA5 = 0;
        U >>= 1;
        //******Разложение на разряды***********************************
        U100 = (U/100);     // единицы вольт
        U10 = (U%100)/10;   // сотни миливольт
        U1 = ((U%100)%10);    // десятки миливольт
        /*U1 = (U-(U100*100+U10*10));      // десятки миливольт*/
        //***Вывод данных на дисплей*************************************
        lcd_gotoxy(0,1); //позиция курсора (Х =0...83 Y=0...4 )
        //*****************вывод символов на экран
        DC = 1;             
        vs(85); vs(10); vs(100); vs(U100*5); vs(U10*5); vs(U1*5); vs(70); 
        DC = 0;        
        __delay_ms(10);
        }
        }