// PIC16F1827 Voltage Monitor 2015.1.1 // ===> AQM0802A Akizuki // Send to PC by UART and TWE-Lite DIP M.T #include<16F1827.h> #device ADC=10 #fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR,BROWNOUT // #use delay(clock=8000000) #use i2c(MASTER,SDA=PIN_B1,SCL=PIN_B4,FAST,NOFORCE_SW) #use RS232(PARITY=N, BAUD=38400,XMIT=PIN_B5, RCV=PIN_B1) // ACM1602 #define LCD_ADD 0xA0 // ACM1602 Slave Address // AQM0802A #define LCD_ADD_AQM 0x7C // AQM0802 Slave Address // AQM W/R Mode val #define LCD_CMD_AQM 0x80 // Instruction Write Mode #define LCD_DAT_AQM 0xC0 // Data Write Mode #define line_1_AQM 0x00 // first line #define line_2_AQM 0xC0 // second line = 0x80 + 0x40 void LCD_com_AQM(unsigned char cmd); void LCD_Clear_AQM(); void LCD_Setline_AQM(unsigned char line); void LCD_init_AQM(); void LCD_data_AQM(unsigned char data); void LCD_space_AQM(int8 n); ///////////////////////////////////////////////// void ADT_init(); void ADT_data(unsigned char data); void ADT_cmd(unsigned char data); ///////////////////////////////////////////////// static int16 d1,d2,d3,d4,d5; void disp_val(int16 x); // ========================================== void main(){ int16 ADC = 0; int8 sw; LCD_init_AQM(); LCD_Clear_AQM(); // Infuluence to ACM1602 LCD_Setline_AQM(line_1_AQM); LCD_data_AQM('R'); LCD_data_AQM('e'); LCD_data_AQM('c'); LCD_data_AQM(' '); LCD_data_AQM('V'); LCD_data_AQM('o'); LCD_data_AQM('l'); LCD_data_AQM('t'); setup_adc_ports(0x80); setup_adc(ADC_CLOCK_INTERNAL); delay_ms(1000); LCD_Clear_AQM(); // Infuluence to ACM1602 //printf("\r\nVoltage Monitor"); while(1) { //LCD_Clear_AQM(); set_adc_channel(0); //ADC = 1.9995*3.265*read_adc(); ADC = 1.9995*3.225*read_adc(); printf("\r "); LCD_Setline_AQM(line_1_AQM); disp_val(ADC); LCD_data_AQM(" V"); printf(" V"); //delay_ms(10); //printf(" "); //LCD_Setline_AQM(line_1_AQM); //LCD_data_AQM('T'); //LCD_data_AQM('.'); //disp_val(ADC); delay_ms(200); if(sw++&0x01){ output_high(PIN_B3); } else{ output_low(PIN_B3); } } } // AQM0802 // void LCD_com_AQM(unsigned char cmd){ int16 u_t=50; i2c_start(); delay_ms(5); i2c_write(LCD_ADD_AQM); delay_us(u_t); // Slave Address i2c_write(LCD_CMD_AQM);delay_us(u_t); // Command Mode i2c_write(cmd); delay_us(u_t); // Send Command i2c_stop(); delay_ms(5); } void LCD_Clear_AQM(){ LCD_com_AQM(0x01); delay_ms(20); } void LCD_Setline_AQM(unsigned char line) { LCD_com_AQM(line); } void LCD_init_AQM(){ delay_ms(60); LCD_com_AQM(0x38); // Function set delay_us(30); LCD_com_AQM(0x39); // Function set delay_us(30); LCD_com_AQM(0x14); // Internal OSC frequency delay_us(30); LCD_com_AQM(0x70); // Contrast delay_us(30); LCD_com_AQM(0x56); // Power/ICON/Contrast Control delay_us(30); LCD_com_AQM(0x6c); // Follow Control delay_ms(300); LCD_com_AQM(0x38); // Function set delay_us(30); LCD_com_AQM(0x0c); // Display ON/OFF Control delay_us(30); LCD_com_AQM(0x01); // Clear Display delay_ms(2); } void LCD_data_AQM(unsigned char data){ int16 u_t=26; i2c_start(); delay_ms(5); i2c_write(LCD_ADD_AQM); delay_us(u_t); // Slave Address i2c_write(LCD_DAT_AQM);delay_us(u_t); // Data Out Code i2c_write(data); delay_us(u_t); // Send Command i2c_stop(); delay_ms(5); } void LCD_space_AQM(int8 n){ int8 cnt; cnt = 0; while(cnt++ < n){ LCD_data_AQM(' '); } } void disp_val(int16 x){ // Disp Digits int8 sw; if( x == 0xFFFF){ printf("Ox FFFF"); } else{ if( x & 0x8000){ // Minus ? printf("-"); x = ( x ^ 0xFFFF)+1; } else{ printf(" "); } d5 = x % 10 + 0x30; x /= 10; d4 = x % 10 + 0x30; x /= 10; d3 = x % 10 + 0x30; x /= 10; d2 = x % 10 + 0x30; x /= 10; d1 = x % 10 + 0x30; sw = 0; if(d1 == 0x30){ d1 = 0x20; } else{ sw = 1; } if( (d2 == 0x30)&&(sw == 0)){ d2 = 0x20; } else{ sw = 1; } if((d3 == 0x30)&&(sw == 0)){ d3 = 0x20; } else{ sw = 1; } if((d4 == 0x30)&&(sw == 0)){ d4 = 0x20; } printf("%1c%1c.%1c%1c%1c",d1,d2,d3,d4,d5); //printf("%1c",d1);//delay_ms(10); //printf("%1c",d2);//delay_ms(10); //printf("%. ");//delay_ms(10); //printf("%1c",d3);//delay_ms(10); //printf("%1c",d4);//delay_ms(10); //printf("%1c",d5);//delay_ms(10); LCD_data_AQM(d1); LCD_data_AQM(d2); LCD_data_AQM('.'); LCD_data_AQM(d3); LCD_data_AQM(d4); LCD_data_AQM(d5); } }