Текст программы лабораторной работы №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;