// Scorpion 3.0 - firmware iteration A3 #include "msp430G2553.h" #include "math.h" #define Clear 0x00 #define D4 BIT2 // LCD bits definition #define D5 BIT3 #define D6 BIT4 #define D7 BIT5 #define RS BIT0 #define EN BIT1 #define preset_volt 5 //(V) Set the INITIAL VOLTAGE HERE #define preset_cur 0.5 //(A) Set the INITIAL CURRENT HERE #define maxreference_volt 30 //(V) Maximum voltage (limit) that can be set to output #define maxreference_cur 3 //(A) Maximum current (limit) that can be set to output #define pwm_period 700 //PWM Period example 700*(1/16,000,000) = 43.75us / 22.857 KHz //daca se mareste perioada la 15000, este foarte stabil la vo-vi de max 15v #define vector_char [0x01,0x02,0x03,'a'] int array_div_mod[4]; long IntVolt,IntCur; int temp2,i,n,delay,tenthsc,unitsc,decimal1c,decimal2c,tenthsv,unitsv,decimal1v,decimal2v,menu,menu_ps,buton,rotE; float med1,med2,med3,med4,med5,med6,med7,med8,med9,med1c,med2c,med3c,sum,average,sumc; float averagec,volt_val_c,cur_val_c,volt_val,cur_val,ref_temp_val,reference_volt,reference_cur; float convert_volt(float),convert_cur(float); float bucla_div_mod(float); void move_cursor_xy(int,int); void configure_lcd(int); void display_char(unsigned char); int debouncing_la_actionare_rotire(int); int debouncing_la_revenire_rotire(int); int debouncing_but(int); int delay_time(int); int delay_long(int); int create_custom_char(int); int strobe_data_p2(int); int cls(int); int draw_Logo(int); int draw_main_menu_screen(int); int draw_power_supply_screen(int); int draw_USB_5V_screen(int); int draw_sub_ps(int); int draw_sub_ps_adv(int); int draw_sub_ps_adi(int); int draw_sub_ps_mm(int); int draw_sub_ps_ret(int); void main(void){ WDTCTL = WDTPW + WDTHOLD; // disable watch dog timer DCOCTL = CALDCO_16MHZ; // set internal oscillator at 16MHz BCSCTL1 = CALBC1_16MHZ; // set internal oscillator at 16MHz P1DIR = 0x0C; // 0000 1100 P2DIR = 0xFF; P1OUT = 0x00; P2OUT = 0x00; //--------------------config ADC ADC10CTL1 |= INCH_6; //continuous sample mode, CH6 // CONSEQ1 + INCH_6 ADC10CTL0 |= ADC10SHT_2 + ADC10ON + MSC; //sample and hold time, adc on, cont. sample ADC10AE0 |= 0x40; // select channel A6 ADC10CTL0 |= ADC10SC + ENC; // start conversions //--------------------config PWM P1SEL |= BIT2; // P1.2 Select as TA0 output TA0CCR0 = pwm_period; TA0CCTL1 = OUTMOD_7; // TA0CCR1 reset/set output mode TA0CCR1 = 0; // TA0CCR1 PWM duty cycle TA0CTL = TASSEL_2 + MC_1; // SMCLK, up mode delay = 5000; reference_volt = preset_volt; reference_cur = preset_cur; menu = 0; configure_lcd(0); //draw_Logo(0); delay = 2000; for(;;) { do{ //==================================== bucla selectie menu ============================== if (menu == 0){ cls(0); draw_main_menu_screen(0); } if (menu == 1){ cls(0); draw_power_supply_screen(0); } if (menu == 2){ cls(0); draw_USB_5V_screen(0); } rotE = debouncing_la_actionare_rotire(rotE); if((rotE == 2) and (menu < 2)){ menu = menu+1; } if((rotE == 1) and (menu > 1)){ menu = menu-1; } rotE = debouncing_la_revenire_rotire(rotE); }while ( buton != 0 ); if ( menu == 1 ) { //========================== Power supply menu ============================ cls(0); draw_sub_ps(0); do{ n = 127; //------------ bucla reglaj tensiune si curent do{ //-------------------------------------------------citire tensiune ADC10CTL1 &= ~(INCH_7); //disable continuous sample mode, CH7 ADC10CTL1 |= INCH_6; //continuous sample mode, CH6 ADC10AE0 |= 0x40; // select channel A6 //0100 0000 ADC10CTL0 |= ADC10SC + ENC; // start conversions delay_time(50); IntVolt = ADC10MEM; //-------------------------------------------------citire curent ADC10CTL0 &= ~(ADC10SC + ENC); // stop conversions ADC10CTL1 &= ~(INCH_6); //disable continuous sample mode, CH6 ADC10CTL1 |= INCH_7; //continuous sample mode, CH7 ADC10AE0 |= 0x80; // select channel A7 //1000 0000 ADC10CTL0 |= ADC10SC + ENC; // start conversions delay_time(50); IntCur = ADC10MEM; ADC10CTL0 &= ~(ADC10SC + ENC); // stop conversions volt_val_c = convert_volt (IntVolt); cur_val_c = convert_cur (IntCur); //----------------------------------------------medie aritmetica tensiune if (IntVolt > 0x00){ med1 = med2; med2 = volt_val_c; } sum = med1+med2; average = sum/2; volt_val = average; //---------------------------------------------medie aritmetica curent if (IntCur > 0x00){ med1c = med2c; med2c = med3c; med3c = cur_val_c; } sumc = med1c+med2c+med3c; averagec = sumc/3; cur_val = averagec; //----------------------------------reglaj PWM tensiune in functie de feedback // histerezis de 0.05A si 0.1V if ((volt_val < (reference_volt - 0.05)) and (cur_val < (reference_cur - 0.025))) { if (TA0CCR1 < (pwm_period - 2)){ TA0CCR1 = TA0CCR1 + 1; } } if ((volt_val > (reference_volt + 0.05)) or (cur_val > (reference_cur + 0.025))) { if (TA0CCR1 > 2 ){ TA0CCR1 = TA0CCR1 - 1; } } n--; }while (n != 0); //----------------------------- Loop for div/mod Voltage Values bucla_div_mod(volt_val); tenthsv = array_div_mod[0]; unitsv = array_div_mod[1]; decimal1v = array_div_mod[2]; decimal2v = array_div_mod[3]; //------------------------------ Loop for div/mod Current Values bucla_div_mod(cur_val); tenthsc = array_div_mod[0]; unitsc = array_div_mod[1]; decimal1c = array_div_mod[2]; decimal2c = array_div_mod[3]; //------------------------------------------ display values move_cursor_xy(3,1); display_char(tenthsv + 0x30); display_char(unitsv + 0x30); display_char('.'); display_char(decimal1v + 0x30); move_cursor_xy(12,1); display_char(unitsc + 0x30); display_char('.'); display_char(decimal1c + 0x30); display_char(decimal2c + 0x30); if (cur_val > (reference_cur - 0.009)){ //desenare simbol CC move_cursor_xy(15,2); display_char('c'); display_char('C'); } else{ move_cursor_xy(15,2); display_char('c'); display_char('V'); } // ------------------------bucla submeniu power supply temp2 = P1IN; buton = (temp2 &= 0x10); if (buton == 0){ // menuchange = 0; menu_ps = 1; buton = debouncing_but(buton); do{ if (menu_ps == 1){ draw_sub_ps_adv(0); } if (menu_ps == 2){ draw_sub_ps_adi(0); } if (menu_ps == 3){ draw_sub_ps_mm(0); } if (menu_ps == 4){ draw_sub_ps_ret(0); } // do{ rotE = debouncing_la_actionare_rotire(rotE); if((rotE == 2) and (menu_ps < 4)){ menu_ps = menu_ps+1; // menuchange = 1; } if((rotE == 1) and (menu_ps > 1)){ menu_ps = menu_ps-1; // menuchange = 1; } rotE = debouncing_la_revenire_rotire(rotE); // }while ((menuchange == 0) and (buton != 0)); move_cursor_xy(1,2); //stergere rand 2 i=16; do{ display_char(' '); i--; }while(i!=0); // buton = P1IN; temp2 = P1IN; buton = (temp2 &= 0x10); }while(buton != 0); } if((menu_ps == 4)and(buton == 0)){ //----------------submeniu Return buton = debouncing_but(buton); menu = 1; move_cursor_xy(5,2); display_char(0x00); display_char(0x01); move_cursor_xy(11,2); display_char(0x04); move_cursor_xy(17,2); } if((menu_ps == 3)and(buton == 0)){ //----------------submeniu intoarcere la main menu buton = debouncing_but(buton); menu = 0; } if((menu_ps == 1)and(buton == 0)){ //----------------submeniu Voltage set buton = debouncing_but(buton); move_cursor_xy(1,2); //stergere rand 2 i=16; do{ display_char(' '); i--; }while(i!=0); move_cursor_xy(7,1); do{ //--------bulca setare rotE = debouncing_la_actionare_rotire(rotE); if((rotE == 2) and (reference_volt < maxreference_volt)){ reference_volt = reference_volt+0.1; // menuchange = 1; } if((rotE == 1) and (reference_volt > 0.2)){ reference_volt = reference_volt-0.1; // menuchange = 1; } rotE = debouncing_la_revenire_rotire(rotE); bucla_div_mod(reference_volt); tenthsv = array_div_mod[0]; unitsv = array_div_mod[1]; decimal1v = array_div_mod[2]; decimal2v = array_div_mod[3]; move_cursor_xy(3,1); display_char(tenthsv + 0x30); display_char(unitsv + 0x30); display_char('.'); display_char(decimal1v + 0x30); temp2 = P1IN; buton = (temp2 &= 0x10); }while(buton != 0); buton = debouncing_but(buton); move_cursor_xy(5,2); display_char(0x00); display_char(0x01); move_cursor_xy(11,2); display_char(0x04); move_cursor_xy(17,2); } if((menu_ps == 2)and(buton == 0)){ //----------------submeniu Current set buton = debouncing_but(buton); move_cursor_xy(1,2); //stergere rand 2 i=16; do{ display_char(' '); i--; }while(i!=0); move_cursor_xy(16,1); do{ //--------bulca setare rotE = debouncing_la_actionare_rotire(rotE); if((rotE == 2) and (reference_cur < maxreference_cur)){ reference_cur = reference_cur+0.1; // menuchange = 1; } if((rotE == 1) and (reference_cur > 0.2)){ reference_cur = reference_cur-0.1; // menuchange = 1; } rotE = debouncing_la_revenire_rotire(rotE); bucla_div_mod(reference_cur); tenthsc = array_div_mod[0]; unitsc = array_div_mod[1]; decimal1c = array_div_mod[2]; decimal2c = array_div_mod[3]; move_cursor_xy(12,1); display_char(unitsc + 0x30); display_char('.'); display_char(decimal1c + 0x30); display_char('0'); temp2 = P1IN; buton = (temp2 &= 0x10); }while(buton != 0); buton = debouncing_but(buton); move_cursor_xy(5,2); display_char(0x00); display_char(0x01); move_cursor_xy(11,2); display_char(0x04); move_cursor_xy(17,2); } }while ( menu == 1 ) ; TA0CCR1 = 0; } // --------------------------------------- supply menu end } } //---------------------------------------------------------------------------------------------------------------------------------- //----------------- PROCEDURI ----------- PROCEDURI ----------- PROCEDURI ----------- PROCEDURI ----------- PROCEDURI ---- //---------------------------------------------------------------------------------------------------------------------------------- int delay_time (int delay){ //----------------------------------------- Delay--------------------- do delay--; while (delay != 0); return (int)(delay); } int delay_long (int){ //--------------------------------------- Delay lung------------------ int j; j = 200; do{ delay_time(delay); j--; }while (j != 0); return (int)(delay); } float convert_volt (float IntVolt){ // ------------------------Conversie tensiune float voltage,ua2,raport_divizor,r2,r1; r1 = 9310; r2 = 1097; ua2 = (3.56/1024*IntVolt); raport_divizor = ((r1+r2)/r2); voltage = (ua2*raport_divizor); return (float)(voltage); } float convert_cur (float IntCur){ // ------------------------Conversie curent float current,Usunt,factor_op_amp,r2_op,r1_op,rs; r1_op = 1000; r2_op = 9450; rs = 0.06; factor_op_amp = (1+(r2_op/r1_op)); Usunt = ((3.56/1024*IntCur)/factor_op_amp); current = (Usunt/rs); return (float)(current); } int debouncing_but (int){ //----------------------debouncing la revenire buton delay_time(delay); do{ temp2 = P1IN; buton = (temp2 &= 0x10); }while (buton == 0); return(int)( buton ); } int debouncing_la_actionare_rotire(int rotE){ //------------debouncing la actionare rotire delay_time(delay); do { temp2 = P1IN; rotE = (temp2 &= (BIT0 + BIT1)); temp2 = P1IN; buton = (temp2 &= 0x10); }while ((rotE == 3) and (buton != 0)); return (int)(rotE); } int debouncing_la_revenire_rotire(int rotE){ //-------debouncing la revenire din rotire delay_time(delay); do { temp2 = P1IN; rotE = (temp2 &= (BIT0 + BIT1)); temp2 = P1IN; buton = (temp2 &= 0x10); }while ((rotE != 3) and (buton != 0)); return (int)(rotE); } void configure_lcd(int){ //-----------------------------LCD-SET-AND-CONFIGURE--------------------------------------- int rep_n; rep_n = 3; do{ strobe_data_p2(D5+D4); // comand xxxxx 110000 x3 means >> 8bit, 2lines, 5x8pixel char rep_n--; }while (rep_n != 0); rep_n = 2; do{ // comand xxxxx 100000 x1 means >> 8bit, 2lines, 5x8pixel char strobe_data_p2(D5); // comand xxxxxxxxxxxxxxx means >> move right/ shift off rep_n--; }while (rep_n != 0); strobe_data_p2(D7); // comand xxxxxxxxxxxxxxx means >> move right/ shift off strobe_data_p2(0x00); // comand xxxxxxxxxxxxxxx means >> move right/ shift off strobe_data_p2(D7+D6); // comand xxxxxxxxxxxxxxxx means >> move right/ shift off strobe_data_p2(0x00); // comand xxxxxxxxxxxxxxxx means >> display/ cursor/ blinking strobe_data_p2(D7+D6+D5+D4); // comand xxxxxxxxxxxxxxx means >> display/ cursor/ blinking rep_n = 2; do{ strobe_data_p2(0x00); // comand xxxxxxxxxxxxxx means >> 8bit, 2lines, 5x8pixel char strobe_data_p2(D4); // comand xxxxxxxxxxxxxx means >> 8bit, 2lines, 5x8pixel char rep_n--; }while (rep_n != 0); create_custom_char(0); } float bucla_div_mod(float ref_temp_val){ //------------------------------ Loop for div/mod ------------ int tenths,units,decimal1,decimal2; tenths = 0; units = 0; decimal1 = 0; decimal2 = 0; i = 27; do{ // div_/mod_ loop if ( ref_temp_val >= 10 ){ ref_temp_val = ref_temp_val - 10; tenths = tenths + 1; } i--; }while (i != 0); i = 10; ref_temp_val = ref_temp_val*10; do{ // div_/mod_ loop if ( ref_temp_val >= 10 ){ ref_temp_val = ref_temp_val - 10; units = units + 1; } i--; }while (i != 0); i = 10; ref_temp_val = ref_temp_val*10; do{ // div_/mod_ loop if ( ref_temp_val >= 10 ){ ref_temp_val = ref_temp_val - 10; decimal1 = decimal1 + 1; } i--; }while (i != 0); i = 10; ref_temp_val = ref_temp_val*10; do{ // div_/mod_ loop if ( ref_temp_val >= 10 ){ ref_temp_val = ref_temp_val - 10; decimal2 = decimal2 + 1; } i--; }while (i != 0); array_div_mod[0] = tenths; array_div_mod[1] = units; array_div_mod[2] = decimal1; array_div_mod[3] = decimal2; return (int)(array_div_mod); } void move_cursor_xy (int x,int y){ // ---------------------------- Procedura afisare------------ char adress,temp; x = x - 1; y = y - 1; adress = (128 + x + (64 * y)); //corectie la matrice temp = adress; P2OUT = Clear ; // R/W = 0 (write mode) RS = 0 (address) delay_time(delay); adress = adress >> 4; adress = adress << 2; strobe_data_p2(adress); adress = temp; adress &= 0x0F; adress = adress << 2; strobe_data_p2(adress); } void display_char(unsigned char ch){ //------------- Afisare Caracter------------------------ char temp; temp = ch; P2OUT = RS ; // R/W = 0 (write mode) RS = 1 (data) ch = ch >> 4; ch = ch << 2; strobe_data_p2(RS+ch); ch = temp; ch &= 0x0F; ch = ch << 2; strobe_data_p2(RS+ch); } int create_custom_char(int){ // --------------------------------------- create custom char----------- strobe_data_p2(D6); strobe_data_p2(0x00); // comand xxxxxxxxx means >> 0x40 comand set CGRAM adress to 0 //scorpion half1 strobe_data_p2(RS+D4); strobe_data_p2(RS+D7); // comand xxxxxxxx means >> send special character data byte0 strobe_data_p2(RS); strobe_data_p2(D6+RS); // comand xxxxxxxx means >> send special character data byte1 strobe_data_p2(RS+D4); strobe_data_p2(D7+D6+D5+RS); // comand xxxxxxxx means >> send special character data byte2 strobe_data_p2(RS); strobe_data_p2(D5+D4+RS); // comand xxxxxxxx means >> send special character data byte3 strobe_data_p2(RS); strobe_data_p2(D5+D4+RS); // comand xxxxxxxx means >> send special character data byte4 strobe_data_p2(RS+D4); strobe_data_p2(RS+D7+D5+D4); // comand xxxxxxxx means >> send special character data byte5 strobe_data_p2(RS); strobe_data_p2(RS+D7+D6+D5+D4); // comand xxxxxxxx means >> send special character data byte6 strobe_data_p2(RS+D4); strobe_data_p2(RS+D7+D6); // comand xxxxxxxx means >> send special character data byte7 //scorpion half2 strobe_data_p2(RS); strobe_data_p2(RS+D6+D5); // comand xxxxxxxx means >> send special character data byte0 strobe_data_p2(RS); strobe_data_p2(D7+RS+D4); // comand xxxxxxxx means >> send special character data byte1 strobe_data_p2(RS); strobe_data_p2(D4+RS); // comand xxxxxxxx means >> send special character data byte2 strobe_data_p2(RS); strobe_data_p2(D5+D4+RS); // comand xxxxxxxx means >> send special character data byte3 strobe_data_p2(RS+D4); strobe_data_p2(D7+D6+D5+RS); // comand xxxxxxxx means >> send special character data byte4 strobe_data_p2(RS+D4); strobe_data_p2(RS+D7+D6); // comand xxxxxxxx means >> send special character data byte5 strobe_data_p2(RS+D4); strobe_data_p2(RS); // comand xxxxxxxx means >> send special character data byte6 strobe_data_p2(RS); strobe_data_p2(RS); // comand xxxxxxxx means >> send special character data byte7 //sageata stanga strobe_data_p2(RS); strobe_data_p2(RS+D6); // comand xxxxxxxx means >> send special character data byte0 strobe_data_p2(RS); strobe_data_p2(D7+RS+D6); // comand xxxxxxxx means >> send special character data byte1 strobe_data_p2(RS+D4); strobe_data_p2(D5+RS+D7+D6); // comand xxxxxxxx means >> send special character data byte2 strobe_data_p2(RS); strobe_data_p2(D7+D6+D4+RS); // comand xxxxxxxx means >> send special character data byte3 strobe_data_p2(RS); strobe_data_p2(D6+D4+RS); // comand xxxxxxxx means >> send special character data byte4 strobe_data_p2(RS+D4); strobe_data_p2(RS+D4); // comand xxxxxxxx means >> send special character data byte5 strobe_data_p2(RS+D4); strobe_data_p2(RS+D7+D4); // comand xxxxxxxx means >> send special character data byte6 strobe_data_p2(RS); strobe_data_p2(RS+D7+D6+D5); // comand xxxxxxxx means >> send special character data byte7 //sageata dreapta strobe_data_p2(RS); strobe_data_p2(RS+D6); // comand xxxxxxxx means >> send special character data byte0 strobe_data_p2(RS); strobe_data_p2(D5+RS+D6); // comand xxxxxxxx means >> send special character data byte1 strobe_data_p2(RS); strobe_data_p2(D5+RS+D7+D6+D4); // comand xxxxxxxx means >> send special character data byte2 strobe_data_p2(RS+D4); strobe_data_p2(D6+D5+RS); // comand xxxxxxxx means >> send special character data byte3 strobe_data_p2(RS+D4); strobe_data_p2(D6+RS); // comand xxxxxxxx means >> send special character data byte4 strobe_data_p2(RS+D4); strobe_data_p2(RS+D4); // comand xxxxxxxx means >> send special character data byte5 strobe_data_p2(RS); strobe_data_p2(RS+D7+D4+D5); // comand xxxxxxxx means >> send special character data byte6 strobe_data_p2(RS); strobe_data_p2(RS+D6+D5); // comand xxxxxxxx means >> send special character data byte7 //simbol buton strobe_data_p2(RS); strobe_data_p2(RS+D6); // comand xxxxxxxx means >> send special character data byte0 strobe_data_p2(RS+D4); strobe_data_p2(D5+RS+D6+D7+D4); // comand xxxxxxxx means >> send special character data byte1 strobe_data_p2(RS); strobe_data_p2(D5+RS+D7+D6); // comand xxxxxxxx means >> send special character data byte2 strobe_data_p2(RS); strobe_data_p2(D6+RS); // comand xxxxxxxx means >> send special character data byte3 strobe_data_p2(RS); strobe_data_p2(RS); // comand xxxxxxxx means >> send special character data byte4 strobe_data_p2(RS); strobe_data_p2(RS+D7+D6+D5); // comand xxxxxxxx means >> send special character data byte5 strobe_data_p2(RS); strobe_data_p2(RS+D7+D5); // comand xxxxxxxx means >> send special character data byte6 strobe_data_p2(RS+D4); strobe_data_p2(RS+D6+D5+D4); // comand xxxxxxxx means >> send special character data byte7 return(0); } int strobe_data_p2(int strobe){ // -------------------------- strobe data to display------------- P2OUT = (strobe); // data sent from comand delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); return(0); } int cls(int){ // -------------------------- Clear screen------------- int m; m = 16; move_cursor_xy(1,1); do{ display_char(' '); m--; }while (m != 0); m = 16; move_cursor_xy(1,2); do{ display_char(' '); m--; }while (m != 0); return(0); } int draw_Logo(int){ // -------------------- Logo intro------------- int count_m; cls(0); move_cursor_xy(3,1); display_char('S'); display_char('c'); display_char('o'); display_char('r'); display_char('p'); display_char('i'); display_char('o'); display_char('n'); display_char(' '); display_char('3'); display_char('.'); display_char('0'); move_cursor_xy(8,2); display_char(0x00); display_char(0x01); move_cursor_xy(17,2); count_m = 12; do{ delay_long(0); count_m --; }while(count_m !=0); cls(0); move_cursor_xy(4,1); display_char('C'); display_char('r'); display_char('e'); display_char('a'); display_char('t'); display_char('e'); display_char('d'); display_char(' '); display_char('b'); display_char('y'); move_cursor_xy(3,2); display_char('M'); display_char('a'); display_char('r'); display_char('i'); display_char('u'); display_char('s'); display_char(' '); display_char('T'); display_char('a'); display_char('c'); display_char('i'); display_char('u'); display_char('c'); move_cursor_xy(17,2); count_m = 12; do{ delay_long(0); count_m --; }while(count_m !=0); return(0); } int draw_main_menu_screen(int){ // --------------------------draw main menu------------- move_cursor_xy(4,1); display_char('M'); display_char('a'); display_char('i'); display_char('n'); display_char(' '); display_char('m'); display_char('e'); display_char('n'); display_char('u'); move_cursor_xy(1,2); display_char(0x00); display_char(0x01); move_cursor_xy(16,2); display_char(0x03); return(0); } int draw_power_supply_screen(int){ // --------------------------draw power supply menu------------- move_cursor_xy(1,1); display_char('1'); display_char(' '); display_char('P'); display_char('o'); display_char('w'); display_char('e'); display_char('r'); display_char(' '); display_char('s'); display_char('u'); display_char('p'); display_char('p'); display_char('l'); display_char('y'); move_cursor_xy(5,2); display_char(0x00); display_char(0x01); move_cursor_xy(11,2); display_char(0x04); move_cursor_xy(16,2); display_char(0x03); return(0); } int draw_USB_5V_screen(int){ // --------------------------draw power USB 5V menu------------- move_cursor_xy(1,1); display_char('2'); display_char(' '); display_char('U'); display_char('S'); display_char('B'); display_char(' '); display_char('5'); display_char('V'); display_char(' '); move_cursor_xy(1,2); display_char(0x02); move_cursor_xy(5,2); display_char(0x00); display_char(0x01); move_cursor_xy(11,2); display_char(0x04); move_cursor_xy(17,2); return(0); } int draw_sub_ps(int){ move_cursor_xy(1,1); display_char('U'); display_char('='); move_cursor_xy(7,1); display_char('V'); move_cursor_xy(10,1); display_char('I'); display_char('='); move_cursor_xy(16,1); display_char('A'); move_cursor_xy(5,2); display_char(0x00); display_char(0x01); move_cursor_xy(11,2); display_char(0x04); move_cursor_xy(17,2); return(0); } int draw_sub_ps_adv(int){ move_cursor_xy(2,2); display_char(' '); display_char(' '); display_char('A'); display_char('d'); display_char('j'); display_char('.'); display_char(' '); display_char('V'); display_char(' '); display_char(' '); move_cursor_xy(13,2); display_char(0x04); move_cursor_xy(15,2); display_char(' '); display_char(0x03); return(0); } int draw_sub_ps_adi(int){ move_cursor_xy(1,2); display_char(0x02); move_cursor_xy(3,2); display_char(' '); display_char('A'); display_char('d'); display_char('j'); display_char('.'); display_char(' '); display_char('I'); display_char(' '); display_char(' '); move_cursor_xy(13,2); display_char(0x04); move_cursor_xy(16,2); display_char(0x03); return(0); } int draw_sub_ps_mm(int){ move_cursor_xy(1,2); display_char(0x02); move_cursor_xy(3,2); display_char('M'); display_char('a'); display_char('i'); display_char('n'); display_char(' '); display_char('m'); display_char('e'); display_char('n'); display_char('u'); move_cursor_xy(13,2); display_char(0x04); move_cursor_xy(16,2); display_char(0x03); return(0); } int draw_sub_ps_ret(int){ move_cursor_xy(1,2); display_char(0x02); move_cursor_xy(3,2); display_char(' '); display_char(' '); display_char('B'); display_char('a'); display_char('c'); display_char('k'); display_char(' '); display_char(' '); display_char(' '); move_cursor_xy(13,2); display_char(0x04); move_cursor_xy(16,2); display_char(' '); return(0); }