First commit
This commit is contained in:
commit
8749f5e3a9
38
learning/comparator_led_interrupt.c
Normal file
38
learning/comparator_led_interrupt.c
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
volatile uint8_t current_led = 3;
|
||||||
|
volatile uint8_t reverse = 0;
|
||||||
|
|
||||||
|
ISR(ANALOG_COMP_vect){
|
||||||
|
uint8_t next = current_led + 1;
|
||||||
|
if (next > 3){
|
||||||
|
next = 0;
|
||||||
|
reverse = (reverse + 1) % 2;
|
||||||
|
}
|
||||||
|
if (!reverse){
|
||||||
|
PORTC |= (1<<next);
|
||||||
|
}else{
|
||||||
|
PORTC &= ~(1<<next);
|
||||||
|
}
|
||||||
|
|
||||||
|
current_led = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void){
|
||||||
|
// ustawienie C0-C3 jako wyjscie
|
||||||
|
DDRC |= 0b00001111;
|
||||||
|
|
||||||
|
// wylaczenie interrupow
|
||||||
|
cli();
|
||||||
|
|
||||||
|
// wlaczenie interrupu na komparator
|
||||||
|
ACSR |= (1<<ACIE);
|
||||||
|
|
||||||
|
// wlaczenie interrupow
|
||||||
|
sei();
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
46
learning/comparator_led_state.c
Normal file
46
learning/comparator_led_state.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
volatile uint8_t current_led = 3;
|
||||||
|
|
||||||
|
// czyscimy czy zapalamy
|
||||||
|
volatile uint8_t reverse = 0;
|
||||||
|
|
||||||
|
void update_led(){
|
||||||
|
// przesuwamy wybrany led
|
||||||
|
uint8_t next = current_led + 1;
|
||||||
|
if (next > 3){
|
||||||
|
next = 0;
|
||||||
|
reverse = (reverse + 1) % 2;
|
||||||
|
}
|
||||||
|
if (!reverse){
|
||||||
|
// zapalamy kolejna
|
||||||
|
PORTC |= (1<<next);
|
||||||
|
}else{
|
||||||
|
// gasimy kolejna
|
||||||
|
PORTC &= ~(1<<next);
|
||||||
|
}
|
||||||
|
|
||||||
|
current_led = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void){
|
||||||
|
// ustawienie C0-C3 jako wyjscie
|
||||||
|
DDRC |= 0b00001111;
|
||||||
|
|
||||||
|
uint8_t last_state = ACSR & (1<<ACO);
|
||||||
|
for(;;){
|
||||||
|
// pobieramy stan komparatora
|
||||||
|
uint8_t comparator_state = ACSR & (1<<ACO);
|
||||||
|
|
||||||
|
// jesli stan sie zmienil na wysoki to przesun ledy
|
||||||
|
if (comparator_state != last_state && last_state == 0){
|
||||||
|
update_led();
|
||||||
|
}
|
||||||
|
|
||||||
|
// zaktualizuj ostatni stan
|
||||||
|
last_state = comparator_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
35
lectures/Comparator/interrupt+state.c
Normal file
35
lectures/Comparator/interrupt+state.c
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include<avr/io.h>
|
||||||
|
#include<avr/interrupt.h>
|
||||||
|
|
||||||
|
volatile uint8_t dioda = 0;
|
||||||
|
|
||||||
|
// Przerwanie ktore wykonuje sie przy zmianie stanu kompratora
|
||||||
|
ISR(ANALOG_COMP_vect) {
|
||||||
|
if(dioda == 0) dioda = 1;
|
||||||
|
else dioda = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
// Ustawienie portu C0 i C1 jako wyjscie
|
||||||
|
DDRC |= (1<<PC0) | (1<<PC1);
|
||||||
|
|
||||||
|
// Wlaczenie interrupt na toggle stanu komparatora
|
||||||
|
cli();
|
||||||
|
ACSR |= (1<<ACIE);
|
||||||
|
sei();
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
// Zmiana na bezposrednie zczytanie stanu
|
||||||
|
// B2 - AIN0
|
||||||
|
// B3 - AIN1
|
||||||
|
uint8_t AIN0_wieksze_od_AIN1 = ACSR & (1<<ACO);
|
||||||
|
if(AIN0_wieksze_od_AIN1) PORTC |= (1<<PC0);
|
||||||
|
else PORTC &= ~(1<<PC0);
|
||||||
|
|
||||||
|
// Zmiana na interrupt
|
||||||
|
if(dioda == 0) PORTC &= ~(1<<PC1);
|
||||||
|
else PORTC |= (1<<PC1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
590
lectures/LCD_lib/HD44780.c
Normal file
590
lectures/LCD_lib/HD44780.c
Normal file
@ -0,0 +1,590 @@
|
|||||||
|
#include "HD44780.h"
|
||||||
|
|
||||||
|
//----- Auxiliary data --------------------------//
|
||||||
|
#define _Byte2Ascii(Value) (Value = Value + '0')
|
||||||
|
|
||||||
|
#if (LCD_Size == 801)
|
||||||
|
#define __LCD_Rows 1
|
||||||
|
#define __LCD_Columns 8
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#elif (LCD_Size == 802)
|
||||||
|
#define __LCD_Rows 2
|
||||||
|
#define __LCD_Columns 8
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#define __LCD_LineStart_2 0x40
|
||||||
|
#elif (LCD_Size == 1601)
|
||||||
|
#define __LCD_Rows 1
|
||||||
|
#define __LCD_Columns 16
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#if (LCD_Type == B)
|
||||||
|
#define __LCD_LINESTART_1B 0x40
|
||||||
|
#endif
|
||||||
|
#elif (LCD_Size == 1602)
|
||||||
|
#define __LCD_Rows 2
|
||||||
|
#define __LCD_Columns 16
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#define __LCD_LineStart_2 0x40
|
||||||
|
#elif (LCD_Size == 1604)
|
||||||
|
#define __LCD_Rows 4
|
||||||
|
#define __LCD_Columns 16
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#define __LCD_LineStart_2 0x40
|
||||||
|
#define __LCD_LineStart_3 0x10
|
||||||
|
#define __LCD_LineStart_4 0x50
|
||||||
|
#elif (LCD_Size == 2001)
|
||||||
|
#define __LCD_Rows 1
|
||||||
|
#define __LCD_Columns 20
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#elif (LCD_Size == 2002)
|
||||||
|
#define __LCD_Rows 2
|
||||||
|
#define __LCD_Columns 20
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#define __LCD_LineStart_2 0x40
|
||||||
|
#elif (LCD_Size == 2004)
|
||||||
|
#define __LCD_Rows 4
|
||||||
|
#define __LCD_Columns 20
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#define __LCD_LineStart_2 0x40
|
||||||
|
#define __LCD_LineStart_3 0x14
|
||||||
|
#define __LCD_LineStart_4 0x54
|
||||||
|
#elif (LCD_Size == 4001)
|
||||||
|
#define __LCD_Rows 1
|
||||||
|
#define __LCD_Columns 40
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#elif (LCD_Size == 4002)
|
||||||
|
#define __LCD_Rows 2
|
||||||
|
#define __LCD_Columns 40
|
||||||
|
#define __LCD_LineStart_1 0x00
|
||||||
|
#define __LCD_LineStart_2 0x40
|
||||||
|
#endif
|
||||||
|
//-----------------------------------------------//
|
||||||
|
|
||||||
|
//----- Prototypes ----------------------------//
|
||||||
|
static void LCD_SendCommandHigh(uint8_t Command);
|
||||||
|
static void LCD_Send(uint8_t Data);
|
||||||
|
static uint8_t LCD_Read(void);
|
||||||
|
static inline void Pulse_En(void);
|
||||||
|
static void Int2bcd(int32_t Value, char *BCD);
|
||||||
|
//---------------------------------------------//
|
||||||
|
|
||||||
|
//----- Functions -------------//
|
||||||
|
//Setup LCD.
|
||||||
|
void LCD_Setup(void)
|
||||||
|
{
|
||||||
|
//LCD pins = Outputs
|
||||||
|
PinMode(LCD_D4, Output);
|
||||||
|
PinMode(LCD_D5, Output);
|
||||||
|
PinMode(LCD_D6, Output);
|
||||||
|
PinMode(LCD_D7, Output);
|
||||||
|
PinMode(LCD_RS, Output);
|
||||||
|
PinMode(LCD_RW, Output);
|
||||||
|
PinMode(LCD_EN, Output);
|
||||||
|
|
||||||
|
//LCD pins = 0
|
||||||
|
DigitalWrite(LCD_D4, Low);
|
||||||
|
DigitalWrite(LCD_D5, Low);
|
||||||
|
DigitalWrite(LCD_D6, Low);
|
||||||
|
DigitalWrite(LCD_D7, Low);
|
||||||
|
DigitalWrite(LCD_RS, Low);
|
||||||
|
DigitalWrite(LCD_RW, Low);
|
||||||
|
DigitalWrite(LCD_EN, Low);
|
||||||
|
|
||||||
|
//----- Soft reset -----
|
||||||
|
//1. Wait for more than 15ms
|
||||||
|
_delay_ms(__LCD_Delay_1);
|
||||||
|
//2. Command 32: LCD 8-bit mode
|
||||||
|
LCD_SendCommandHigh(__LCD_CMD_FunctionSet | __LCD_CMD_8BitMode);
|
||||||
|
//3. Wait for more than 4.1ms
|
||||||
|
_delay_ms(__LCD_Delay_2);
|
||||||
|
//4. Command 32: LCD 8-bit mode
|
||||||
|
LCD_SendCommandHigh(__LCD_CMD_FunctionSet | __LCD_CMD_8BitMode);
|
||||||
|
//5. Wait for more than 100us
|
||||||
|
_delay_ms(__LCD_Delay_3);
|
||||||
|
//6. Command 32: LCD 8-bit mode, for the 3rd time
|
||||||
|
LCD_SendCommandHigh(__LCD_CMD_FunctionSet | __LCD_CMD_8BitMode);
|
||||||
|
//7. Wait for more than 100us
|
||||||
|
_delay_ms(__LCD_Delay_4);
|
||||||
|
|
||||||
|
//----- Initialization -----
|
||||||
|
//1. Command 32: LCD mode
|
||||||
|
LCD_SendCommandHigh(__LCD_CMD_FunctionSet | __LCD_CMD_4BitMode);
|
||||||
|
//2. Command 32: LCD mode and size
|
||||||
|
LCD_SendCommand(__LCD_CMD_FunctionSet | __LCD_CMD_4BitMode | __LCD_CMD_2Line | __LCD_CMD_5x8Dots);
|
||||||
|
//3. Command 8: Display On, Cursor off, Blinking Off
|
||||||
|
LCD_SendCommand(__LCD_CMD_DisplayControl | __LCD_CMD_DisplayOn | __LCD_CMD_CursorOff | __LCD_CMD_BlinkOff);
|
||||||
|
//4. Command 4: Auto increment, No shifting
|
||||||
|
LCD_SendCommand(__LCD_CMD_EntryModeSet | __LCD_CMD_EntryIncrement | __LCD_CMD_EntryNoShift);
|
||||||
|
//5. Command 1: Clear display, cursor at home
|
||||||
|
LCD_SendCommand(__LCD_CMD_ClearDisplay);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Send command to LCD.
|
||||||
|
void LCD_SendCommand(uint8_t Command)
|
||||||
|
{
|
||||||
|
LCD_WaitBusy();
|
||||||
|
|
||||||
|
DigitalWrite(LCD_RS, Low);
|
||||||
|
LCD_Send(Command);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Send data to LCD.
|
||||||
|
void LCD_SendData(char c)
|
||||||
|
{
|
||||||
|
LCD_WaitBusy();
|
||||||
|
|
||||||
|
DigitalWrite(LCD_RS, High);
|
||||||
|
LCD_Send((uint8_t)(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Wait until busy flag is cleared.
|
||||||
|
void LCD_WaitBusy(void)
|
||||||
|
{
|
||||||
|
uint8_t busy = 0;
|
||||||
|
|
||||||
|
PinMode(LCD_D4, Input); //D7:D4 = Inputs
|
||||||
|
PinMode(LCD_D5, Input);
|
||||||
|
PinMode(LCD_D6, Input);
|
||||||
|
PinMode(LCD_D7, Input);
|
||||||
|
DigitalWrite(LCD_RS, Low); //RS=0
|
||||||
|
DigitalWrite(LCD_RW, High); //RW=1
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
//High nibble comes first
|
||||||
|
DigitalWrite(LCD_EN, High);
|
||||||
|
_delay_us(__LCD_Pulse_us);
|
||||||
|
busy &= ~(1<<__LCD_BusyFlag);
|
||||||
|
busy |= (DigitalRead(LCD_D7)<<__LCD_BusyFlag);
|
||||||
|
DigitalWrite(LCD_EN, Low);
|
||||||
|
|
||||||
|
//Low nibble follows
|
||||||
|
Pulse_En();
|
||||||
|
}
|
||||||
|
while(BitCheck(busy, __LCD_BusyFlag));
|
||||||
|
|
||||||
|
PinMode(LCD_D4, Output); //D7:D4 = Outputs
|
||||||
|
PinMode(LCD_D5, Output);
|
||||||
|
PinMode(LCD_D6, Output);
|
||||||
|
PinMode(LCD_D7, Output);
|
||||||
|
DigitalWrite(LCD_RW, Low); //RW = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//Build character in LCD CGRAM from data in SRAM.
|
||||||
|
void LCD_BuildChar(char *Data, uint8_t Position)
|
||||||
|
{
|
||||||
|
if (Position < 0)
|
||||||
|
return;
|
||||||
|
if (Position >= 8)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Point_t p = LCD_GetP();
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
//Every character in CGRAM needs 8bytes
|
||||||
|
LCD_SendCommand(__LCD_CMD_SetCGRAMAddress | (Position<<3));
|
||||||
|
|
||||||
|
//Save the character byte-by-byte
|
||||||
|
for (i = 0 ; i < 8 ; i++)
|
||||||
|
LCD_SendData(Data[i]);
|
||||||
|
|
||||||
|
//Return to the DDRAM position
|
||||||
|
LCD_GotoXY(p.X, p.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Build character in LCD CGRAM from data in Flash memory.
|
||||||
|
void LCD_BuildChar_P(const char *Data, uint8_t Position)
|
||||||
|
{
|
||||||
|
if (Position < 0)
|
||||||
|
return;
|
||||||
|
if (Position >= 8)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Point_t p = LCD_GetP();
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
//Every character in CGRAM needs 8bytes
|
||||||
|
LCD_SendCommand(__LCD_CMD_SetCGRAMAddress | (Position<<3));
|
||||||
|
|
||||||
|
//Save the character byte-by-byte
|
||||||
|
for (i = 0 ; i < 8 ; i++)
|
||||||
|
LCD_SendData(pgm_read_byte(Data[i]));
|
||||||
|
|
||||||
|
//Return to the DDRAM position
|
||||||
|
LCD_GotoXY(p.X, p.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Clear display.
|
||||||
|
void LCD_Clear(void)
|
||||||
|
{
|
||||||
|
LCD_SendCommand(__LCD_CMD_ClearDisplay);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Clear line.
|
||||||
|
void LCD_ClearLine(uint8_t Line)
|
||||||
|
{
|
||||||
|
uint8_t i = 0;
|
||||||
|
|
||||||
|
LCD_GotoXY(0, Line);
|
||||||
|
while(i <= __LCD_Columns)
|
||||||
|
{
|
||||||
|
LCD_SendData(' ');
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Go to specified position.
|
||||||
|
void LCD_GotoXY(uint8_t X, uint8_t Y)
|
||||||
|
{
|
||||||
|
if ((X < __LCD_Columns) && (Y < __LCD_Rows))
|
||||||
|
{
|
||||||
|
uint8_t addr = 0;
|
||||||
|
switch (Y)
|
||||||
|
{
|
||||||
|
#if ((defined(__LCD_LineStart_4)) || (defined(__LCD_LineStart_3)) || (defined(__LCD_LineStart_2)) || (defined(__LCD_LineStart_1)))
|
||||||
|
case (0):
|
||||||
|
addr = __LCD_LineStart_1;
|
||||||
|
#if ((LCD_Size == 1601) && (LCD_Type == B))
|
||||||
|
if (X >= (__LCD_Columns>>1))
|
||||||
|
{
|
||||||
|
X -= __LCD_Columns>>1;
|
||||||
|
addr = __LCD_LINESTART_1B;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if ((defined(__LCD_LineStart_4)) || (defined(__LCD_LineStart_3)) || (defined(__LCD_LineStart_2)))
|
||||||
|
case (1):
|
||||||
|
addr = __LCD_LineStart_2;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if ((defined(__LCD_LineStart_4)) || (defined(__LCD_LineStart_3)))
|
||||||
|
case (2):
|
||||||
|
addr = __LCD_LineStart_3;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if (defined(__LCD_LineStart_4))
|
||||||
|
case (3):
|
||||||
|
addr = __LCD_LineStart_4;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
addr = __LCD_CMD_SetDDRAMAddress | (addr | X);
|
||||||
|
LCD_SendCommand(addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get current position.
|
||||||
|
Point_t LCD_GetP(void)
|
||||||
|
{
|
||||||
|
Point_t p;
|
||||||
|
|
||||||
|
p.X = LCD_Read();
|
||||||
|
p.Y = 0;
|
||||||
|
#if (__LCD_Rows == 1)
|
||||||
|
#if ((LCD_Size == 1601) && (LCD_Type == B))
|
||||||
|
if (p.X >= __LCD_LINESTART_1B)
|
||||||
|
p.X = p.X - __LCD_LINESTART_1B + (__LCD_Columns>>1);
|
||||||
|
#endif
|
||||||
|
#elif (__LCD_Rows == 2)
|
||||||
|
if (p.X >= __LCD_LineStart_2)
|
||||||
|
{
|
||||||
|
p.X -= __LCD_LineStart_2;
|
||||||
|
p.Y = 1;
|
||||||
|
}
|
||||||
|
#elif (__LCD_Rows == 3)
|
||||||
|
if (p.X >= __LCD_LineStart_2)
|
||||||
|
{
|
||||||
|
p.X -= __LCD_LineStart_2;
|
||||||
|
p.Y = 1;
|
||||||
|
}
|
||||||
|
else if (p.X >= __LCD_LineStart_3)
|
||||||
|
{
|
||||||
|
p.X -= __LCD_LineStart_3;
|
||||||
|
p.Y = 2;
|
||||||
|
}
|
||||||
|
#elif (__LCD_Rows == 4)
|
||||||
|
if (p.X >= __LCD_LineStart_4)
|
||||||
|
{
|
||||||
|
p.X -= __LCD_LineStart_4;
|
||||||
|
p.Y = 3;
|
||||||
|
}
|
||||||
|
else if (p.X >= __LCD_LineStart_2)
|
||||||
|
{
|
||||||
|
p.X -= __LCD_LineStart_2;
|
||||||
|
p.Y = 1;
|
||||||
|
}
|
||||||
|
else if (p.X >= __LCD_LineStart_3)
|
||||||
|
{
|
||||||
|
p.X -= __LCD_LineStart_3;
|
||||||
|
p.Y = 2;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get X position.
|
||||||
|
uint8_t LCD_GetX(void)
|
||||||
|
{
|
||||||
|
return LCD_GetP().X;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get Y position.
|
||||||
|
uint8_t LCD_GetY(void)
|
||||||
|
{
|
||||||
|
return LCD_GetP().Y;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Print character.
|
||||||
|
void LCD_PrintChar(char Character)
|
||||||
|
{
|
||||||
|
LCD_SendData(Character);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Print string from SRAM.
|
||||||
|
void LCD_PrintString(char *Text)
|
||||||
|
{
|
||||||
|
while(*Text)
|
||||||
|
LCD_SendData(*Text++);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Print string from Flash memory.
|
||||||
|
void LCD_PrintString_P(const char *Text)
|
||||||
|
{
|
||||||
|
char r = pgm_read_byte(Text++);
|
||||||
|
while(r)
|
||||||
|
{
|
||||||
|
LCD_SendData(r);
|
||||||
|
r = pgm_read_byte(Text++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Print integer.
|
||||||
|
void LCD_PrintInteger(int32_t Value)
|
||||||
|
{
|
||||||
|
if (Value == 0 )
|
||||||
|
{
|
||||||
|
LCD_PrintChar('0');
|
||||||
|
}
|
||||||
|
else if ((Value > INT32_MIN ) && (Value <= INT32_MAX))
|
||||||
|
{
|
||||||
|
//int32_max + sign + null = 12 bytes
|
||||||
|
char arr[12] = { '\0' };
|
||||||
|
|
||||||
|
//Convert integer to array (returns in reversed order)
|
||||||
|
Int2bcd(Value, arr);
|
||||||
|
|
||||||
|
//Print
|
||||||
|
LCD_PrintString(arr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Print double.
|
||||||
|
void LCD_PrintDouble(double Value, uint32_t Tens)
|
||||||
|
{
|
||||||
|
if (Value == 0)
|
||||||
|
{
|
||||||
|
//Print characters individually so no string is stored into RAM.
|
||||||
|
LCD_PrintChar('0');
|
||||||
|
LCD_PrintChar('.');
|
||||||
|
LCD_PrintChar('0');
|
||||||
|
}
|
||||||
|
else if ((Value >= (-2147483647)) && (Value < 2147483648))
|
||||||
|
{
|
||||||
|
//Print sign
|
||||||
|
if (Value < 0)
|
||||||
|
{
|
||||||
|
Value = -Value;
|
||||||
|
LCD_PrintChar('-');
|
||||||
|
}
|
||||||
|
|
||||||
|
//Print integer part
|
||||||
|
LCD_PrintInteger(Value);
|
||||||
|
|
||||||
|
//Print dot
|
||||||
|
LCD_PrintChar('.');
|
||||||
|
|
||||||
|
//Print decimal part
|
||||||
|
LCD_PrintInteger((Value - (uint32_t)(Value)) * Tens);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Send only high nibble to LCD.
|
||||||
|
static void LCD_SendCommandHigh(uint8_t Data)
|
||||||
|
{
|
||||||
|
DigitalWrite(LCD_RS, Low);
|
||||||
|
|
||||||
|
//Send the high nibble
|
||||||
|
DigitalWrite(LCD_D4, BitCheck(Data, 4));
|
||||||
|
DigitalWrite(LCD_D5, BitCheck(Data, 5));
|
||||||
|
DigitalWrite(LCD_D6, BitCheck(Data, 6));
|
||||||
|
DigitalWrite(LCD_D7, BitCheck(Data, 7));
|
||||||
|
Pulse_En();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Send data to LCD.
|
||||||
|
static void LCD_Send(uint8_t Data)
|
||||||
|
{
|
||||||
|
//Send the high nibble
|
||||||
|
DigitalWrite(LCD_D4, BitCheck(Data, 4));
|
||||||
|
DigitalWrite(LCD_D5, BitCheck(Data, 5));
|
||||||
|
DigitalWrite(LCD_D6, BitCheck(Data, 6));
|
||||||
|
DigitalWrite(LCD_D7, BitCheck(Data, 7));
|
||||||
|
Pulse_En();
|
||||||
|
|
||||||
|
//Low nibble comes after
|
||||||
|
DigitalWrite(LCD_D4, BitCheck(Data, 0));
|
||||||
|
DigitalWrite(LCD_D5, BitCheck(Data, 1));
|
||||||
|
DigitalWrite(LCD_D6, BitCheck(Data, 2));
|
||||||
|
DigitalWrite(LCD_D7, BitCheck(Data, 3));
|
||||||
|
Pulse_En();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Read status from LCD.
|
||||||
|
static uint8_t LCD_Read(void)
|
||||||
|
{
|
||||||
|
uint8_t status = 0;
|
||||||
|
|
||||||
|
LCD_WaitBusy();
|
||||||
|
|
||||||
|
PinMode(LCD_D4, Input); //D7:D4 = Inputs
|
||||||
|
PinMode(LCD_D5, Input);
|
||||||
|
PinMode(LCD_D6, Input);
|
||||||
|
PinMode(LCD_D7, Input);
|
||||||
|
DigitalWrite(LCD_RS, Low); //RS = 0
|
||||||
|
DigitalWrite(LCD_RW, High); //RW = 1
|
||||||
|
|
||||||
|
//High nibble comes first
|
||||||
|
DigitalWrite(LCD_EN, High);
|
||||||
|
_delay_us(__LCD_Pulse_us);
|
||||||
|
status |= DigitalRead(LCD_D4)<<4;
|
||||||
|
status |= DigitalRead(LCD_D5)<<5;
|
||||||
|
status |= DigitalRead(LCD_D6)<<6;
|
||||||
|
DigitalWrite(LCD_EN, Low);
|
||||||
|
|
||||||
|
//Low nibble follows
|
||||||
|
DigitalWrite(LCD_EN, High);
|
||||||
|
_delay_us(__LCD_Pulse_us);
|
||||||
|
status |= DigitalRead(LCD_D4);
|
||||||
|
status |= DigitalRead(LCD_D5)<<1;
|
||||||
|
status |= DigitalRead(LCD_D6)<<2;
|
||||||
|
status |= DigitalRead(LCD_D7)<<3;
|
||||||
|
DigitalWrite(LCD_EN, Low);
|
||||||
|
|
||||||
|
PinMode(LCD_D4, Output); //D7:D4 = Outputs
|
||||||
|
PinMode(LCD_D5, Output);
|
||||||
|
PinMode(LCD_D6, Output);
|
||||||
|
PinMode(LCD_D7, Output);
|
||||||
|
DigitalWrite(LCD_RW, Low); //RW = 0
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Sends pulse to PIN_EN of LCD.
|
||||||
|
static inline void Pulse_En(void)
|
||||||
|
{
|
||||||
|
DigitalWrite(LCD_EN, High);
|
||||||
|
_delay_us(__LCD_Pulse_us);
|
||||||
|
DigitalWrite(LCD_EN, Low);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Converts integer value to BCD.
|
||||||
|
static void Int2bcd(int32_t Value, char BCD[])
|
||||||
|
{
|
||||||
|
uint8_t isNegative = 0;
|
||||||
|
|
||||||
|
BCD[0] = BCD[1] = BCD[2] =
|
||||||
|
BCD[3] = BCD[4] = BCD[5] =
|
||||||
|
BCD[6] = BCD[7] = BCD[8] =
|
||||||
|
BCD[9] = BCD[10] = '0';
|
||||||
|
|
||||||
|
if (Value < 0)
|
||||||
|
{
|
||||||
|
isNegative = 1;
|
||||||
|
Value = -Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value > 1000000000)
|
||||||
|
{
|
||||||
|
Value -= 1000000000;
|
||||||
|
BCD[1]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value >= 100000000)
|
||||||
|
{
|
||||||
|
Value -= 100000000;
|
||||||
|
BCD[2]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value >= 10000000)
|
||||||
|
{
|
||||||
|
Value -= 10000000;
|
||||||
|
BCD[3]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value >= 1000000)
|
||||||
|
{
|
||||||
|
Value -= 1000000;
|
||||||
|
BCD[4]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value >= 100000)
|
||||||
|
{
|
||||||
|
Value -= 100000;
|
||||||
|
BCD[5]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value >= 10000)
|
||||||
|
{
|
||||||
|
Value -= 10000;
|
||||||
|
BCD[6]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value >= 1000)
|
||||||
|
{
|
||||||
|
Value -= 1000;
|
||||||
|
BCD[7]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value >= 100)
|
||||||
|
{
|
||||||
|
Value -= 100;
|
||||||
|
BCD[8]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value >= 10)
|
||||||
|
{
|
||||||
|
Value -= 10;
|
||||||
|
BCD[9]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Value >= 1)
|
||||||
|
{
|
||||||
|
Value -= 1;
|
||||||
|
BCD[10]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t i = 0;
|
||||||
|
//Find first non zero digit
|
||||||
|
while (BCD[i] == '0')
|
||||||
|
i++;
|
||||||
|
|
||||||
|
//Add sign
|
||||||
|
if (isNegative)
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
BCD[i] = '-';
|
||||||
|
}
|
||||||
|
|
||||||
|
//Shift array
|
||||||
|
uint8_t end = 10 - i;
|
||||||
|
uint8_t offset = i;
|
||||||
|
i = 0;
|
||||||
|
while (i <= end)
|
||||||
|
{
|
||||||
|
BCD[i] = BCD[i + offset];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
BCD[i] = '\0';
|
||||||
|
}
|
||||||
|
//-----------------------------//
|
95
lectures/LCD_lib/HD44780.h
Normal file
95
lectures/LCD_lib/HD44780.h
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
#ifndef HD44780_H_INCLUDED
|
||||||
|
#define HD44780_H_INCLUDED
|
||||||
|
/*
|
||||||
|
||
|
||||||
|
|| Filename: HD44780.h
|
||||||
|
|| Title: HD44780 Driver
|
||||||
|
|| Author: Efthymios Koktsidis
|
||||||
|
|| Email: efthymios.ks@gmail.com
|
||||||
|
|| Compiler: AVR-GCC
|
||||||
|
|| Description:
|
||||||
|
|| This library can drive HD44780 based LCD.
|
||||||
|
|| The LCD is driven exclusively in 4-bit mode.
|
||||||
|
||
|
||||||
|
*/
|
||||||
|
|
||||||
|
//----- Headers ------------//
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
#include "IO_Macros.h"
|
||||||
|
#include "HD44780_Settings.h"
|
||||||
|
//--------------------------//
|
||||||
|
|
||||||
|
//----- Auxiliary data ---------------------------//
|
||||||
|
#define __LCD_Pulse_us 1
|
||||||
|
#define __LCD_Delay_1 20
|
||||||
|
#define __LCD_Delay_2 10
|
||||||
|
#define __LCD_Delay_3 1
|
||||||
|
#define __LCD_Delay_4 1
|
||||||
|
|
||||||
|
#define __LCD_CMD_ClearDisplay 0x01
|
||||||
|
#define __LCD_CMD_ReturnHome 0x02
|
||||||
|
#define __LCD_CMD_EntryModeSet 0x04
|
||||||
|
#define __LCD_CMD_DisplayControl 0x08
|
||||||
|
#define __LCD_CMD_CursorShift 0x10
|
||||||
|
#define __LCD_CMD_FunctionSet 0x20
|
||||||
|
#define __LCD_CMD_SetCGRAMAddress 0x40
|
||||||
|
#define __LCD_CMD_SetDDRAMAddress 0x80
|
||||||
|
|
||||||
|
#define __LCD_CMD_EntryIncrement 0x02
|
||||||
|
#define __LCD_CMD_EntryDecrement 0x00
|
||||||
|
#define __LCD_CMD_EntryShift 0x01
|
||||||
|
#define __LCD_CMD_EntryNoShift 0x00
|
||||||
|
|
||||||
|
#define __LCD_CMD_DisplayOn 0x04
|
||||||
|
#define __LCD_CMD_DisplayOff 0x00
|
||||||
|
#define __LCD_CMD_CursonOn 0x02
|
||||||
|
#define __LCD_CMD_CursorOff 0x00
|
||||||
|
#define __LCD_CMD_BlinkOn 0x01
|
||||||
|
#define __LCD_CMD_BlinkOff 0x00
|
||||||
|
|
||||||
|
#define __LCD_CMD_DisplayMove 0x08
|
||||||
|
#define __LCD_CMD_CursorMove 0x00
|
||||||
|
#define __LCD_CMD_MoveRight 0x04
|
||||||
|
#define __LCD_CMD_MoveLeft 0x00
|
||||||
|
|
||||||
|
#define __LCD_CMD_8BitMode 0x10
|
||||||
|
#define __LCD_CMD_4BitMode 0x00
|
||||||
|
#define __LCD_CMD_2Line 0x08
|
||||||
|
#define __LCD_CMD_1Line 0x00
|
||||||
|
#define __LCD_CMD_5x10Dots 0x04
|
||||||
|
#define __LCD_CMD_5x8Dots 0x00
|
||||||
|
|
||||||
|
#define __LCD_BusyFlag 7
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t X,Y;
|
||||||
|
}Point_t;
|
||||||
|
//------------------------------------------------//
|
||||||
|
|
||||||
|
//----- Prototypes ------------------------------------------------------------//
|
||||||
|
void LCD_Setup(void);
|
||||||
|
void LCD_SendCommand(uint8_t Command);
|
||||||
|
void LCD_SendData(char Character);
|
||||||
|
void LCD_WaitBusy(void);
|
||||||
|
void LCD_BuildChar(char *Data, uint8_t Position);
|
||||||
|
void LCD_BuildChar_P(const char *Data, uint8_t Position);
|
||||||
|
|
||||||
|
void LCD_Clear(void);
|
||||||
|
void LCD_ClearLine(uint8_t Line);
|
||||||
|
void LCD_GotoXY(uint8_t X, uint8_t Y);
|
||||||
|
Point_t LCD_GetP(void);
|
||||||
|
uint8_t LCD_GetX(void);
|
||||||
|
uint8_t LCD_GetY(void);
|
||||||
|
|
||||||
|
void LCD_PrintChar(char Character);
|
||||||
|
void LCD_PrintString(char *Text);
|
||||||
|
void LCD_PrintString_P(const char *Text);
|
||||||
|
void LCD_PrintInteger(int32_t Value);
|
||||||
|
void LCD_PrintDouble(double Value, uint32_t Tens);
|
||||||
|
//-----------------------------------------------------------------------------//
|
||||||
|
#endif
|
43
lectures/LCD_lib/HD44780_Settings.h
Normal file
43
lectures/LCD_lib/HD44780_Settings.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#ifndef HD44780_SETTINGS_H_INCLUDED
|
||||||
|
#define HD44780_SETTINGS_H_INCLUDED
|
||||||
|
/*
|
||||||
|
||
|
||||||
|
|| Filename: HD44780_Settings.h
|
||||||
|
|| Title: HD44780 Driver Settings
|
||||||
|
|| Author: Efthymios Koktsidis
|
||||||
|
|| Email: efthymios.ks@gmail.com
|
||||||
|
|| Compiler: AVR-GCC
|
||||||
|
|| Description:
|
||||||
|
|| Settings for the HD44780 driver. Pick a size and the
|
||||||
|
|| desirable pins. 16x1 needs testing.
|
||||||
|
||
|
||||||
|
|| Size Code | Size Code | Size Code | Size Code |
|
||||||
|
||------------------------------------------------------------------|
|
||||||
|
|| 8x1 - 801 | * 16x1 - 1601 * | 20x1 - 2001 | 40x1 - 4001 |
|
||||||
|
|| 8x2 - 802 | 16x2 - 1602 | 20x2 - 2002 | 40x2 - 4002 |
|
||||||
|
|| | 16x4 - 1604 | 20x4 - 2004 | |
|
||||||
|
||
|
||||||
|
||*If LCD size is 16x1, choose variant A or B
|
||||||
|
|| Type Row DDRAM Address Details
|
||||||
|
|| ? 0x00->0x0F Row uses consequtive block addresses.
|
||||||
|
|| ? 0x00->0x07 + 0x40->0x47 Row is split into two sections.
|
||||||
|
||
|
||||||
|
*/
|
||||||
|
|
||||||
|
//----- Configuration --------------------------//
|
||||||
|
//LCD size
|
||||||
|
#define LCD_Size 1602
|
||||||
|
|
||||||
|
//If LCD size is 16x1, define type A or B
|
||||||
|
#define LCD_Type A
|
||||||
|
|
||||||
|
//LCD pins PORT, PIN
|
||||||
|
#define LCD_D4 D, 4
|
||||||
|
#define LCD_D5 D, 5
|
||||||
|
#define LCD_D6 D, 6
|
||||||
|
#define LCD_D7 D, 7
|
||||||
|
#define LCD_RS D, 1
|
||||||
|
#define LCD_RW D, 2
|
||||||
|
#define LCD_EN D, 3
|
||||||
|
//----------------------------------------------//
|
||||||
|
#endif
|
60
lectures/LCD_lib/IO_Macros.h
Normal file
60
lectures/LCD_lib/IO_Macros.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#ifndef IO_MACROS_H_INCLUDED
|
||||||
|
#define IO_MACROS_H_INCLUDED
|
||||||
|
/*
|
||||||
|
||
|
||||||
|
|| Filename: IO_Macros.h
|
||||||
|
|| Title: IO manipulation macros
|
||||||
|
|| Author: Efthymios Koktsidis
|
||||||
|
|| Email: efthymios.ks@gmail.com
|
||||||
|
|| Compiler: AVR-GCC
|
||||||
|
|| Description: This library contains macros for
|
||||||
|
|| easy port manipulation (similar
|
||||||
|
|| to Arduino).
|
||||||
|
||
|
||||||
|
|| Demo:
|
||||||
|
|| 1. #define LED A, 0 || 6. PinModeToggle(BUTTON);
|
||||||
|
|| 2. #define BUTTON A, 1 || 7. DigitalWrite(LED, LOW);
|
||||||
|
|| 3. || 8. DigitalWrite(LED, HIGH);
|
||||||
|
|| 4. PinMode(BUTTON, OUTPUT); || 9. DigitalLevelToggle(LED);
|
||||||
|
|| 5. PinMode(LED, OUTPUT); ||10. int a = DigitalRead(BUTTON);
|
||||||
|
||
|
||||||
|
*/
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
//----- I/O Macros -----
|
||||||
|
//Macros to edit PORT, DDR and PIN
|
||||||
|
#define PinMode( x, y) ( y ? _SET(DDR, x) : _CLEAR(DDR, x) )
|
||||||
|
#define DigitalWrite( x, y) ( y ? _SET(PORT, x) : _CLEAR(PORT, x) )
|
||||||
|
#define DigitalRead( x) ( _GET(PIN, x) )
|
||||||
|
#define PinModeToggle( x) ( _TOGGLE(DDR, x) )
|
||||||
|
#define DigitalLevelToggle( x) ( _TOGGLE(PORT, x) )
|
||||||
|
|
||||||
|
//General use bit manipulating commands
|
||||||
|
#define BitSet( x, y) ( x |= (1UL<<y) )
|
||||||
|
#define BitClear( x, y) ( x &= (~(1UL<<y)) )
|
||||||
|
#define BitToggle( x, y) ( x ^= (1UL<<y) )
|
||||||
|
#define BitCheck( x, y) ( x & (1UL<<y) ? 1 : 0 )
|
||||||
|
|
||||||
|
//Access PORT, DDR and PIN
|
||||||
|
#define PORT( port) (_PORT( port))
|
||||||
|
#define DDR( port) (_DDR( port))
|
||||||
|
#define PIN( port) (_PIN( port))
|
||||||
|
|
||||||
|
#define _PORT( port) (PORT## port)
|
||||||
|
#define _DDR( port) (DDR## port)
|
||||||
|
#define _PIN( port) (PIN## port)
|
||||||
|
|
||||||
|
#define _SET( type, port, bit) ( BitSet( (type##port), bit) )
|
||||||
|
#define _CLEAR( type, port, bit) ( BitClear( (type##port), bit) )
|
||||||
|
#define _TOGGLE(type, port, bit) ( BitToggle( (type##port), bit) )
|
||||||
|
#define _GET( type, port, bit) ( BitCheck( (type##port), bit) )
|
||||||
|
|
||||||
|
//Definitions
|
||||||
|
#define Input 0
|
||||||
|
#define Output !Input
|
||||||
|
#define Low 0
|
||||||
|
#define High !Low
|
||||||
|
#define False 0
|
||||||
|
#define True !False
|
||||||
|
//------------------
|
||||||
|
#endif
|
22
lectures/LCD_lib/LCD-lib.c
Normal file
22
lectures/LCD_lib/LCD-lib.c
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#include"HD44780.h"
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
uint8_t linia;
|
||||||
|
char Znak1[] = {0x04, 0x0E, 0x04, 0x1F, 0x04, 0x0E, 0x04, 0x04};
|
||||||
|
char Znak2[] = {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x00};
|
||||||
|
|
||||||
|
LCD_Setup();
|
||||||
|
LCD_BuildChar(Znak1, 0);
|
||||||
|
LCD_BuildChar(Znak2, 1);
|
||||||
|
for(linia = 0; linia < 2; linia++) {
|
||||||
|
LCD_GotoXY(0, linia);
|
||||||
|
LCD_PrintString("Linia 1");
|
||||||
|
LCD_PrintInteger(LCD_GetY());
|
||||||
|
LCD_SendData(linia);
|
||||||
|
LCD_PrintDouble(3.14, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
while(1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
250
lectures/LCD_lib/LCD-onefile.c
Normal file
250
lectures/LCD_lib/LCD-onefile.c
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
#include<avr/io.h>
|
||||||
|
#include<util/delay.h>
|
||||||
|
|
||||||
|
#define HD44780_CLEAR 0x01
|
||||||
|
#define HD44780_HOME 0x02
|
||||||
|
#define HD44780_ENTRY_MODE 0x04
|
||||||
|
#define HD44780_EM_SHIFT_CURSOR 0
|
||||||
|
#define HD44780_EM_SHIFT_DISPLAY 1
|
||||||
|
#define HD44780_EM_DECREMENT 0
|
||||||
|
#define HD44780_EM_INCREMENT 2
|
||||||
|
#define HD44780_DISPLAY_ONOFF 0x08
|
||||||
|
#define HD44780_DISPLAY_OFF 0
|
||||||
|
#define HD44780_DISPLAY_ON 4
|
||||||
|
#define HD44780_CURSOR_OFF 0
|
||||||
|
#define HD44780_CURSOR_ON 2
|
||||||
|
#define HD44780_CURSOR_NOBLINK 0
|
||||||
|
#define HD44780_CURSOR_BLINK 1
|
||||||
|
#define HD44780_DISPLAY_CURSOR_SHIFT 0x10
|
||||||
|
#define HD44780_SHIFT_CURSOR 0
|
||||||
|
#define HD44780_SHIFT_DISPLAY 8
|
||||||
|
#define HD44780_SHIFT_LEFT 0
|
||||||
|
#define HD44780_SHIFT_RIGHT 4
|
||||||
|
#define HD44780_FUNCTION_SET 0x20
|
||||||
|
#define HD44780_FONT5x7 0
|
||||||
|
#define HD44780_FONT5x10 4
|
||||||
|
#define HD44780_ONE_LINE 0
|
||||||
|
#define HD44780_TWO_LINE 8
|
||||||
|
#define HD44780_4_BIT 0
|
||||||
|
#define HD44780_8_BIT 16
|
||||||
|
#define HD44780_CGRAM_SET 0x40
|
||||||
|
#define HD44780_DDRAM_SET 0x80
|
||||||
|
|
||||||
|
#define PORT(x) XPORT(x)
|
||||||
|
#define XPORT(x) (PORT##x)
|
||||||
|
#define PIN(x) XPIN(x)
|
||||||
|
#define XPIN(x) (PIN##x)
|
||||||
|
#define DDR(x) XDDR(x)
|
||||||
|
#define XDDR(x) (DDR##x)
|
||||||
|
|
||||||
|
#define LCD_DATA_PORT D
|
||||||
|
#define LCD_RS_PORT D
|
||||||
|
#define LCD_RW_PORT D
|
||||||
|
#define LCD_E_PORT D
|
||||||
|
#define LCD_D4_PIN 4
|
||||||
|
#define LCD_D5_PIN 5
|
||||||
|
#define LCD_D6_PIN 6
|
||||||
|
#define LCD_D7_PIN 7
|
||||||
|
#define LCD_RS_PIN 1
|
||||||
|
#define LCD_RW_PIN 2
|
||||||
|
#define LCD_E_PIN 3
|
||||||
|
|
||||||
|
void LCD_init(void);
|
||||||
|
void LCD_clear(void);
|
||||||
|
void LCD_goto(uint8_t x, uint8_t y);
|
||||||
|
void LCD_write_text(char * text);
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRC |= (1<<PC0);
|
||||||
|
PORTC |= (1<<PC0);
|
||||||
|
|
||||||
|
LCD_init();
|
||||||
|
LCD_clear();
|
||||||
|
LCD_goto(1,0);
|
||||||
|
LCD_write_text("TEST!TEST!TEST!");
|
||||||
|
|
||||||
|
while(1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t LCD_in_bits(void)
|
||||||
|
{
|
||||||
|
uint8_t tmp = 0;
|
||||||
|
if(((PIN(LCD_DATA_PORT) >> LCD_D4_PIN) & 0x01) != 0)
|
||||||
|
tmp |= (1 << 0);
|
||||||
|
if(((PIN(LCD_DATA_PORT) >> LCD_D5_PIN) & 0x01) != 0)
|
||||||
|
tmp |= (1 << 1);
|
||||||
|
if(((PIN(LCD_DATA_PORT) >> LCD_D6_PIN) & 0x01) != 0)
|
||||||
|
tmp |= (1 << 2);
|
||||||
|
if(((PIN(LCD_DATA_PORT) >> LCD_D7_PIN) & 0x01) != 0)
|
||||||
|
tmp |= (1 << 3);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t LCD_read(void)
|
||||||
|
{
|
||||||
|
uint8_t tmp = 0;
|
||||||
|
DDR(LCD_DATA_PORT) &=
|
||||||
|
~((1<<LCD_D4_PIN)|(1<<LCD_D5_PIN)|(1<<LCD_D6_PIN)|(1<<LCD_D7_PIN));
|
||||||
|
PORT(LCD_RW_PORT) |= (1<<LCD_RW_PIN);
|
||||||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||||||
|
tmp |= (LCD_in_bits() << 4);
|
||||||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||||||
|
_delay_ms(1);
|
||||||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||||||
|
tmp |= LCD_in_bits();
|
||||||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t LCD_ReadStatus(void)
|
||||||
|
{
|
||||||
|
PORT(LCD_RS_PORT) &= ~(1<<LCD_RS_PIN);
|
||||||
|
return LCD_read();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_out_bits(uint8_t bits_to_write)
|
||||||
|
{
|
||||||
|
if(bits_to_write & 0x01)
|
||||||
|
PORT(LCD_DATA_PORT) |= (1<<LCD_D4_PIN);
|
||||||
|
else
|
||||||
|
PORT(LCD_DATA_PORT) &= ~(1<<LCD_D4_PIN);
|
||||||
|
if(bits_to_write & 0x02)
|
||||||
|
PORT(LCD_DATA_PORT) |= (1<<LCD_D5_PIN);
|
||||||
|
else
|
||||||
|
PORT(LCD_DATA_PORT) &= ~(1<<LCD_D5_PIN);
|
||||||
|
if(bits_to_write & 0x04)
|
||||||
|
PORT(LCD_DATA_PORT) |= (1<<LCD_D6_PIN);
|
||||||
|
else
|
||||||
|
PORT(LCD_DATA_PORT) &= ~(1<<LCD_D6_PIN);
|
||||||
|
if(bits_to_write & 0x08)
|
||||||
|
PORT(LCD_DATA_PORT) |= (1<<LCD_D7_PIN);
|
||||||
|
else
|
||||||
|
PORT(LCD_DATA_PORT) &= ~(1<<LCD_D7_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_write(uint8_t data_to_write)
|
||||||
|
{
|
||||||
|
DDR(LCD_DATA_PORT) |=
|
||||||
|
((1<<LCD_D4_PIN)|(1<<LCD_D5_PIN)|(1<<LCD_D6_PIN)|(1<<LCD_D7_PIN));
|
||||||
|
PORT(LCD_RW_PORT) &= ~(1<<LCD_RW_PIN);
|
||||||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||||||
|
LCD_out_bits(data_to_write >> 4);
|
||||||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||||||
|
_delay_ms(1);
|
||||||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||||||
|
LCD_out_bits(data_to_write);
|
||||||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||||||
|
_delay_ms(1);
|
||||||
|
while(LCD_ReadStatus() & 0x80);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_just_write(uint8_t data_to_write)
|
||||||
|
{
|
||||||
|
DDR(LCD_DATA_PORT) |=
|
||||||
|
((1<<LCD_D4_PIN)|(1<<LCD_D5_PIN)|(1<<LCD_D6_PIN)|(
|
||||||
|
1<<LCD_D7_PIN));
|
||||||
|
PORT(LCD_RW_PORT) &= ~(1<<LCD_RW_PIN);
|
||||||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||||||
|
LCD_out_bits(data_to_write >> 4);
|
||||||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||||||
|
_delay_ms(1);
|
||||||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||||||
|
LCD_out_bits(data_to_write);
|
||||||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||||||
|
_delay_ms(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_just_write_command(uint8_t commandToWrite)
|
||||||
|
{
|
||||||
|
PORT(LCD_RS_PORT) &= ~(1<<LCD_RS_PIN);
|
||||||
|
LCD_just_write(commandToWrite);
|
||||||
|
}
|
||||||
|
void LCD_just_write_data(uint8_t data_to_write)
|
||||||
|
{
|
||||||
|
PORT(LCD_RS_PORT) |= (1<<LCD_RS_PIN);
|
||||||
|
LCD_just_write(data_to_write);
|
||||||
|
}
|
||||||
|
uint8_t LCD_NotBusy(void)
|
||||||
|
{
|
||||||
|
if(LCD_ReadStatus() != 0x80)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_write_command(uint8_t commandToWrite)
|
||||||
|
{
|
||||||
|
PORT(LCD_RS_PORT) &= ~(1<<LCD_RS_PIN);
|
||||||
|
LCD_write(commandToWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_write_data(uint8_t data_to_write)
|
||||||
|
{
|
||||||
|
PORT(LCD_RS_PORT) |= (1<<LCD_RS_PIN);
|
||||||
|
LCD_write(data_to_write);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t LCD_read_data(void)
|
||||||
|
{
|
||||||
|
PORT(LCD_RS_PORT) |= (1<<LCD_RS_PIN);
|
||||||
|
return LCD_read();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_write_text(char * text)
|
||||||
|
{
|
||||||
|
while(*text != '\0' && *text != 0)
|
||||||
|
LCD_write_data(*text++);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_goto(uint8_t x, uint8_t y)
|
||||||
|
{
|
||||||
|
LCD_write_command(HD44780_DDRAM_SET | (x + (0x40 * y)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_clear(void)
|
||||||
|
{
|
||||||
|
LCD_write_command(HD44780_CLEAR);
|
||||||
|
_delay_ms(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_home(void)
|
||||||
|
{
|
||||||
|
LCD_write_command(HD44780_HOME);
|
||||||
|
_delay_ms(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LCD_init(void)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
DDR(LCD_DATA_PORT) |=
|
||||||
|
((1<<LCD_D4_PIN)|(1<<LCD_D5_PIN)|(1<<LCD_D6_PIN)|(1<<LCD_D7_PIN));
|
||||||
|
DDR(LCD_RS_PORT) |= (1<<LCD_RS_PIN);
|
||||||
|
DDR(LCD_RW_PORT) |= (1<<LCD_RW_PIN);
|
||||||
|
DDR(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||||||
|
_delay_ms(15);
|
||||||
|
PORT(LCD_RS_PORT) &= ~(1<<LCD_RS_PIN);
|
||||||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||||||
|
PORT(LCD_RW_PORT) &= ~(1<<LCD_RW_PIN);
|
||||||
|
for(i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||||||
|
LCD_out_bits(0x03);
|
||||||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||||||
|
_delay_ms(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
PORT(LCD_E_PORT) |= (1<<LCD_E_PIN);
|
||||||
|
LCD_out_bits(0x02);
|
||||||
|
PORT(LCD_E_PORT) &= ~(1<<LCD_E_PIN);
|
||||||
|
_delay_ms(1);
|
||||||
|
LCD_write_command(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE |
|
||||||
|
HD44780_4_BIT);
|
||||||
|
LCD_write_command(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF);
|
||||||
|
LCD_write_command(HD44780_CLEAR);
|
||||||
|
LCD_write_command(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR |
|
||||||
|
HD44780_EM_INCREMENT);
|
||||||
|
LCD_write_command(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF |
|
||||||
|
HD44780_CURSOR_NOBLINK);
|
||||||
|
}
|
79
lectures/Timer/7-seg-display_timer+pin-debounce_interrupts.c
Normal file
79
lectures/Timer/7-seg-display_timer+pin-debounce_interrupts.c
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
volatile uint8_t button_reset_counter;
|
||||||
|
volatile uint8_t main_count;
|
||||||
|
volatile uint8_t current_segment = 0;
|
||||||
|
|
||||||
|
const uint8_t digits[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
|
||||||
|
const uint8_t segments[] = {0x0E, 0x0D, 0x0B, 0x07};
|
||||||
|
|
||||||
|
// decrease reset_counter until 0
|
||||||
|
ISR(TIMER2_OVF_vect)
|
||||||
|
{
|
||||||
|
PORTC &= 0xF0;
|
||||||
|
PORTC |= segments[current_segment];
|
||||||
|
int count_disp[4];
|
||||||
|
int count_copy = main_count;
|
||||||
|
for(int i = 0; i < 4; i++){
|
||||||
|
count_disp[i] = count_copy % 10;
|
||||||
|
count_copy /= 10;
|
||||||
|
}
|
||||||
|
PORTA = digits[count_disp[current_segment]];
|
||||||
|
current_segment = (current_segment + 1) % 4;
|
||||||
|
|
||||||
|
button_reset_counter -= button_reset_counter == 0 ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update press_counter on interrupt if reset == 0
|
||||||
|
ISR(PCINT2_vect){
|
||||||
|
if (button_reset_counter == 0){
|
||||||
|
main_count++;
|
||||||
|
button_reset_counter = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRA = 0xFF;
|
||||||
|
// C7 as input for external interrupt
|
||||||
|
DDRC &= ~_BV(DDC7);
|
||||||
|
PORTC |= _BV(PORTC7);
|
||||||
|
|
||||||
|
|
||||||
|
// C0:3 as segment out
|
||||||
|
DDRC = 0x0F;
|
||||||
|
|
||||||
|
// TIMER 2 setup
|
||||||
|
TCCR2B |= _BV(CS22);// | _BV(CS21) | _BV(CS20);
|
||||||
|
TIMSK2 |= _BV(TOIE2);
|
||||||
|
|
||||||
|
|
||||||
|
cli();
|
||||||
|
// rising edge interrupt on INT2
|
||||||
|
EICRA |= _BV(ISC20);
|
||||||
|
EIMSK |= _BV(INT2);
|
||||||
|
|
||||||
|
// enable external interrupt for pin 23 - PC7
|
||||||
|
PCMSK2 |= _BV(PCINT23);
|
||||||
|
PCICR |= _BV(PCIE2);
|
||||||
|
|
||||||
|
sei();
|
||||||
|
while(1) {
|
||||||
|
// if(przyciskZablokowany1 && (PIND & (1<<PD2))) przyciskZablokowany1++;
|
||||||
|
// if(!przyciskZablokowany2 && !(PIND & (1<<PD1))) {
|
||||||
|
// if(dioda2 == 0)
|
||||||
|
// dioda2 = 1;
|
||||||
|
// else dioda2 = 0;
|
||||||
|
// przyciskZablokowany2 = 1;
|
||||||
|
// }
|
||||||
|
// else if(przyciskZablokowany2 && (PIND & (1<<PD1))) przyciskZablokowany2++;
|
||||||
|
// if(!przyciskZablokowany3 && !(PIND & (1<<PD0))) {
|
||||||
|
// liczba = (liczba + 1) % 10;
|
||||||
|
// przyciskZablokowany3 = 1;
|
||||||
|
// }
|
||||||
|
// else if(przyciskZablokowany3 && (PIND & (1<<PD0))) przyciskZablokowany3++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
19
lectures/Timer/FastPWM.c
Normal file
19
lectures/Timer/FastPWM.c
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRD |= _BV(PD5);
|
||||||
|
PORTD &= ~_BV(PORTD5);
|
||||||
|
|
||||||
|
|
||||||
|
// FAST PWM
|
||||||
|
TCCR1A |= _BV(COM1A1) | _BV(WGM11);
|
||||||
|
TCCR1B |= _BV(WGM13) | _BV(WGM12);
|
||||||
|
TCCR1B |= _BV(CS10) | _BV(CS11);
|
||||||
|
|
||||||
|
ICR1 = 0xFFFF;
|
||||||
|
OCR1A = 0x0FFF;
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
18
lectures/Timer/pwm-75duty.c
Normal file
18
lectures/Timer/pwm-75duty.c
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRD |= _BV(PD5);
|
||||||
|
PORTD &= ~_BV(PORTD5);
|
||||||
|
|
||||||
|
|
||||||
|
TCCR1A |= _BV(COM1A1) | _BV(WGM11);
|
||||||
|
TCCR1B |= _BV(WGM13);
|
||||||
|
TCCR1B |= _BV(CS10) | _BV(CS11);
|
||||||
|
|
||||||
|
ICR1 = 0xFFFF;
|
||||||
|
OCR1A = 0x2FFF;
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
51
lectures/Timer/timer+pin_interrupts.c
Normal file
51
lectures/Timer/timer+pin_interrupts.c
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include<avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
volatile uint8_t id;
|
||||||
|
volatile uint8_t state;
|
||||||
|
volatile int8_t dir = -1;
|
||||||
|
|
||||||
|
ISR(TIMER2_OVF_vect)
|
||||||
|
{
|
||||||
|
if(state == 0){
|
||||||
|
PORTC &= ~(1<<id);
|
||||||
|
}else{
|
||||||
|
PORTC |= (1<<id);
|
||||||
|
id = (id + dir) % 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = (state+1) % 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(PCINT1_vect){
|
||||||
|
if(dir == 1)
|
||||||
|
dir = -1;
|
||||||
|
else
|
||||||
|
dir = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRC = (0xff);
|
||||||
|
PORTC = (0xff);
|
||||||
|
|
||||||
|
|
||||||
|
DDRB &= ~_BV(DDB0);
|
||||||
|
PORTB |= _BV(PORTB0);
|
||||||
|
|
||||||
|
// timer int
|
||||||
|
TCCR2B |= _BV(CS22) | _BV(CS21) | _BV(CS20);
|
||||||
|
TIMSK2 |= _BV(TOIE2);
|
||||||
|
|
||||||
|
EICRA |= _BV(ISC11) | _BV(ISC10);
|
||||||
|
EIMSK |= _BV(INT1);
|
||||||
|
|
||||||
|
// enable for pin 8 - PB0
|
||||||
|
PCMSK1 |= _BV(PCINT8);
|
||||||
|
PCICR |= _BV(PCIE1);
|
||||||
|
|
||||||
|
sei();
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
56
lectures/Timer/timer-debouncer.c
Normal file
56
lectures/Timer/timer-debouncer.c
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
volatile uint8_t button_reset_counter;
|
||||||
|
volatile uint8_t button_press_count;
|
||||||
|
|
||||||
|
// decrease reset_counter until 0
|
||||||
|
ISR(TIMER2_OVF_vect)
|
||||||
|
{
|
||||||
|
button_reset_counter -= button_reset_counter == 0 ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update press_counter on interrupt if reset == 0
|
||||||
|
ISR(PCINT2_vect){
|
||||||
|
if (button_reset_counter == 0){
|
||||||
|
button_press_count++;
|
||||||
|
button_reset_counter = 20;
|
||||||
|
|
||||||
|
if(button_press_count % 2 == 0){
|
||||||
|
PORTD &= ~(1<<5);
|
||||||
|
}else{
|
||||||
|
PORTD |= (1<<5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
// C7 as input for external interrupt
|
||||||
|
DDRC &= ~_BV(DDC7);
|
||||||
|
PORTC |= _BV(PORTC7);
|
||||||
|
|
||||||
|
// D5 as output
|
||||||
|
DDRD = _BV(PD5);
|
||||||
|
PORTD = _BV(PD5);
|
||||||
|
|
||||||
|
|
||||||
|
// TIMER 2 setup
|
||||||
|
TCCR2B |= _BV(CS22) | _BV(CS21) | _BV(CS20);
|
||||||
|
TIMSK2 |= _BV(TOIE2);
|
||||||
|
|
||||||
|
|
||||||
|
cli();
|
||||||
|
// rising edge interrupt on INT2
|
||||||
|
EICRA |= _BV(ISC20);
|
||||||
|
EIMSK |= _BV(INT2);
|
||||||
|
|
||||||
|
// enable external interrupt for pin 23 - PC7
|
||||||
|
PCMSK2 |= _BV(PCINT23);
|
||||||
|
PCICR |= _BV(PCIE2);
|
||||||
|
|
||||||
|
sei();
|
||||||
|
|
||||||
|
for(;;){}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
51
lectures/Timer/timer-idk.c
Normal file
51
lectures/Timer/timer-idk.c
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include<avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
volatile uint8_t id;
|
||||||
|
volatile uint8_t state;
|
||||||
|
volatile int8_t dir = -1;
|
||||||
|
|
||||||
|
ISR(TIMER2_OVF_vect)
|
||||||
|
{
|
||||||
|
if(state == 0){
|
||||||
|
PORTC &= ~(1<<id);
|
||||||
|
}else{
|
||||||
|
PORTC |= (1<<id);
|
||||||
|
id = (id + dir) % 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = (state+1) % 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(PCINT1_vect){
|
||||||
|
if(dir == 1)
|
||||||
|
dir = -1;
|
||||||
|
else
|
||||||
|
dir = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRC = (0xff);
|
||||||
|
PORTC = (0xff);
|
||||||
|
|
||||||
|
|
||||||
|
DDRB &= ~_BV(DDB0);
|
||||||
|
PORTB |= _BV(PORTB0);
|
||||||
|
|
||||||
|
// timer int
|
||||||
|
TCCR2B |= _BV(CS22) | _BV(CS21) | _BV(CS20);
|
||||||
|
TIMSK2 |= _BV(TOIE2);
|
||||||
|
|
||||||
|
EICRA |= _BV(ISC11) | _BV(ISC10);
|
||||||
|
EIMSK |= _BV(INT1);
|
||||||
|
|
||||||
|
// enable for pin 8 - PB0
|
||||||
|
PCMSK1 |= _BV(PCINT8);
|
||||||
|
PCICR |= _BV(PCIE1);
|
||||||
|
|
||||||
|
sei();
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
44
lectures/Timer/timer-interrupt.c
Normal file
44
lectures/Timer/timer-interrupt.c
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#include<avr/io.h>
|
||||||
|
#include<util/delay.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#define DELAY_TIME 150
|
||||||
|
|
||||||
|
volatile uint8_t id;
|
||||||
|
volatile uint8_t state;
|
||||||
|
|
||||||
|
ISR(TIMER2_OVF_vect, ISR_NAKED)
|
||||||
|
{
|
||||||
|
if(state == 0){
|
||||||
|
PORTC &= ~(1<<id);
|
||||||
|
state++;
|
||||||
|
}else{
|
||||||
|
PORTC |= (1<<id);
|
||||||
|
state = 0;
|
||||||
|
id++;
|
||||||
|
if(id == 8)
|
||||||
|
id = 0;
|
||||||
|
}
|
||||||
|
reti();
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_led(int id){
|
||||||
|
PORTC &= ~(1<<id);
|
||||||
|
_delay_ms(DELAY_TIME);
|
||||||
|
PORTC |= (1<<id);
|
||||||
|
_delay_ms(DELAY_TIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRC = (0xff);
|
||||||
|
PORTC = (0xff);
|
||||||
|
|
||||||
|
TCCR2B |= (0b111);
|
||||||
|
|
||||||
|
TIMSK2 |= 0b1;
|
||||||
|
|
||||||
|
sei();
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
58
lectures/Timer/timer8bitled.c
Normal file
58
lectures/Timer/timer8bitled.c
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#include<avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
volatile uint8_t id;
|
||||||
|
volatile uint8_t state;
|
||||||
|
volatile int8_t dir = -1;
|
||||||
|
|
||||||
|
// ISR(TIMER2_OVF_vect)
|
||||||
|
// {
|
||||||
|
// if(state == 0){
|
||||||
|
// PORTC &= ~(1<<id);
|
||||||
|
// }else{
|
||||||
|
// PORTC |= (1<<id);
|
||||||
|
// id = (id + dir) % 8;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// state = (state+1) % 2;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// ISR(PCINT1_vect){
|
||||||
|
// if(dir == 1)
|
||||||
|
// dir = -1;
|
||||||
|
// else
|
||||||
|
// dir = 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
// DDRC = (0xff);
|
||||||
|
// PORTC = (0xff);
|
||||||
|
|
||||||
|
|
||||||
|
DDRB |= _BV(DDB3);
|
||||||
|
PORTB &= ~_BV(PORTB3);
|
||||||
|
|
||||||
|
// timer int
|
||||||
|
// TCCR2B |= _BV(CS22) | _BV(CS21) | _BV(CS20);
|
||||||
|
// TIMSK2 |= _BV(TOIE2);
|
||||||
|
|
||||||
|
// EICRA |= _BV(ISC11) | _BV(ISC10);
|
||||||
|
// EIMSK |= _BV(INT1);
|
||||||
|
|
||||||
|
// enable for pin 8 - PB0
|
||||||
|
// PCMSK1 |= _BV(PCINT8);
|
||||||
|
// PCICR |= _BV(PCIE1);
|
||||||
|
|
||||||
|
// sei();
|
||||||
|
|
||||||
|
TCCR0A |= _BV(COM0A0);
|
||||||
|
TCCR0A &= ~_BV(COM0A1);
|
||||||
|
|
||||||
|
TCCR0B |= _BV(CS02) | _BV(CS00);
|
||||||
|
TCCR0B &= ~_BV(CS01);
|
||||||
|
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
16
lectures/Timer/timerCMP.c
Normal file
16
lectures/Timer/timerCMP.c
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include<avr/io.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRB |= _BV(DDB7);
|
||||||
|
PORTB &= ~_BV(PORTB7);
|
||||||
|
|
||||||
|
TCCR3A |= _BV(COM3B0);
|
||||||
|
TCCR3A &= ~_BV(COM3A1);
|
||||||
|
TCCR3B |= _BV(CS32) | _BV(CS30) | _BV(WGM32);
|
||||||
|
|
||||||
|
OCR3A = 0x0FFF;
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
36
lectures/Timer/timerInterruptCounter.c
Normal file
36
lectures/Timer/timerInterruptCounter.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
volatile uint8_t state;
|
||||||
|
volatile uint8_t count;
|
||||||
|
|
||||||
|
|
||||||
|
ISR(TIMER0_OVF_vect)
|
||||||
|
{
|
||||||
|
if(++count == 100){
|
||||||
|
count = 0;
|
||||||
|
state = (state+1) % 2;
|
||||||
|
if(state){
|
||||||
|
PORTC &= ~(1<<PC0);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
PORTC |= (1<<PC0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRC |= _BV(PC0);
|
||||||
|
PORTC &= ~_BV(PORTC0);
|
||||||
|
|
||||||
|
TCCR0A |= (1<<COM0A0);
|
||||||
|
TCCR0B |= _BV(CS02) | _BV(CS00);
|
||||||
|
|
||||||
|
TIMSK0 |= _BV(TOIE0);
|
||||||
|
|
||||||
|
sei();
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
18
lectures/Timer/timerPWM1-8.c
Normal file
18
lectures/Timer/timerPWM1-8.c
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
DDRD |= _BV(PD5);
|
||||||
|
PORTD &= ~_BV(PORTD5);
|
||||||
|
|
||||||
|
|
||||||
|
TCCR1A |= _BV(COM1A1) | _BV(WGM11);
|
||||||
|
TCCR1B |= _BV(WGM13);
|
||||||
|
TCCR1B |= _BV(CS10) | _BV(CS11);
|
||||||
|
|
||||||
|
ICR1 = 0xFFFF;
|
||||||
|
OCR1A = 0x2FFF;
|
||||||
|
|
||||||
|
for(;;);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user