Djangirov1 / Vfrc2
.doc
Тема: Вывод информации на различные устройства отображения
Цель работы: научиться осуществлять вывод на различные устройства отображения с помощью микроконтроллера.
Вариант 13
Задание №1
Реализовать вывод фамилии, имени, отчества (транслитом) на виртуальный терминал Proteus VSM.
Код:
#include <avr/io.h>
#include <stdio.h>
#include <string.h>
#define FOSC 11059200 // частота кварца
#define BAUD 9600 // скорость передачи данных
#define USART_UBBR_VALUE (FOSC/16/BAUD)-1 // значение, которое необходимо записать
//в UBRR чтобы получить требуемую скорость передачи
void USART_Init(void);
uint8_t USART_vReceiveByte(FILE *stream);
void USART_vSendByte(uint8_t u8Data, FILE *stream);
// Создаем поток для ввода/вывода на/с UART для использования стандартных
// функции ввод/вывода
FILE uart_file=FDEV_SETUP_STREAM(USART_vSendByte, USART_vReceiveByte,_FDEV_SETUP_RW); // поток доступен для чтения и записи
void USART_Init(void)
{ // установить скорость передачи данных
UBRRH=(uint8_t)((USART_UBBR_VALUE)>>8);
UBRRL=(uint8_t)(USART_UBBR_VALUE);
// Установить формат кадра - 8 бит, нет проверки четности, 1 стоп бит
UCSRC = (1<<URSEL)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
// Включить передатчик и приемник
UCSRB = (1<<RXEN)|(1<<TXEN);
UBRRH=(uint8_t)((USART_UBBR_VALUE)>>8);
}
void USART_vSendByte(uint8_t u8Data, FILE *stream)
{
// подождать пока передастся прошлый бит
while((UCSRA&(1<<UDRE)) == 0);
// передать данные
UDR = u8Data;
}
uint8_t USART_vReceiveByte(FILE *stream)
{
// Подождать пока осуществиться прием байта
while((UCSRA&(1<<RXC)) == 0);
// возвратить принятые данные
return UDR;
}
int main( void )
{
stdout=stdin=&uart_file; // указываем, что стандартные потоки должны ссылаться на //созданный
//поток
uint8_t i=0; // счетчик цикла
DDRD=0b11111110; // устанавливаем первый вывод порта D на ввод, остальные на вывод
//(первый вывод служит для приема данных с USART, второй – для передачи)
char str[]="Kromykh Vladislav"; // выводимая строка
USART_Init(); // инициализация USART
while(1){
for (i=0;i<=strlen(str);i++)
{
printf("%s\n\r", str);
}}
;
return 0;
}
Скриншот работы в Proteus:
Задание №2
Реализовать вывод на два семисегментных индикатора информации согласно варианту в таблице по нажатию кнопки, подключенной к нулевому выводу порта А. Если значение нельзя отобразить на индикаторе, то начать с начального. Проверить работу программы в Proteus VSM.
Код:
//#include <delay.h>
//#include <mega16.h>
#include<avr/io.h>
#include<util/delay.h>
#include<string.h>
#include<stdio.h>
unsigned char number[] =
{
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};
unsigned char count1 = 8;
unsigned char count2 = 5;
void funct(int x) //функция вычитает значение-параметр из числа отображённого на индикаторах
{
if((count2-x)<0)
{
count2=count2+10-x;
if(count1==0)
{
count1=8;
count2=5;
PORTB=number[count1];
PORTD=number[count2];
}
else
{
count1--;
PORTB=number[count1];
PORTD=number[count2];
}
}
else
{
count2-=x;
PORTD=number[count2];
}
_delay_ms(100); //
}
void init()
{
PORTB = 0x7f;//начальная 8 на одном индикаторе
DDRB = 0xff;//порт на вывод
PORTD = 0x6d;//начальная 5 на втором
DDRD = 0xff;
PORTA = 0x00;//обнуление регистра с кнопкой
DDRA = 0x00; //порт на ввод
}
void main( void )
{
init();
while(1)
{
int temp = PINA; //опрос порта А
if(temp == 1)//если кнопка нажата
{
funct(1);
}
else
{
funct(3);
}
}
}
Скриншот работы в Proteus:
Задание №3
Реализовать вывод фамилии, имени, отчества (транслитом) на жидкокристаллическийдисплей в программе Proteus VSM.
Код:
#include <avr/delay.h>
#include<avr/io.h>
#include "lcd_lib.h"
void main(void)
{
DDRA=0b11110111;
DDRB=0xFF;
while(1)
{
unsigned char line1[]="Yavkin Aleksandr";
LCDinit();
LCDclr();
LCDcursorOFF();
LCDGotoXY(0,0);
LCDstring(line1, sizeof(line1)-1);
_delay_ms(1);
}
}
Скриншот работы в Proteus:
Задание №4
Реализовать на микроконтроллере программу вывода на светодиодную матрицу следующих символов и знаков (знакоместо 8Ч5 ):
Вариант №13 Буквы Б, B, Г.
Код:
#include <avr/io.h>
#include <stdio.h>
#include <string.h>
#include <util/delay.h>
int text[] ={0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b00000000,0b01110110,0b01110110,0b01110110,0b01111001,0b11111111,0b11111111,0b11111111,0b00000000,0b01110110,0b01110110,0b01110110,0b10011001,0b11111111,0b11111111,0b11111111,0b11111111,0b00000000,0b01111111,0b01111111,0b01111111,0b00111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111};
void Output(int *letter,int *counter)
{
int i,j=1;
for (i=0;i<8;i++)
{
PORTA=j;
PORTB=letter[i+*counter];
j*=2;
_delay_ms (1);
}
}
int main( void )
{
DDRA = 0xFF;
DDRB = 0xFF;
int t = 0;
int delay = 50;
int counter=0;
while(1)
{
if (counter>27) {counter=0;}
for (t=0;t<delay;t++)
{
Output(text,&counter);
}
counter++;
}
return 0;
}
Скриншот работы в Proteus:
Вывод: на этой лабораторной работе я научился осуществлять вывод информации с МК на различные устройства отображения информации