Elektronika.lt
 2025 m. spalio 2 d. Projektas | Reklama | Žinokite | Klausimai | Prisidėkite | Atsiliepimai | Kontaktai
Paieška portale
EN Facebook RSS

 Kas naujo  Katalogas  Parduotuvės  Forumas  Tinklaraščiai
 Pirmas puslapisSąrašas
 Forumas / + pokalbiai
 - Paieška forume
 - D.U.K. / Forumo taisyklės
 - Narių sąrašas
 - Registruotis
 - Prisijungti

Elektronika.lt portalo forumas

Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo. Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.

Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius, kurie nesilaiko forumo taisyklių. Pastebėjus nusižengimus, prašome pranešti.

Dabar yra 2025 10 02, 05:13. Visos datos yra GMT + 2 valandos.
 Forumas » Mikrovaldikliai » Padekit Su C++ Picams. Nesuprantu kaip panaudoti klavetura
Jūs negalite rašyti naujų pranešimų į šį forumą
Jūs negalite atsakinėti į pranešimus šiame forume
Jūs negalite redaguoti savo pranešimų šiame forume
Jūs negalite ištrinti savo pranešimų šiame forume
Jūs negalite dalyvauti apklausose šiame forume
 
  
Puslapis 11
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 Padekit Su C++ Picams. Nesuprantu kaip panaudoti klavetura
PranešimasParašytas: 2006 04 25, 18:00 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Vintikas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Codas nemano rasytas. bet ir as nelabai kertu. Pradedu po biski tik


/*
* June 4, 2003 CONFIG statement changed to prevent errors with version 8 compiler
* lcdterm6.c December 4, 2000 Bob Blick
* Licensed under the terms of the GNU General Public License, www.gnu.org
* No warranties expressed or implied.
* Full duplex serial terminal using an LCD character display(HD44780 compatible),
* matrixed keypad up to 20 switches, and a PIC16F84
*
* This version adds super-multiplexing on upper 5 bits of PORTB, input and output!
* Minor bugfix to serial receive, centers better on bits now.
*
* compile with PICCLITE from www.htsoft.com
* command line:
* picl -O -Zg9 -16F84 -V lcdterm6.c
*
* pin assignments:
* PORTA 4 p3 3 p2 2 p1 1 p18 0 p17
* SERIN KBI3 KBI2 KBI1 KBI0
*
* PORTB 7 p13 6 p12 5 p11 4 p10 3 p9 2 p8 1 p7 0 p6
* LCD7 LCD6 LCD5 LCD4 LCDRS LCDEN SEROUT BKLITE,
* KBDO7 KBDO6 KBDO5 KBDO4 KBDO3 BEEP, WHATEVER
*
* OTHER p5 p14 p4 p15 p16
* Vss/GND Vdd/+5 /MCLR OSC2CKO OSC1CKI
*/
#include <pic.h>
//__CONFIG(WDTDIS & HS & UNPROTECT); //this is for HS (more than 4 megahertz) oscillator
__CONFIG(WDTDIS & XT & UNPROTECT); //this is for XT (4 megahertz or less) oscillator
// Watchdog timer would be | 0x04 but I'm not using it

// Change these to suit your setup

// You must use one and only one of the next four

#define CURSOR_OFF_NOBLINK //if you want no cursor
//#define CURSOR_ON_NOBLINK //if you want a plain cursor
//#define CURSOR_OFF_BLINK //if you want the print position to blink
//#define CURSOR_ON_BLINK //the cursor kitchen sink

// LCD formatting does line wraps correctly. Uses memory, you don't need it unless you want it.
// Note that 2X40 displays wrap correctly right out of the box and need no formatting.

#define LCD_FORMAT //if you want LCD line formatting uncomment this

// If you chose LCD_FORMAT uncomment one and only one of the following

#define LCD_4X20 //if you have a 4x20 display and want formatting
//#define LCD_2X20
//#define LCD_2X16
//#define LCD_2X8 //this also works for cheap 1X16 displays that have one chip
//#define LCD_1X16

// LCD hardware initialization. Two line 5x7 font is the most common. You must choose one.

#define TWOLINE_5X7
//#define ONELINE_5X7 //this gives a better contrast ratio but only on one line displays
//#define ONELINE_5X10 //Many of the better 1 line displays support this.

// Uncomment to Translate ascii to use the full descender versions in the character map

//#define DESCENDERS //if you use 5X10 font you can translate j,y,etc but uses memory

#define XTAL 4000000 // Crystal frequency (Hz).
#define BRATE 2400L // Baud rate. "L" prevents truncation in calculations.
#define RX_OVERSAMPLE 4 // Receive oversampling. Must be at least 4 and power of two

// Super-multiplexed outputs(upper 5 bits) of PORT B get set to this at startup
#define SUPER_MX_OUT_INIT 0b00000000 //lower three bits ignored

/**********YOU DON'T NEED TO CHANGE ANYTHING BEYOND THIS POINT************/

// Keeping you honest Smile
#if (RX_OVERSAMPLE-1)&RX_OVERSAMPLE
#error RX_OVERSAMPLE_value must be a power of 2
#endif
#if (RX_OVERSAMPLE < 4)
#error RX_OVERSAMPLE must be 4 or greater
#endif
#define RX_BITCENTER ((RX_OVERSAMPLE/2) - 1)

#define byte unsigned char

// LCD pins
static bit LCD_RS @ ((unsigned)&PORTB*8+3); // Register select
static bit LCD_EN @ ((unsigned)&PORTB*8+2); // Enable

// Transmit and Receive port bits
static volatile bit TxData @ (unsigned)&PORTB*8+1; /* bit1 in port B */
static volatile bit RxData @ (unsigned)&PORTA*8+4; /* bit4 in port A */

// Don't change these
#define TIMER_VALUE (XTAL / (4 * BRATE * RX_OVERSAMPLE))
#define TRANSMIT_NUM_BITS 13 // 1 start bit + 8 data bits + 2 stop bits + safe.
#define INT_PERIOD (1000000 / (BRATE * RX_OVERSAMPLE)) //that is in microseconds

#if ((TIMER_VALUE) < 90)
#error baud rate or oversample too high for crystal speed
#endif

#if ((TIMER_VALUE) > 256)
#error baud rate or oversample too low for crystal speed
#endif

// Line lengths for LCD formatting
#define BEGIN_LINE_1 0
#define LINE_1_MINUS_1 255
#ifdef LCD_4X20
#define END_LINE_1 19
#define BEGIN_LINE_2 64
#define END_LINE_2 83
#define BEGIN_LINE_3 20
#define END_LINE_3 39
#define BEGIN_LINE_4 84
#define END_LINE_4 103
#define LINE_2_MINUS_1 63
#define LINE_3_MINUS_1 19
#define LINE_4_MINUS_1 83
#endif
#ifdef LCD_2X20
#define END_LINE_1 19
#define BEGIN_LINE_2 64
#define END_LINE_2 83
#define LINE_2_MINUS_1 63
#endif
#ifdef LCD_2X16
#define END_LINE_1 15
#define BEGIN_LINE_2 64
#define END_LINE_2 79
#define LINE_2_MINUS_1 63
#endif
#ifdef LCD_2X8
#define END_LINE_1 7
#define BEGIN_LINE_2 64
#define END_LINE_2 71
#define LINE_2_MINUS_1 63
#endif
#ifdef LCD_1X16
#define END_LINE_1 15
#endif

// Delay constants used by LCD routines
#define T_120_US (120 / INT_PERIOD + 1)
#if (T_120_US < 2)
#undef T_120_US
#define T_120_US 2
#endif
#define T_1000_US (1000 / INT_PERIOD + 1)

#define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0))

#define KB_TASK_PERIOD (50000 / INT_PERIOD + 1) //50000 usec = 20 per second
#define KB_DELAY_LOAD 10 //kb checks before repeat
#define KB_REPEAT_RATE 2 // about 10 per second
#define KB_NO_KEY 20 //scankb returns this if no key is pressed

// Receiver states.
enum receiver_state {
RS_HAVE_NOTHING,
RS_WAIT_HALF_A_BIT,
RS_HAVE_STARTBIT,
RS_WAIT_FOR_STOP = RS_HAVE_STARTBIT+8
};

// VARIABLES
static byte sendbuffer; // Where the character to sent is stored.
static byte receivebuffer; // Where the character is stored as it is received.
static bit receivebufferfull; // 1 = receivebuffer is full.

static byte send_bitno;
static byte receivestate; // Initial state of the receiver (0).
static byte skipoversamples; // Used to skip receive samples.
static byte rxshift;
static bit tx_next_bit;

static volatile byte delaycount; //decrements every interrupt if nonzero
static volatile unsigned int kbtaskcount; //decrements every interrupt
static bit kbtaskflag; //goes high when it's time to check the keyboard
byte kbdelaycount; //timer for keypress
byte kbrepeatcount;
byte kboldkey; //last keypress

static bit command_next; //next received character is special lcd data
static byte lcdcommand;
#ifdef LCD_FORMAT
byte cursorpos;
#endif
static byte super_mx_in; //super-multiplexed input PORTB 5 upper bits
static byte super_mx_out; //super-multiplexed output PORTB 5 upper bits


// KEYBOARD LOOKUP TABLES
// Primary keyboard codes
const byte Kb_tbl_pri[] = { 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,
0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,
0x51,0x52,0x53,0x54 };
// Secondary keyboard codes
const byte Kb_tbl_sec[] = { 0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,
0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,
0x71,0x72,0x73,0x74 };
// mode 0: Keydown sends primary code, when held repeats primary code after KB_DELAY_LOAD delay.
// mode 1: Keydown sends primary code. Keyup sends secondary code.
// mode 2: Keyup sends primary code unless held longer than KB_DELAY_LOAD delay, send secondary.
// mode 3: Keyup sends primary code unless held longer than KB_DELAY_LOAD delay, send secondary
// code, if held another KB_DELAY_LOAD will do repeats of secondary code.
// a non-existent mode disables a key
const byte Kb_tbl_mode[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00 }; //must have one extra here

// FUNCTION PROTOTYPES
void init_stuff(void); //sets up interrupt, pins, etc
void rs232_putch(byte c); //puts a byte to serial transmit buffer
byte rs232_getch(void); //gets byte from serial receive buffer
void lcd_clear(void); //clear and home the LCD
void lcd_puts(const byte * s); //put ascii string to LCD
void lcd_putch(byte c); //put one character to LCD
void lcd_goto(byte pos); //positions LCD cursor
void lcd_init(void); //sets up LCD interface
void lcd_putcmd(byte c); //send one byte to LCD command register
void delayMs(byte t); //delays 1 to 255 milliseconds
//void rs232_puts(const byte * s); //put ascii string to serial port, uncomment if you need
byte scankb(void); //returns which key is depressed
void kbrs232(byte key); //normal "keypad to rs232 out" operation
void rs232lcd(byte rec); //sends rs232 received data to LCD or translates if needed
#ifdef LCD_FORMAT
void inc_cursor(void); //increments the LCD cursor past line breaks
void dec_cursor(void); //decrements
#endif

// THE PROGRAM
void main(void) {
init_stuff();
lcd_init();
lcd_clear();
lcd_puts("lcdterm v0.6");
lcd_goto(0x40);
lcd_puts("2000 Bob Blick");
delayMs(250);
delayMs(250);
lcd_clear();

while(1) {
if (receivebufferfull)
{
rs232lcd(rs232_getch());
}

if(kbtaskflag)
{
kbtaskflag = 0;
kbrs232(scankb());
}
} // End of "while(1)"
} // End of "main()"

// THE FUNCTIONS
void init_stuff(void) {
PORTB = 0 | (SUPER_MX_OUT_INIT & 1); //RB0 set to lo bit of super_mx_out
TRISA = 0b00011111; // PORTA inputs.
TRISB = 0b00000000; // PORTB outputs

receivestate = RS_HAVE_NOTHING;
receivebufferfull = 0;
skipoversamples = 1; // check each interrupt for start bit
kbtaskcount = KB_TASK_PERIOD;
kbtaskflag = 0;
kbdelaycount = KB_DELAY_LOAD;
kbrepeatcount = KB_REPEAT_RATE;
kboldkey = KB_NO_KEY;
command_next = 0;
super_mx_out = SUPER_MX_OUT_INIT;
#ifdef LCD_FORMAT
cursorpos = 0;
#endif
/* Set up the timer. */
T0CS = 0; // Set timer mode for Timer0
TMR0 = (2-TIMER_VALUE); // +2 as timer stops for 2 cycles
// when writing to TMR0
T0IE = 1; // Enable the Timer0 interrupt
GIE = 1; // Enable interrupts
}

void rs232_putch(byte c) {
while(send_bitno)
continue;
tx_next_bit = 0;
sendbuffer = c;
send_bitno = TRANSMIT_NUM_BITS*RX_OVERSAMPLE;
}

byte rs232_getch(void) {
while(!receivebufferfull)
continue;
receivebufferfull = 0;
return receivebuffer;
}

/* Interrupt service routine
*
* Transmits and receives characters which have been
* "rs232_putch"ed and "rs232_getch"ed.
*
* This ISR runs BRATE * RX_OVERSAMPLE times per second.
*
*/

interrupt void isr(void) {
TMR0 += -TIMER_VALUE + 2; // +2 as timer stops for 2 cycles when writing to TMR0
T0IF = 0;

/*** RECEIVE ***/
if( --skipoversamples == 0) {
skipoversamples++; // check next time
switch(receivestate) {

case RS_HAVE_NOTHING:
/* Check for start bit of a received char. */
if(RxData){
skipoversamples = RX_BITCENTER;
receivestate++;
}
break;

case RS_WAIT_HALF_A_BIT:
if(RxData) { // valid start bit
skipoversamples = RX_OVERSAMPLE;
receivestate++;
} else
receivestate = RS_HAVE_NOTHING;
break;

// case RS_HAVE_STARTBIT: and subsequent values
default:
rxshift = (rxshift >> 1) | ((!RxData) << 7);
skipoversamples = RX_OVERSAMPLE;
receivestate++;
break;

case RS_WAIT_FOR_STOP:
receivebuffer = rxshift;
receivebufferfull = 1;
receivestate = RS_HAVE_NOTHING;
break;

}
}

/*** TRANSMIT ***/
/* This will be called every RX_OVERSAMPLEth time
* (because the RECEIVE needs to over-sample the incoming data). */

if(send_bitno) {
if((send_bitno & (RX_OVERSAMPLE-1)) == 0) {
TxData = !tx_next_bit; // Send next bit.
tx_next_bit = sendbuffer & 1;
sendbuffer = (sendbuffer >> 1) | 0x80;
}
send_bitno--; //count down until out of bits to send
}

/*** COUNTERS ETC ***/
if(delaycount)
delaycount--;
if(!(--kbtaskcount))
{
kbtaskcount = KB_TASK_PERIOD;
kbtaskflag = 1;
}
}
// END of interrrupt service routine

// LCD ROUTINES FOLLOW

// Clear and home the LCD
void lcd_clear(void) {
lcd_putcmd(0x01);
delayMs(3);
}

// write a string of chars to the LCD
void lcd_puts(const byte * s) {
while(*s)
lcd_putch(*s++);
}

// write one character to the LCD
void lcd_putch(byte c) {
LCD_RS = 1; // write characters
PORTB &= 0x0F;
PORTB |= c & 0xF0;
LCD_STROBE;
PORTB &= 0x0F;
PORTB |= c << 4;
LCD_STROBE;
//only need these next two lines if using super multiplexed outputs
PORTB &= 0b00000111; //drop the 5 upper pins
PORTB |= super_mx_out & 0b11111000; //now raise them according to super_mx_out
delaycount = T_120_US;
while(delaycount);
}


// Go to the specified position
void lcd_goto(byte pos) {
lcd_putcmd(0x80+pos);
}

// initialise the LCD - put into 4 bit mode
void lcd_init(void) {
LCD_RS = 0; // write control bytes
delayMs(50); // power on delay. LCD spec is 15 but some don't make it
PORTB &= 0x0F;
PORTB |= 0x30; //repeat this initialization 3 times
LCD_STROBE;
delayMs(5);
LCD_STROBE;
delaycount = T_120_US;
while(delaycount);
LCD_STROBE;
delayMs(5);
PORTB &= 0x0F;
PORTB |= 0x20; //set 4 bit mode
LCD_STROBE;
delaycount = T_120_US;
while(delaycount);
#ifdef TWOLINE_5X7
lcd_putcmd(0x28); // 4 bit mode, 1/16 duty, 5x7 font
#endif
#ifdef ONELINE_5X7
lcd_putcmd(0x20); // 4 bit mode, 1/8 duty cycle, 5x7 font
#endif
#ifdef ONELINE_5X10
lcd_putcmd(0x24); // 4 bit mode, 1/8 duty cycle, 5x10 font
#endif
lcd_putcmd(0x08); // display off
#ifdef CURSOR_ON_NOBLINK
lcd_putcmd(0x0E); // display on with plain cursor
#endif
#ifdef CURSOR_OFF_BLINK
lcd_putcmd(0x0D); // display on with blink character
#endif
#ifdef CURSOR_OFF_NOBLINK
lcd_putcmd(0x0C); // display on, no cursor
#endif
#ifdef CURSOR_ON_BLINK
lcd_putcmd(0x0F); // display on, cursor, blink character
#endif
lcd_putcmd(0x06); // entry mode = increment cursor, freeze display
}

// Write to a command register of LCD
void lcd_putcmd(byte c) {
LCD_RS = 0;
PORTB &= 0x0F;
PORTB |= c & 0xF0;
LCD_STROBE;
PORTB &= 0x0F;
PORTB |= c << 4;
LCD_STROBE;
//only need these next two lines if using super multiplexed outputs
PORTB &= 0b00000111; //drop the 5 upper pins
PORTB |= super_mx_out & 0b11111000; //now raise them according to super_mx_out
delaycount = T_120_US;
while(delaycount);
}
// End of LCD functions

// Delay a number of milliseconds
void delayMs(byte t) {
do
{
delaycount = T_1000_US;
while(delaycount);
} while(--t);
}
/*
//write a string of characters out the serial port
void rs232_puts(const byte * s) {
while(*s)
rs232_putch(*s++);
}
*/
// Scan the keyboard, return first key found or KB_NO_KEY if none found
// if you change the number of rows or columns, change KB_NO_KEY to reflect it
byte scankb(void) {
byte delay;
byte key = 0; // first key returns 0, no key returns KB_NO_KEY
byte column = 0b00001000; //RB3 is starting column.
//if you reduce columncount it will sequence through fewer columns - ending earlier,
//or starting later if you choose a different start column
byte columncount = 6; // one more than the number of columns
while(--columncount)
{
PORTB &= 0b00000111;
PORTB |= column; //energize column but leave low 3 pins untouched
for (delay = 10; --delay;); //this delay rejects key capacitance
//test each row in sequence
if(RA0)
break;
key++;
//if you don't use all rows just remove
if(RA1)
break;
key++;
//or comment out ones you don't need
if(RA2)
break;
key++;

if(RA3)
break;
key++;

column <<= 1; //shift to left, energize next column
}
// Only need these next 4 lines if using super multiplexed inputs
TRISB = 0b11111000; //prepare to read by making upper 5 bits input
for (delay = 10; --delay;); //now a short delay before reading the pins
super_mx_in = PORTB;
TRISB = 0; //back to all output
// Only need these next 2 lines if using super multiplexed outputs
PORTB &= 0b00000111; //drop all keyboard columns
PORTB |= super_mx_out & 0b11111000; //raise the ones that need raisin'
return key;
}

// Converts raw key codes to rs232 activity. Very versatile, but uses a lot of ROM
// Cutting out only one of the modes saves 50 words.
void kbrs232(byte key) {
byte kb_event_state;
enum kb_event_state {
KBES_NONE, //idle keyboard
KBES_KEYDOWN, //key down occurred
KBES_KEYUP, //key up occurred
KBES_KEYHOLD, //still holding, repeat counter not run out
KBES_KEYREPEAT //repeatcount has run out
};
// Figure out what type of event happened
if(key == KB_NO_KEY) //no keys are down
{
if(kboldkey == KB_NO_KEY)
kb_event_state = KBES_NONE;
else
kb_event_state = KBES_KEYUP;
}
else //yes there is a key down somewhere
{
if(kboldkey == KB_NO_KEY) {
kb_event_state = KBES_KEYDOWN;
kboldkey = key;
}
else
{
if(kbdelaycount) //still counting
kb_event_state = KBES_KEYHOLD;
else //count ran out
kb_event_state = KBES_KEYREPEAT;
}
}
// Each key can have its own programming mode, here are 4 samples
switch(Kb_tbl_mode[kboldkey]) {
case (0): //keydown=primary repeat=primary
switch(kb_event_state) {
case(KBES_NONE):
kbdelaycount = KB_DELAY_LOAD;
kbrepeatcount = 1;
break;
case(KBES_KEYDOWN):
rs232_putch(Kb_tbl_pri[kboldkey]);
break;
case(KBES_KEYUP):
kbdelaycount = KB_DELAY_LOAD;
kbrepeatcount = 1;
kboldkey = KB_NO_KEY;
break;
case(KBES_KEYHOLD):
if(kbdelaycount)
kbdelaycount--; //never go below zero
break;
case(KBES_KEYREPEAT):
if(!(--kbrepeatcount)) {
rs232_putch(Kb_tbl_pri[kboldkey]);
kbrepeatcount = KB_REPEAT_RATE;
}
break;
} break;
case(1): //keydown=primary keyup=secondary
switch(kb_event_state) {
case(KBES_NONE):
kbdelaycount = KB_DELAY_LOAD;
kbrepeatcount = 1;
break;
case(KBES_KEYDOWN):
rs232_putch(Kb_tbl_pri[kboldkey]);
break;
case(KBES_KEYUP):
rs232_putch(Kb_tbl_sec[kboldkey]);
kbdelaycount = KB_DELAY_LOAD;
kbrepeatcount = 1;
kboldkey = KB_NO_KEY;
break;
case(KBES_KEYHOLD):
break;
case(KBES_KEYREPEAT):
break;
} break;
case(2): //keyup=primary keyhold=secondary
switch(kb_event_state) {
case(KBES_NONE):
kbdelaycount = KB_DELAY_LOAD;
kbrepeatcount = 1;
break;
case(KBES_KEYDOWN):

break;
case(KBES_KEYUP):
if(kbdelaycount) {
rs232_putch(Kb_tbl_pri[kboldkey]);
}
kbdelaycount = KB_DELAY_LOAD;
kbrepeatcount = 1;
kboldkey = KB_NO_KEY;
break;
case(KBES_KEYHOLD):
if(kbdelaycount)
kbdelaycount--; //never go below zero
break;
case(KBES_KEYREPEAT): // use kbrepeatcount to
if(kbrepeatcount) { // insure this only happens once
kbrepeatcount = 0;
rs232_putch(Kb_tbl_sec[kboldkey]);
}
break;
} break;
case(3): //keyup=primary keyrepeat=secondary
switch(kb_event_state) {
case(KBES_NONE):
kbdelaycount = KB_DELAY_LOAD;
kbrepeatcount = 1;
break;
case(KBES_KEYDOWN):
kbrepeatcount = KB_DELAY_LOAD; // first repeat has long delay
break;
case(KBES_KEYUP):
if(kbdelaycount) {
rs232_putch(Kb_tbl_pri[kboldkey]);
}
kbdelaycount = KB_DELAY_LOAD;
kbrepeatcount = 1;
kboldkey = KB_NO_KEY;
break;
case(KBES_KEYHOLD):
if(kbdelaycount)
kbdelaycount--; //never go below zero
break;
case(KBES_KEYREPEAT):
if(kbrepeatcount==KB_DELAY_LOAD) { // immediately send
rs232_putch(Kb_tbl_sec[kboldkey]);
}
if(!(--kbrepeatcount)) { //then long wait until repeats
rs232_putch(Kb_tbl_sec[kboldkey]);
kbrepeatcount = KB_REPEAT_RATE;
}
break;
} break;
default:
kboldkey = KB_NO_KEY;
break;
}
}

// Sends rs232 received data to LCD or translates if needed
// Certain commands require a second byte for data, uses command_next as flag.
void rs232lcd(byte rec) {
if (command_next) { // extended commands, this is the data byte
command_next = 0;
switch (lcdcommand) {
case(0x01): // control-A, cursor move to
lcd_goto(rec);
#ifdef LCD_FORMAT
cursorpos = rec;
#endif
return;
case(0x10): // control-P, to multiplexed output
super_mx_out = rec;
if(rec & 1) //lo bit set
RB0 = 1; //make RB0 follow
else
RB0 = 0;
return;
case(0x12): // control-R, direct LCD command
lcd_putcmd(rec);
return;
case(0x14): // control-T, direct LCD data
lcd_putch(rec);
return;
default:
break;
}
}

if(rec < 0x20) {
switch(rec) {
case (0x02): //control-B, cursor left
lcd_putcmd(0x10); //move cursor left
#ifdef LCD_FORMAT
dec_cursor();
#endif
break;
case (0x03): //control-C
lcd_clear(); //clear the LCD
#ifdef LCD_FORMAT
cursorpos = 0;
#endif
break;
case (0x06): //control-F, cursor right
lcd_putcmd(0x14); //move cursor right
#ifdef LCD_FORMAT
inc_cursor;
#endif
break;
case (0x08): //control-H, backspace
lcd_putcmd(0x10); //left
#ifdef LCD_FORMAT
dec_cursor();
#endif
lcd_putch(0x20); //space
#ifdef LCD_FORMAT
inc_cursor();
#endif
lcd_putcmd(0x10); //left
#ifdef LCD_FORMAT
dec_cursor();
#endif
break;
case (0x0A): //control-J, line feed
case (0x0D): //control-M, carriage return
lcd_goto(0); //home position
#ifdef LCD_FORMAT
cursorpos = 0;
#endif
break;
case (0x0E): // control-N, send multiplexed inputs out rs232
rs232_putch(super_mx_in);
break;
default: //codes not listed can use next byte as data
command_next = 1;
lcdcommand = rec;
break;
}
}
else {
if((rec >= 0x80) && (rec < 0xA0)) { //remapping from empty area
rec &= 0x07; //to custom character area
}
#ifdef DESCENDERS
if(rec==0x67 || rec==0x6A || rec==0x70 || rec==0x71 || rec==0x79)
rec += 0x80;
#endif
lcd_putch(rec);
#ifdef LCD_FORMAT
inc_cursor();
#endif
}
}

#if defined LCD_4X20
void inc_cursor(void) {
cursorpos++;
switch(cursorpos) {
case (END_LINE_1 + 1):
cursorpos = BEGIN_LINE_2;
lcd_goto(cursorpos);
break;
case (END_LINE_2 + 1):
cursorpos = BEGIN_LINE_3;
lcd_goto(cursorpos);
break;
case (END_LINE_3 + 1):
cursorpos = BEGIN_LINE_4;
lcd_goto(cursorpos);
break;
case (END_LINE_4 + 1):
cursorpos = BEGIN_LINE_1;
lcd_goto(cursorpos);
break;
}
}
#elif defined LCD_2X8 || defined LCD_2X16 || defined LCD_2X20
void inc_cursor(void) {
cursorpos++;
switch(cursorpos) {
case (END_LINE_1 + 1):
cursorpos = BEGIN_LINE_2;
lcd_goto(cursorpos);
break;
case (END_LINE_2 + 1):
cursorpos = BEGIN_LINE_1;
lcd_goto(cursorpos);
break;
}
}
#elif defined LCD_1X16
void inc_cursor(void) {
cursorpos++;
switch(cursorpos) {
case (END_LINE_1 + 1):
cursorpos = BEGIN_LINE_1;
lcd_goto(cursorpos);
break;
}
}
#endif


#if defined LCD_4X20
void dec_cursor(void) {
cursorpos--;
switch(cursorpos) {
case (LINE_1_MINUS_1):
cursorpos = END_LINE_4;
lcd_goto(cursorpos);
break;
case (LINE_2_MINUS_1):
cursorpos = END_LINE_1;
lcd_goto(cursorpos);
break;
case (LINE_3_MINUS_1):
cursorpos = END_LINE_2;
lcd_goto(cursorpos);
break;
case LINE_4_MINUS_1:
cursorpos = END_LINE_3;
lcd_goto(cursorpos);
break;
}
}
#elif defined LCD_2X8 || defined LCD_2X16 || defined LCD_2X20
void dec_cursor(void) {
cursorpos--;
switch(cursorpos) {
case (LINE_1_MINUS_1):
cursorpos = END_LINE_2;
lcd_goto(cursorpos);
break;
case (LINE_2_MINUS_1):
cursorpos = END_LINE_1;
lcd_goto(cursorpos);
break;
}
}
#elif defined LCD_1X16
void dec_cursor(void) {
cursorpos--;
switch(cursorpos) {
case (LINE_1_MINUS_1):
cursorpos = END_LINE_1;
lcd_goto(cursorpos);
break;
}
}
#endif
//END ALL
Pradėti naują temą  Atsakyti į pranešimą
 
Forumo sistema: phpBB
 „Google“ paieška forume
 Kas naujesnio?
 Naujos temos forume

Global electronic components distributor – Allicdata Electronics

Electronic component supply – „Eurodis Electronics“

LOKMITA – įvairi matavimo, testavimo, analizės ir litavimo produkcija

Full feature custom PCB prototype service

Sveiki ir ekologiški maisto produktai

Mokslo festivalis „Erdvėlaivis Žemė

LTV.LT - lietuviškų tinklalapių vitrina

„Konstanta 42“

„Mokslo sriuba“

www.matuok.lt - Interneto spartos matavimo sistema

Programuotojas Tautvydas – interneto svetainių-sistemų kūrimas

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

Draugiškas internetas

FS25 Tractors
Farming Simulator 25 Mods, FS25 Maps, FS25 Trucks
ETS2 Mods
ETS2 Trucks, ETS2 Bus, Euro Truck Simulator 2 Mods
FS22 Tractors
Farming Simulator 22 Mods, FS22 Maps, FS25 Mods
VAT calculator
VAT number check, What is VAT, How much is VAT
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija
FS25 Mods
FS25 Maps, FS25 Cheats, FS25 Install Mods
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps
ATS Trailers
American Truck Simulator Mods, ATS Trucks, ATS Maps
Fun football drills
Football Training Equipment, Defending drills football, Kids football training kit
Reklama
‡ 1999– © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Turinys | Reklama | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina
Ets2 mods, Ats mods, Beamng drive mods
allmods.net
„MokslasPlius“ – mokslui skirtų svetainių portalas
www.mokslasplius.lt
Optical filters, UV optics, electro optical crystals
www.eksmaoptics.com
LTV.LT – lietuviškų tinklalapių vitrina
www.ltv.lt/technologijos/
Elektroninių parduotuvių optimizavimas „Google“ paieškos sistemai
www.seospiders.lt
Mokslo festivalis „Erdvėlaivis žemė“
www.mokslofestivalis.eu
Reklama


Reklama