Текст программы лабораторной работы №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); }; // Зацикливание }
|