/Modules/HumanInterfaces/nanoterm02A/SW/nanoterm02A/lcd.c |
---|
0,0 → 1,145 |
/* mija 2008 |
source file for lcd HITACHI 16x2,8x2,... |
!!! must be set PINs,PORTs,DDR in lcd.h |
ver.: 0.0 TESTED |
*/ |
#include <avr/io.h> |
#include <util/delay.h> |
#include <avr/pgmspace.h> |
#include "lcd.h" |
#include <stdio.h> |
//************************************************************* |
#define H_D0 PORT_D0 |=_BV(PIN_D0) |
#define L_D0 PORT_D0 &= ~(_BV(PIN_D0)) |
#define H_D1 PORT_D1 |=_BV(PIN_D1) |
#define L_D1 PORT_D1 &= ~(_BV(PIN_D1)) |
#define H_D2 PORT_D2 |=_BV(PIN_D2) |
#define L_D2 PORT_D2 &= ~(_BV(PIN_D2)) |
#define H_D3 PORT_D3 |=_BV(PIN_D3) |
#define L_D3 PORT_D3 &= ~(_BV(PIN_D3)) |
#define H_E PORT_E |=_BV(PIN_E) |
#define L_E PORT_E &= ~(_BV(PIN_E)) |
#define H_RS PORT_RS |=_BV(PIN_RS) |
#define L_RS PORT_RS &= ~(_BV(PIN_RS)) |
//************************************************************* |
// Definice konstant pro LCD display |
// |
#define LCD_CURSOR_ON_ 0x0E // kurzor jako blikajici radka pod znakem |
#define LCD_CURSOR_OFF_ 0x0C // zadny kurzor |
#define LCD_LINE_2 0x40 // adresa 1. znaku 2. radky |
// Definice rezimu LCD displeje |
// |
uint8_t PROGMEM LCD_INIT_STRING[4] = |
{ |
0x28, // intrfejs 4 bity, 2 radky, font 5x7 |
LCD_CURSOR_OFF_, // display on, kurzor off, |
0x01, // clear displeje |
0x06 // inkrement pozice kurzoru (posun kurzoru doprava) |
}; |
void LCD_init_IO_PIN(void) |
{ |
DDR_D0 |= _BV(PIN_D0); |
DDR_D1 |= _BV(PIN_D1); |
DDR_D2 |= _BV(PIN_D2); |
DDR_D3 |= _BV(PIN_D3); |
DDR_E |= _BV(PIN_E); |
DDR_RS |= _BV(PIN_RS); |
} |
void LCD_init(void) |
{ |
uint8_t a; |
LCD_init_IO_PIN(); |
_delay_ms(20); |
L_E; |
L_RS; |
for (a=0;a<3;a++) |
{ |
_delay_ms(2); |
LCD_send_nibble(0x3); |
} |
_delay_us(40); |
LCD_send_nibble(0x2); |
_delay_us(40); |
for (a=0;a<3;a++) |
{ |
LCD_send_command(pgm_read_byte(&(LCD_INIT_STRING[a]))); |
_delay_ms(2); |
} |
} |
void LCD_putc(uint8_t data) |
{ |
LCD_send_data(data); |
} |
void LCD_send_command(uint8_t data) |
{ |
L_RS; |
LCD_send(data); |
H_RS; |
} |
void LCD_send_data(uint8_t data) |
{ |
H_RS; |
LCD_send(data); |
} |
void LCD_send(uint8_t data) |
{ |
LCD_send_nibble(data >> 4); |
LCD_send_nibble(data); |
_delay_us(40); |
} |
void LCD_send_nibble(uint8_t data) |
{ |
L_D0;L_D1;L_D2;L_D3; |
if (data & 0x1) H_D0; |
if (data & 0x2) H_D1; |
if (data & 0x4) H_D2; |
if (data & 0x8) H_D3; |
H_E; |
_delay_us(1); |
L_E; |
} |
void LCD_clear(void) |
{ |
LCD_send_command(1); |
_delay_ms(2); |
} |
void LCD_gotoxy( uint8_t x, uint8_t y) |
{ |
uint8_t Adr; |
Adr=x-1; |
if(y==2) |
Adr+=LCD_LINE_2; |
LCD_send_command(0x80|Adr); |
} |
/Modules/HumanInterfaces/nanoterm02A/SW/nanoterm02A/lcd.h |
---|
0,0 → 1,58 |
/* mija 2008 |
*.h file for defines lcd.c |
data PIN_D0 |
PIN_D1 |
PIN_D2 |
PIN_D3 |
write PIN_E |
commamnd/data PIN_RS |
!!!!NOTE must be set PIN with PORT and DDR |
*/ |
//************************************************************* |
#define PIN_D0 PD2 |
#define PORT_D0 PORTD |
#define DDR_D0 DDRD |
#define PIN_D1 PD3 |
#define PORT_D1 PORTD |
#define DDR_D1 DDRD |
#define PIN_D2 PD4 |
#define PORT_D2 PORTD |
#define DDR_D2 DDRD |
#define PIN_D3 PD5 |
#define PORT_D3 PORTD |
#define DDR_D3 DDRD |
#define PIN_E PA0 |
#define PORT_E PORTA |
#define DDR_E DDRA |
#define PIN_RS PA1 |
#define PORT_RS PORTA |
#define DDR_RS DDRA |
//************************************************************* |
void LCD_init(void); |
void LCD_putc(uint8_t data); |
void LCD_gotoxy( uint8_t x, uint8_t y); |
void LCD_clear(void); |
void LCD_send_data(uint8_t data); |
void LCD_send_command(uint8_t data); |
void LCD_send(uint8_t data); |
void LCD_send_nibble(uint8_t data); |
void LCD_init_IO_PIN(void); |
//************************************************************* |
/Modules/HumanInterfaces/nanoterm02A/SW/nanoterm02A/nanoterm02A.c |
---|
0,0 → 1,376 |
/* mija 2008 |
nanotern02A |
f osc 1Mhz |
timer1 PWM |
ver.: 1.0 |
/n .. goto 1,1 |
/r .. goto 1,2 |
/f .. clear lcd |
*/ |
//************************************************************* |
#include <avr/io.h> |
#include <util/delay.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
//#include <avr/sleep.h> |
#include "lcd.h" |
//************************************************************* |
void line_feed(void); |
void PWM_init(void); |
void COMP_init(void); |
ISR(ANA_COMP_vect); |
int main(void); |
//************************************************************* |
#define TEXT1 "setup" |
#define MAX_BUF 16 |
#define FIRST 40 // *16ms time next key |
#define REPEAT 10 // *16ms time repeat key |
#define LIGHT PB5 // tlacitko A |
#define PORT_LIGHT PORTB // nutne definovat PORT,DDR,PIN |
#define DDR_LIGHT DDRB |
#define TL_A PD6 // tlacitko A |
#define PORT_A PORTD // nutne definovat PORT,DDR,PIN |
#define DDR_A DDRD |
#define PIN_A PIND |
#define TL_B PB0 // tlacitko B |
#define PORT_B PORTB // nutne definovat PORT,DDR,PIN |
#define DDR_B DDRB |
#define PIN_B PINB |
#define TL_C PB2 // tlacitko C |
#define PORT_C PORTB // nutne definovat PORT,DDR,PIN |
#define DDR_C DDRB |
#define PIN_C PINB |
#define TL_D PD3 // tlacitko D |
#define PORT_D PORTB // nutne definovat PORT,DDR,PIN |
#define DDR_D DDRB |
#define PIN_D PINB |
// eeprom |
#define EE_SETUP 0x03 |
#define EE_VOLTAGE_LO 0x00 |
#define EE_VOLTAGE_HI 0x01 |
// key |
#define KEY_0 0x8 |
#define KEY_1 0xC |
#define KEY_2 0xE |
#define KEY_3 0x4 |
#define KEY_4 0x6 |
#define KEY_5 0x7 |
#define KEY_6 0xA |
#define KEY_7 0x2 |
#define KEY_8 0x3 |
#define KEY_9 0xB |
#define KEY_cr 0x1 |
#define KEY_esc 0x9 |
//interni |
#define A_INPUT (!(PIN_A & _BV(TL_A))) |
#define A_PULLUP (PORT_A |= _BV(TL_A)) |
#define A_INIT (DDR_A &= ~(_BV(TL_A))) |
#define B_INPUT (!(PIN_B & _BV(TL_B))) |
#define B_PULLUP (PORT_B |= _BV(TL_B)) |
#define B_INIT (DDR_B &= ~(_BV(TL_B))) |
#define C_INPUT (!(PIN_C & _BV(TL_C))) |
#define C_PULLUP (PORT_C |= _BV(TL_C)) |
#define C_INIT (DDR_C &= ~(_BV(TL_C))) |
#define D_INPUT (!(PIN_D & _BV(TL_D))) |
#define D_PULLUP (PORT_D |= _BV(TL_D)) |
#define D_INIT (DDR_D &= ~(_BV(TL_D))) |
#define LIGHT_ON (PORT_LIGHT |= _BV(LIGHT)) |
#define LIGHT_OFF (PORT_LIGHT &= ~(_BV(LIGHT))) |
#define LIGHT_INIT (DDR_LIGHT |= _BV(LIGHT)) |
//flag |
volatile uint8_t flag; |
#define KEY_A 0 |
#define KEY_B 1 |
#define KEY_C 2 |
#define KEY_D 3 |
#define VOLTAGE 4 |
#define LIGHT_SET 5 |
#define LIGHT_T0 6 |
#define LIGHT_T1 7 |
#define FLAG_A_SET (flag |= _BV(KEY_A)) |
#define FLAG_A_CLR (flag &= ~(_BV(KEY_A))) |
#define FLAG_A (flag & _BV(KEY_A)) |
#define FLAG_B_SET (flag |= _BV(KEY_B)) |
#define FLAG_B_CLR (flag &= ~(_BV(KEY_B))) |
#define FLAG_B (flag & _BV(KEY_B)) |
#define FLAG_C_SET (flag |= _BV(KEY_C)) |
#define FLAG_C_CLR (flag &= ~(_BV(KEY_C))) |
#define FLAG_C (flag & _BV(KEY_C)) |
#define FLAG_D_SET (flag |= _BV(KEY_D)) |
#define FLAG_D_CLR (flag &= ~(_BV(KEY_D))) |
#define FLAG_D (flag & _BV(KEY_D)) |
#define FLAG_VOLTAGE_HI (flag |= _BV(VOLTAGE)) |
#define FLAG_VOLTAGE_LO (flag &= ~(_BV(VOLTAGE))) |
#define FLAG_VOLTAGE (flag & (_BV(VOLTAGE))) |
#define FLAG_LIGHT_ON (flag |= _BV(LIGHT_SET)) |
#define FLAG_LIGHT_OFF (flag &= ~(_BV(LIGHT_SET))) |
#define FLAG_LIGHT (flag & _BV(LIGHT_SET)) |
#define FLAG_T0_SET (flag |= _BV(LIGHT_T0)) |
#define FLAG_T0_CLR (flag &= ~(_BV(LIGHT_T0))) |
#define FLAG_T0 (flag & _BV(LIGHT_T0)) |
#define FLAG_T1_SET (flag |= _BV(LIGHT_T1)) |
#define FLAG_T1_CLR (flag &= ~(_BV(LIGHT_T1))) |
#define FLAG_T1 (flag & _BV(LIGHT_T1)) |
//************************************************************* |
uint8_t a,pos; |
//uint8_t buf[8] = TEXT1; |
uint8_t buf_rx[MAX_BUF]; |
volatile uint8_t rx_shift; |
volatile uint8_t tik16ms; |
uint8_t lcd_shift; |
enum {LED_OFF,LED_5s,LED_10s,LED_15s,LED_20s,LED_25s,LED_30s,LED_ON}; |
//************************************************************* |
void IO_init(void) |
{ |
LIGHT_INIT; |
A_PULLUP; |
B_PULLUP; |
C_PULLUP; |
D_PULLUP; |
} |
void rs232_init(void) |
{ |
//set baud rate fixed 9600 8N1 for fosc 1Mhz |
UCSRA = _BV(U2X) ; |
UBRRL = 12; |
UCSRB = _BV(RXEN) | _BV(TXEN) | _BV(RXCIE); |
} |
void PWM_init(void) |
{ |
TCNT1 = 0; |
OCR1B = 0x1; |
DDRB |= _BV(PB4); |
TCCR1A |= _BV(COM1B1) | _BV(WGM10); |
TCCR1B |= _BV(WGM12) | _BV(CS10); |
} |
void PWM_set(void) |
{ |
if (ACSR & _BV(ACO)) |
{ |
//OCR1BL = 0x5f; |
OCR1BL = eeprom_read_byte(EE_VOLTAGE_LO); |
FLAG_VOLTAGE_LO; |
} |
else |
{ |
//OCR1BL = 0x17; |
OCR1BL = eeprom_read_byte(EE_VOLTAGE_HI); |
FLAG_VOLTAGE_HI; |
} |
} |
void COMP_init(void) |
{ |
ACSR = _BV(ACBG) | _BV(ACIE); |
DIDR = _BV(AIN1D); |
} |
void timer0_init(void) |
{ |
TCCR0B = _BV(CS01) | _BV(CS00); |
TIMSK |= _BV(TOIE0); |
} |
ISR(TIMER0_OVF_vect) //cca 16ms tik |
{ |
if (A_INPUT) FLAG_A_SET;else FLAG_A_CLR; |
if (B_INPUT) FLAG_B_SET;else FLAG_B_CLR; |
if (C_INPUT) FLAG_C_SET;else FLAG_C_CLR; |
if (D_INPUT) FLAG_D_SET;else FLAG_D_CLR; |
if (FLAG_LIGHT) LIGHT_ON; |
else LIGHT_OFF; |
if (tik16ms) tik16ms--; |
} |
ISR(USART_RX_vect) |
{ |
//while ( !(UCSRA & (_BV(RXC))) ); |
if (++rx_shift >= MAX_BUF) rx_shift = 0; |
buf_rx[rx_shift]=UDR; |
} |
ISR(ANA_COMP_vect) |
{ |
//if (ACSR & _BV(ACO)) OCR1BL = 0x5f; |
//else OCR1BL = 0x17; |
PWM_set(); |
} |
void put(char data) |
{ |
while (!( UCSRA & _BV(UDRE))); |
UDR = data; |
} |
void send(uint8_t data) |
{ |
switch (data) |
{ |
case (KEY_0): put('0');break; |
case (KEY_1): put('1');break; |
case (KEY_2): put('2');break; |
case (KEY_3): put('3');break; |
case (KEY_4): put('4');break; |
case (KEY_5): put('5');break; |
case (KEY_6): put('6');break; |
case (KEY_7): put('7');break; |
case (KEY_8): put('8');break; |
case (KEY_9): put('9');break; |
case (KEY_cr): put('\n');break; |
case (KEY_esc): put('\f');break; |
} |
} |
void delay_ms(uint8_t time) |
{ |
while (time--) _delay_ms(1); |
} |
void print_lcd(char *data) |
{ |
while (*data) LCD_putc(*data++); |
} |
void set(void) |
{ |
LCD_gotoxy(1,1); |
print_lcd("con. 0/1"); |
LCD_gotoxy(1,2); |
print_lcd(" led 2-9"); |
while (A_INPUT); |
for(;;) |
{ |
switch (flag & 0x0f) |
{ |
case KEY_0: OCR1BL--;break; |
case KEY_1: OCR1BL++;break; |
case KEY_2: LIGHT_OFF;FLAG_LIGHT_OFF;break; |
case KEY_3: LIGHT_ON;FLAG_LIGHT_ON;break; |
case KEY_4: break; |
case KEY_esc: |
{ |
eeprom_write_byte(EE_SETUP,flag & 0xF0); |
if (FLAG_VOLTAGE) eeprom_write_byte(EE_VOLTAGE_HI,OCR1BL); |
else eeprom_write_byte(EE_VOLTAGE_LO,OCR1BL); |
return; |
} |
} |
delay_ms(50); |
} |
} |
int main(void) |
{ |
uint8_t save_flag; |
IO_init(); |
LCD_init(); |
rs232_init(); |
PWM_init(); |
COMP_init(); |
timer0_init(); |
LIGHT_OFF; |
print_lcd(TEXT1); |
LCD_gotoxy(1,2); |
print_lcd("cr+reset"); |
LCD_gotoxy(1,1); |
flag = 0xfE0 & eeprom_read_byte(EE_SETUP); |
sei(); |
if (A_INPUT) set(); |
pos=0; |
rx_shift=0; |
lcd_shift=0; |
save_flag=0; |
for(;;) |
{ |
if (rx_shift != lcd_shift ) |
{ |
if (++lcd_shift >= MAX_BUF) lcd_shift = 0; |
a=buf_rx[lcd_shift]; |
switch (a) |
{ |
case ('\n'): LCD_gotoxy(1,1);pos=0;break; |
case ('\r'): pos=8;break; |
case ('\f'): LCD_clear();pos=0;break; |
default :if(pos == 8) |
{ |
LCD_gotoxy(1,2); |
//delay_ms(10); |
} |
LCD_putc(a); |
if (++pos > 15) |
{ |
pos = 0; |
LCD_gotoxy(1,1); |
//delay_ms(10); |
} |
} |
} |
if (flag & 0x0F) |
{ |
if ((flag & 0x0F) != save_flag) |
{ |
save_flag = flag & 0x0F; |
send(save_flag); |
tik16ms=FIRST; |
} |
else |
{ |
if (!tik16ms) |
{ |
send(save_flag); |
tik16ms = REPEAT; |
} |
} |
} |
else save_flag = 0; |
} |
return 0; |
} |
/Modules/HumanInterfaces/nanoterm02A/SW/nanoterm02A/nanoterm02A.hex |
---|
0,0 → 1,96 |
:1000000022C03BC03AC039C038C037C077C0C6C074 |
:1000100034C033C0E8C031C030C02FC02EC02DC0A6 |
:100020002CC02BC02AC030C126C128C118C131C183 |
:1000300019C11BC10BC12BC11BC123C10AC129C1DD |
:100040000BC1280C010611241FBECFEDCDBF10E05F |
:10005000A0E6B0E0ECEBF5E003C0C89531960D9258 |
:10006000A238B107D1F710E0A2E8B0E001C01D92BC |
:10007000A839B107E1F77FD1A0C2C2CFBD9A969A45 |
:10008000C09AC29AC39A089582E08BB98CE089B96C |
:1000900088E98AB908951DBC1CBC81E090E099BD37 |
:1000A00088BDBC9A8FB581628FBD8EB589608EBDCB |
:1000B0000895459B0CC0A0E0B0E06BD2802D99273D |
:1000C00088BD809194008F7E809394000895A1E074 |
:1000D000B0E05FD2802D992788BD80919400806127 |
:1000E00080939400089588E488B982E081B90895E6 |
:1000F00083E083BF89B7826089BF08951F920F9202 |
:100100000FB60F9211248F93869906C080919400A8 |
:1001100081608093940005C0809194008E7F8093CD |
:100120009400B09906C080919400826080939400FE |
:1001300005C0809194008D7F80939400B29906C091 |
:100140008091940084608093940005C08091940015 |
:100150008B7F80939400B39906C08091940088604F |
:100160008093940005C080919400877F80939400D1 |
:100170008091940085FF02C0C59A01C0C598809106 |
:100180009500882329F080919500815080939500F7 |
:100190008F910F900FBE0F901F9018951F920F9286 |
:1001A0000FB60F9211248F939F93EF93FF9380913B |
:1001B00096008F5F8093960080919600803110F0BA |
:1001C00010929600809196009CB1E2E8F0E0E80F72 |
:1001D000F11D9083FF91EF919F918F910F900FBE32 |
:1001E0000F901F9018951F920F920FB60F92112427 |
:1001F0002F933F934F935F936F937F938F939F932F |
:10020000AF93BF93EF93FF9354DFFF91EF91BF91B3 |
:10021000AF919F918F917F916F915F914F913F919E |
:100220002F910F900FBE0F901F9018955D9BFECFE2 |
:100230008CB908959927AA27BB27F92FE82F319762 |
:10024000EE30F10530F5ED5EFF4F099480E3EEDF0F |
:10025000089581E3EBDF089582E3E8DF089583E307 |
:10026000E5DF089584E3E2DF089585E3DFDF0895A5 |
:1002700086E3DCDF089587E3D9DF089588E3D6DFDE |
:10028000089589E3D3DF08958AE0D0DF08958CE0F4 |
:10029000CDDF0895282F21502F3F41F0EAEFF0E005 |
:1002A0008E2F9F2F0197F1F72150D0F70895CF930C |
:1002B000DF93D92FC82F8881882329F0219612D166 |
:1002C00088818823D9F7DF91CF91089561E081E09B |
:1002D00016D180E690E0EBDF62E081E010D189E6A4 |
:1002E00090E0E5DF869BFECF8091940099278F7088 |
:1002F00090708930910529F18A30910534F4843069 |
:100300009105C1F00897A1F506C08C30910539F030 |
:100310000E9771F508C088B5815088BD29C088B591 |
:100320008F5F88BD25C0C598809194008F7D809394 |
:1003300094001EC0C59A80919400806280939400BE |
:1003400017C080919400807FA3E0B0E0082E29D1EF |
:100350008091940084FF06C088B5A1E0B0E0082E2B |
:1003600020D1089588B5A0E0B0E0082E1AD10895F4 |
:1003700082E390DFB9CF1F9381DEC8D085DE8BDEAC |
:10038000B2DEB6DEC59882E790E091DF62E081E000 |
:10039000B6D088E790E08BDF61E081E0B0D0A3E0E9 |
:1003A000B0E0F7D0802D807E809394007894869B77 |
:1003B0008DDF10929200109296001092930010E040 |
:1003C00001C010E080919600909193008917D1F1BF |
:1003D000892F8F5F80939300803110F010929300EB |
:1003E000E0919300FF27EE57FF4FE081E0939700E5 |
:1003F000EC3071F0ED3041F0EA3071F461E081E011 |
:100400007ED0109292001EC088E0809392001AC0A5 |
:100410006FD01092920016C080919200883019F42B |
:1004200062E081E06CD0809197005CD08091920076 |
:100430008F5F80939200803128F01092920061E0EB |
:1004400081E05DD08091940099278F709070892B06 |
:1004500009F4B7CF8091940099278F709070212F65 |
:1004600033278217930751F080919400182F1F7043 |
:10047000812FE0DE88E280939500A4CF80919500E3 |
:10048000882309F09FCF812FD5DE8AE080939500E5 |
:1004900099CF8A9A8B9A8C9A8D9AD09AD19A0895EC |
:1004A0009298939894989598992780FD929A81FDB7 |
:1004B000939A82FD949A83FD959AD89A81E08A95C1 |
:1004C000F1F7D89808951F93182F82958F70E8DF61 |
:1004D000812FE6DF8DE08A95F1F71F910895D99A73 |
:1004E000F2DF0895FCDF0895D998EDDFD99A0895D9 |
:1004F00081E0FADF84EF91E00197F1F708958150F0 |
:10050000623009F4805C8068EFDF0895EF92FF921B |
:100510000F931F93CF93DF93BCDF88E893E101979C |
:10052000F1F7D898D99810E0C4EFD1E08C2F9D2F27 |
:100530000197F1F783E0B4DF1F5F1330B9F71DE0D7 |
:10054000812F8A95F1F782E0ABDF1A95F1F782E40B |
:1005500090E0D92FC82F0F2EF4EFEF2EF1E0FF2EF1 |
:10056000F02D082F192F0D5F1F4FFD2FEC2FC89571 |
:10057000802DBADF9F2D8E2D0197F1F721960C1754 |
:100580001D0799F7DF91CF911F910F91FF90EF9089 |
:100590000895E199FECFBFBBAEBBE09A11960DB2B4 |
:1005A0000895E199FECFBFBBAEBB0DBA11960FB651 |
:0C05B000F894E29AE19A0FBE0895FFCF84 |
:1005BC00636F6E2E20302F3100206C656420322D3D |
:1005CC00390073657475700063722B726573657492 |
:0205DC0000001D |
:00000001FF |