Текст программы лабораторной работы №3 (LCD)

 

 

// LCD DEFINE SYMBOLS

//--COMMAND CONSTANTS

#define CLEAR 0x01 //requires delay cylce of min 57 NOPs

#define HOME 0x02

#define ENTRY_MODE 0x04

#define DISPLAY_CTRL 0x08

#define SHIFT 0x10

#define FUNCTION_SET 0x20

#define RAM_CG 0x40

#define RAM_DD 0x80

#define BF_AC 0x80 //Read Busy flag (DB7) and AC (DB6-0)

//--COMMAND OPTIONS

#define INCR 0x02

#define DISPLAY_SHIFT 0x01

#define DISPLAY_ON 0x04

#define CURSOR_ON 0x02

#define BLINK 0x01

#define DISPLAY 0x08

#define RIGHT 0x04

#define EIGHT_BITS 0x10

#define TWO_LINE 0x08

 

#include <string.h>

#include <math.h> //Описание портов ПЛИС MAX3064

#include "ADuC831.h"//список подключаемых модулей к программе.

 

void LCD_GotoXY(int x,bit y);

 

#define MAXBASE 0xFF

 

void WriteMax(unsigned char xdata *regnum, unsigned char val)

{

unsigned char oldDPP=DPP;

DPP=MAXBASE;

*regnum=val;

DPP=oldDPP;

}

 

static bit CurPosCtrl=1; //Отслеживание текущей позиции курсора (1 - включено, 0 - выключено)

 

void SwitchCurPosControl(bit o) //Включает или отключает отслеживание текущей позиции курсора

//используется функциями LCD_Putch() и LCD_GotoXY()

{

CurPosCtrl=o;

}

 

void Strobe(char c) // Подача стробирующего сигнала E интерфейса ПЛИС<->ЖКИ на время не менее 500 нс.

//Одновременно подаются сигналы R/W и RS в заданном аргументом c значении.

 

{

unsigned int i;

WriteMax(0x6,c|0x1); // Установка строба E

WriteMax(0x6,c&0xFE); //Сброс строба

for (i=0;i<300;i++)continue; //Задержка на время исполнения команды (>1.59ms)

}

 

void LCD_SwitchCursor(bit cursor, bit blink) //Включение/выключение курсора, вкл./выкл. мигания

{

unsigned char i=0;

WriteMax(0x1,DISPLAY_CTRL|DISPLAY_ON|((cursor)?CURSOR_ON:0)|((blink)?BLINK:0));

Strobe(0x8);

for(; i<200; i++)continue;

}

void LCD_Clear(void) //Очистка ЖКИ и установка текущей позиции на первый символ первой строки

{

int i;

WriteMax(0x1,CLEAR);

Strobe(0x8);

for(i=0; i<1600; i++)continue;

}

 

void LCD_InitDefault(void) // Инициализация ЖКИ

{

unsigned int i;

char c=0,cmd=0;

for(i=0; i<40000; i++)continue; //Ожидание включения ЖКИ (>150мс после подачи питания)

cmd = 0x30; //

WriteMax(0x1,cmd);

Strobe(c);

for(i=0; i<10000; i++)continue; //Ожидание, предусмотренное протоколом инициализации (здесь больше в 6 раз - 25мс)

cmd = 0x30; //

WriteMax(0x1,cmd);

Strobe(c);

for(i=0; i<1000; i++)continue;

cmd = 0x30; //

WriteMax(0x1,cmd);

Strobe(c);

for(i=0; i<100; i++)continue;

cmd = 0x38; //

WriteMax(0x1,cmd);

Strobe(c);

cmd = 0x08; //

WriteMax(0x1,cmd);

Strobe(c);

cmd = 0x01; //

WriteMax(0x1,cmd);

Strobe(c);

for(i=0; i<1600; i++)continue;

cmd = ENTRY_MODE|INCR; //

WriteMax(0x1,cmd);

Strobe(c);

cmd = 0x0F; //Display ON

WriteMax(0x1,cmd);

Strobe(c);

WriteMax(0x6,0x8); //Switching off the VLO - for 64MAX only

}

 

void LCD_Putch(char ch) //Вывод на текущую позицию символа. Текущая позиция определяется в зависимости

//от значения флага CurPosCtrl: если он установлен, то по переменным cur_x, cur_y

//(при этом она увеличивается с каждым выведенным символом);если он сброшен,

//то по внутреннему указателю ЖКИ (не увеличивается по выводу символа).

{

static char curpos=0; //0-15

static bit y=0;

char c=0x0C;

 

if(curpos>15)curpos=0,y=~y;

 

WriteMax(0x1,ch);

Strobe(c);

 

if(CurPosCtrl) curpos++;

}

 

void LCD_GotoXY(int x,bit y) //Установка текущей позиции ЖКИ. Вход: int x - номер столбца (позиции в строке): 0..15;

//bit y - номер строки: 0..1.

 

{

char ch=0x8;

WriteMax(0x1,RAM_DD|(x+((y)?0x40:0)));

Strobe(ch); //set ram

}

void LCD_Type(char* s) //Вывод ASCIIZ-строки на ЖКИ , начиная с текущей позиции. Вход: char *s - указатель на строку.

 

{

bit OldCurPos = CurPosCtrl;

CurPosCtrl = 1;

while(*s) LCD_Putch(*s++);

CurPosCtrl = OldCurPos;

}

 

void Delay(long int count)

{

long int j;

for(j=0;j<count;j++)10.4994/2.333;

}

// Основная функция программы

void main(void)

{

LCD_InitDefault(); // Инициализация дисплея

LCD_Clear(); // Очистка дисплея

 

LCD_Putch('>'); // Вывод символа

LCD_Type("Text:"); // Вывод строки

 

while(1)

{

LCD_GotoXY(1,1);

LCD_Type("The first string ");

Delay(10000);

 

LCD_GotoXY(1,1);

LCD_Type("You are crazy!");

Delay(10000);

 

LCD_GotoXY(1,1);

LCD_Type("Third string. ");

Delay(10000);

}; // Зацикливание

}

 

 

ПРИЛОЖЕНИЕ Д

(обязательное)








Дата добавления: 2018-11-25; просмотров: 317;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.011 сек.