Каждый, у кого нет машины, мечтает её купить; и каждый, у кого есть машина, мечтает её продать. И не делает этого только потому, что, продав, останешься без машины. (К-ф 'Берегись автомобиля')
Программное обеспечение стробоскопа
#include <avr/io.h>
#include <avr/interrupt.h> //для доступа к sei
#include <avr/signal.h> //для доступа к макросу SIGNAL
#include <avr/delay.h>
#include <util/delay.h>
#include <math.h>
#define Freq 8000000 //частота системной синхронизации в Гц
int ZhachPreob,Napr,n,R,Pezim,c,U,Z,Z1,I,N;
unsigned int CurrentTime,PreviousTime,T,UGL; // временные переменнные
unsigned char addr;
//---------Интерфейс ЖКИ-----------//
// A0 R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7//
// PA5 PA6 PA7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7//
//---------------------------------//
#define A0 PA5 //линия выбора регистра
#define RW PA6 //линия выбора операции
#define E PA7 //линия стробирования / синхронизации
#define BS PC7 //флаг занятости
unsigned char str1[] = "Работа";
unsigned char str2[] = "Стробоскоп";
unsigned char str3[] = "Тахометр";
unsigned char str4[] = "Вольтметр";
char buffer[15];
//------------------------------Ожидание готовности-------------------------------------------
void LCD_wait (void)
{
do
{
DDRC = 0x00; //порт на вход
PORTC = 0xFF; //подтяжка
PORTA &=~_BV(A0); //A0=0 (команда)
PORTA |=_BV(RW); //RW=1 (чтение)
PORTA |=_BV(E); //E=1
_delay_us(0); //задержка в 1 mc
PORTA &=~_BV(E); //E=0
}
while (bit_is_set(PINC,BS)); //ожидать сброса флага занятости
PORTA &=~_BV(RW); //RW=0
PORTA &=~_BV(E); //E=0
}
//-----------------------------Запись в LCD-------------------------------------------------------
void LCD_write (unsigned char p)
{
PORTA &=~_BV(RW); //RW=0
PORTA |=_BV(E); //E=1
DDRC = 0b11111111; //порт C на выход
PORTC = 0b00000000; //подтяжка порта C
_delay_us(0); //задержка в 1 mc
PORTC = p; //запись байта
_delay_us(0);
PORTA &=~_BV(E); //E=0
PORTA &=~_BV(RW); //RW=0
DDRC = 0x00; //порт C на вход
PORTC = 0xFF;
_delay_us(0);
}
//-----------------------------Чтение из LCD-----------------------------------------------------
unsigned char LCD_read(void)
{
unsigned char p; //p-прочитанный байт данных
PINC = 0x00; //порт на вход
PORTC = 0xFF; //подтяжка
PORTA |=_BV(RW); //RW=1 (чтение)
PORTA |=_BV(E); //E=1
_delay_us(0);
p = PINC; //чтение входных данных
PORTA &=~_BV(E); //E=0
_delay_us(0);
PORTA &=~_BV(RW); //RW=0
PORTA &=~_BV(E); //E=0
return (p);
}
//------------Функция ЗАПИСИ КОМАНДЫ (IR) в ЖКИ---------------------------------
void LCD_com_write (unsigned char p) //p-байт команды
{
LCD_wait (); //ожидание готовности
PORTA &=~_BV(A0); //A0=0 (команда)
LCD_write (p); / /запись команды в ЖКИ
}
//-----------Функция ЗАПИСИ ДАННЫХ (DR) в ЖКИ-----------------------------------
void LCD_data_write (unsigned char p)//p-байт данных
{
LCD_wait (); //ожидание готовности
PORTA |=_BV(A0); //A0=1 (данные)
LCD_write (p); //запись команды в ЖКИ
}
//-----------Функция ЧТЕНИЯ СЧЕТЧИКА АДРЕСА ЖКИ-----------------------------
unsigned char LCD_addr_read(void)
{
unsigned char p; //содержимое счетчика адреса
LCD_wait ();
PORTA &=~_BV(A0); //A0=0 (команда)
p = LCD_read(); //чтение команды из ЖКИ
p = (p & 0b01111111); //отбрасывание бита занятости
return (p); //функция возвращает прочитанное
// содержание адреса счетчика
}
//-----------Функция ЗАПИСИ команды в ЖКИ (при инициализации)------------------
void LCD_com_init (unsigned char p)
{
DDRC = 0b11111111; //порт D на выход
PORTC = 0b00000000; //подтяжка порта D