#include <16F876.h> #use delay(clock=6000000) #fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP #use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7) #byte porta = 5 #byte portb = 6 #byte portc = 7 #bit head_1 = portb.0 #bit head_2 = portb.1 #bit head_3 = portb.2 #bit head_4 = portb.3 #bit head_5 = portb.4 #bit head_6 = portb.5 #bit head_7 = portb.6 #bit head_8 = portb.7 #bit motor_1 = porta.0 #bit motor_2 = porta.1 #bit motor_3 = porta.2 #bit motor_4 = porta.3 #bit home_pos = porta.4 #define at_home !home_pos #define ESCAPE 0x1B #define CR 0x0D #define HEAD_RANK_A_TIMING 1265 #define HEAD_RANK_B_TIMING 1156 #define HEAD_RANK_C_TIMING 1047 #define HEAD_TIMING HEAD_RANK_B_TIMING #define HEAD_TIMING_70_PERCENT ((HEAD_TIMING * 700) / 1000) #define HEAD_TIMING_90_PERCENT ((HEAD_TIMING * 900) / 1000) #define MOTOR_TIMING 5 #define PAPER_BEGINING 40 #define LINE_FEED_COUNT 168 enum { ASCII_BLOCK_1 = 1, ASCII_BLOCK_2, ASCII_BLOCK_3 }; char phase_state,head_pos,in_ptr,out_ptr,rx_blk[70]; short escape_set; char const ascii1[32][7] = { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // { 0x40,0x40,0x40,0x40,0x00,0x00,0x40 }, // ! { 0x50,0x50,0x50,0x00,0x00,0x00,0x00 }, // " { 0x50,0x50,0xF8,0x50,0xF8,0x50,0x50 }, // # { 0x40,0x78,0xA0,0x70,0x28,0xF0,0x20 }, // $ { 0xC0,0xC8,0x10,0x20,0x40,0x98,0x18 }, // % { 0x60,0x90,0xA0,0x40,0xA0,0x90,0x68 }, // & { 0x60,0x20,0x40,0x00,0x00,0x00,0x00 }, // ' { 0x10,0x20,0x40,0x40,0x40,0x20,0x10 }, // ( { 0x40,0x20,0x10,0x10,0x10,0x20,0x40 }, // ) { 0x00,0x20,0xA8,0x70,0xA8,0x20,0x00 }, // * { 0x00,0x20,0x20,0xF8,0x20,0x20,0x00 }, // + { 0x00,0x00,0x00,0x00,0x60,0x20,0x40 }, // , { 0x00,0x00,0x00,0xF8,0x00,0x00,0x00 }, // - { 0x00,0x00,0x00,0x00,0x00,0x30,0x30 }, // . { 0x08,0x10,0x20,0x40,0x80,0x00,0x00 }, // / { 0x70,0x88,0x98,0xA8,0xC8,0x88,0x70 }, // 0 { 0x20,0x60,0x20,0x20,0x20,0x20,0x70 }, // 1 { 0x70,0x88,0x08,0x10,0x20,0x40,0xF8 }, // 2 { 0xF8,0x10,0x20,0x10,0x08,0x88,0x70 }, // 3 { 0x10,0x30,0x50,0x90,0xF8,0x10,0x10 }, // 4 { 0xF8,0x80,0xF0,0x08,0x08,0x88,0x70 }, // 5 { 0x30,0x40,0x80,0xF0,0x88,0x88,0x70 }, // 6 { 0xF8,0x08,0x10,0x20,0x40,0x40,0x40 }, // 7 { 0x70,0x88,0x88,0x70,0x88,0x88,0x70 }, // 8 { 0x70,0x88,0x88,0x78,0x08,0x10,0x60 }, // 9 { 0x00,0x30,0x30,0x00,0x30,0x30,0x00 }, // : { 0x00,0x30,0x30,0x00,0x30,0x10,0x20 }, // ; { 0x08,0x10,0x20,0x40,0x20,0x10,0x08 }, // < { 0x00,0x00,0xF8,0x00,0xF8,0x00,0x00 }, // = { 0x40,0x20,0x10,0x08,0x10,0x20,0x40 }, // > { 0x70,0x88,0x08,0x10,0x20,0x00,0x20 } // ? }; char const ascii2[32][7] = { { 0x70,0x88,0x08,0x68,0xA8,0xA8,0x70 }, // @ { 0x70,0x88,0x88,0x88,0xF8,0x88,0x88 }, // A { 0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0 }, // B { 0x70,0x88,0x80,0x80,0x80,0x88,0x70 }, // C { 0xE0,0x90,0x88,0x88,0x88,0x90,0xE0 }, // D { 0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8 }, // E { 0xF8,0x80,0x80,0xF0,0x80,0x80,0x80 }, // F { 0x70,0x88,0x80,0xB8,0x88,0x88,0x78 }, // G { 0x88,0x88,0x88,0xF8,0x88,0x88,0x88 }, // H { 0x70,0x20,0x20,0x20,0x20,0x20,0x70 }, // I { 0x38,0x10,0x10,0x10,0x10,0x90,0x60 }, // J { 0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88 }, // K { 0x80,0x80,0x80,0x80,0x80,0x80,0xF8 }, // L { 0x88,0xD8,0xA8,0xA8,0x88,0x88,0x88 }, // M { 0x88,0x88,0xC8,0xA8,0x98,0x88,0x88 }, // N { 0x70,0x88,0x88,0x88,0x88,0x88,0x70 }, // O { 0xF0,0x88,0x88,0xF8,0x80,0x80,0x80 }, // P { 0x70,0x88,0x88,0x88,0xA8,0x98,0x68 }, // Q { 0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88 }, // R { 0x78,0x80,0x80,0x70,0x08,0x08,0xF0 }, // S { 0xF8,0x20,0x20,0x20,0x20,0x20,0x20 }, // T { 0x88,0x88,0x88,0x88,0x88,0x88,0x70 }, // U { 0x88,0x88,0x88,0x88,0x88,0x50,0x20 }, // V { 0x88,0x88,0x88,0xA8,0xA8,0xA8,0x50 }, // W { 0x88,0x88,0x50,0x20,0x50,0x88,0x88 }, // X { 0x88,0x88,0x88,0x50,0x20,0x20,0x20 }, // Y { 0xF8,0x08,0x10,0x20,0x40,0x80,0xF8 }, // Z { 0x70,0x40,0x40,0x40,0x40,0x40,0x70 }, // [ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // { 0x70,0x10,0x10,0x10,0x10,0x10,0x70 }, // ] { 0x20,0x50,0x88,0x00,0x00,0x00,0x00 }, // ^ { 0x00,0x00,0x00,0x00,0x00,0x00,0xF8 } // _ }; char const ascii3[32][7] = { { 0x40,0x20,0x10,0x00,0x00,0x00,0x00 }, // ' { 0x00,0x00,0x70,0x08,0x78,0x88,0x78 }, // a { 0x80,0x80,0xB0,0xC8,0x88,0x88,0xF0 }, // b { 0x00,0x00,0x70,0x80,0x80,0x88,0x70 }, // c { 0x08,0x08,0x68,0x98,0x88,0x88,0x78 }, // d { 0x00,0x00,0x70,0x88,0xF8,0x80,0x70 }, // e { 0x30,0x48,0x40,0xE0,0x40,0x40,0x40 }, // f { 0x00,0x78,0x88,0x88,0x78,0x08,0x70 }, // g { 0x80,0x80,0xB0,0xC8,0x88,0x88,0x88 }, // h { 0x20,0x00,0x60,0x20,0x20,0x20,0x70 }, // i { 0x10,0x00,0x30,0x10,0x10,0x90,0x60 }, // j { 0x40,0x40,0x48,0x50,0x60,0x50,0x48 }, // k { 0x60,0x20,0x20,0x20,0x20,0x20,0x70 }, // l { 0x00,0x00,0xD0,0xA8,0xA8,0x88,0x88 }, // m { 0x00,0x00,0xB0,0xC8,0x88,0x88,0x88 }, // n { 0x00,0x00,0x70,0x88,0x88,0x88,0x70 }, // o { 0x00,0x00,0xF0,0x88,0xF0,0x80,0x80 }, // p { 0x00,0x00,0x68,0x98,0x78,0x08,0x08 }, // q { 0x00,0x00,0xB0,0xC8,0x80,0x80,0x80 }, // r { 0x00,0x00,0x70,0x80,0x70,0x08,0xF0 }, // s { 0x40,0x40,0xE0,0x40,0x40,0x48,0x30 }, // t { 0x00,0x00,0x88,0x88,0x88,0x98,0x68 }, // u { 0x00,0x00,0x88,0x88,0x88,0x50,0x20 }, // v { 0x00,0x00,0x88,0x88,0xA8,0xA8,0x50 }, // w { 0x00,0x00,0x88,0x50,0x20,0x50,0x88 }, // x { 0x00,0x00,0x88,0x88,0x78,0x08,0x70 }, // y { 0x00,0x00,0xF8,0x10,0x20,0x40,0xF8 }, // z { 0x10,0x20,0x20,0x40,0x20,0x20,0x10 }, // { { 0x20,0x20,0x20,0x20,0x20,0x20,0x20 }, // | { 0x40,0x20,0x20,0x10,0x20,0x20,0x40 }, // } { 0x00,0x40,0x20,0xF8,0x20,0x40,0x00 }, // -> { 0x00,0x20,0x40,0xF8,0x40,0x20,0x00 } // <- }; // ******************************************************************** #int_rda rda_isr() { rx_blk[in_ptr++] = getchar(); if(in_ptr >= sizeof(rx_blk)) in_ptr = 0; } // ******************************************************************** char get_char(void) { char ret_val; while(in_ptr == out_ptr) ; ret_val = rx_blk[out_ptr++]; if(out_ptr >= sizeof(rx_blk)) out_ptr = 0; return(ret_val); } // ******************************************************************** void clear_buffer(void) { in_ptr = out_ptr = 0; } // ******************************************************************** void head_forward(char count) { char i; if(!count) return; for(i=0;i 0x7F)) return(FALSE); if(ch <= '?') { type = ASCII_BLOCK_1; ent = ch - 0x20; } if((ch >= '@') && (ch <= '_')) { type = ASCII_BLOCK_2; ent = ch - 0x40; } if(!type) { type = ASCII_BLOCK_3; ent = ch - 0x60; } //printf("\r\nCh = %c,Type = %02X, Ent = %02X",ch,type,ent); ptr = 0x80; for(i=0;i<7;i++) { m = 0; for(y=0;y<7;y++) { switch(type) { case ASCII_BLOCK_1: { if(ascii1[ent][y] & ptr) bit_set(m,y); } break; case ASCII_BLOCK_2: { if(ascii2[ent][y] & ptr) bit_set(m,y); } break; case ASCII_BLOCK_3: { if(ascii3[ent][y] & ptr) bit_set(m,y); } break; } } ptr >>= 1; //printf(" [%02X,%02X-%02X]",i,y,m); print_pixel_line(m); } head_forward(1); } // ******************************************************************* void line_feed(void) { if(head_pos < LINE_FEED_COUNT) { if(!at_home) return_home(); head_forward(LINE_FEED_COUNT); } return_home(); } // ******************************************************************* char get_nibble(void) { char dat; escape_set = FALSE; dat = getc(); if(dat == ESCAPE) { escape_set = TRUE; return(0); } // putchar(dat); if(dat < 'A') dat &= 0x0F; else dat = ((dat & 0xDF) - 'A') + 0x0A; return(dat); } // ******************************************************************* char get_byte(void) { char dat,dat1; dat = (get_nibble() << 4); if(escape_set) return(0); dat1 = get_nibble(); if(escape_set) return(0); return(dat + dat1); } // ******************************************************************** void debug(void) { char i; while(TRUE) { escape_set = FALSE; printf("\r\n\r\n(R)eturn Home,(F)orward,(B)ackward,(P)ixel Line,(C)hars\r\n"); printf("Paper (L)oad,Line F(E)ed,(N)umbers,(T)est"); putchar(' '); i = toupper(get_char()); printf("\r\n"); switch(i) { case 'T': { // printf("Time :- %02X. New :- ",step_time); // step_time = get_byte(); // printf("\r\nNew :- %02x",step_time); while(TRUE) { return_home(); for(i='A';i<= 'Z';i++) print_char(i); for(i='0';i<= '?';i++) print_char(i); if(in_ptr != out_ptr) break; } clear_buffer(); } break; case 'C': { while(!escape_set) { i = get_char(); if(i == CR) { printf("\r\n%u\r\n",head_pos); return_home(); continue; } if(i == ESCAPE) { clear_buffer(); break; } print_char(i); } } break; case 'R': { return_home(); } break; case 'N': { i = 0; do { print_pixel_line(i); printf("\r\n%u ",i); } while(++i); } break; case 'E': { line_feed(); } break; case 'L': { for(i=0;i<5;i++) line_feed(); } break; case 'F': { head_forward(1); } break; case 'B': { head_backward(1); } break; case 'P': { while(TRUE) { i = get_byte(); putchar(' '); if(escape_set) break; print_pixel_line(i); } } break; } } } // ******************************************************************** void main() { char i; setup_adc_ports(NO_ANALOGS); setup_adc(ADC_CLOCK_DIV_2); setup_spi(FALSE); setup_counters(RTCC_INTERNAL,RTCC_DIV_2); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_ccp1(CCP_OFF); setup_ccp2(CCP_OFF); set_tris_a(0x10); set_tris_b(0x00); set_tris_c(0x80); porta = 0; portb = 0; portc = 0; motor_1 = motor_2 = motor_3 = motor_4 = FALSE; escape_set = FALSE; phase_state = 0; in_ptr = out_ptr = 0; delay_ms(2000); line_feed(); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); if(get_char() == '*') // Do debug debug(); while(TRUE) { i = get_char(); if(i < CR) continue; if(i == CR) { line_feed(); continue; } if(i == ESCAPE) { clear_buffer(); continue; } print_char(i); } }