📄 lcdser.cpp
字号:
// LcdSer.cpp : Defines the entry point for the application.
//
#include "LcdSer.h"
CItsLcd::CItsLcd()
{
if (FALSE == MapPIO())
{
RETAILMSG(DBGMSGON,(_T("::Lcd map io space failed!!\n")));
}
if (FALSE == lcd_init())
{
RETAILMSG(DBGMSGON,(_T("::Init lcd failed!!\n")));
}
}
CItsLcd::~CItsLcd()
{
if (v_pIOPRegs)
{
VirtualFree((PVOID) v_pIOPRegs, 0, MEM_RELEASE);
v_pIOPRegs = NULL;
}
}
void CItsLcd::LCD_PowerUp()
{
CtlCode(EXIT_SLEEP_MODE);
CtlCode(FOUNCTION_SET_RE0_8BIT);
}
void CItsLcd::LCD_PowerDown()
{
CtlCode(FOUNCTION_SET_RE1_8BIT_ENPLOT);
CtlCode(ENTER_SLEEP_MODE);
}
BOOL CItsLcd::MapPIO()
{
BOOL RetValue;
v_pIOPRegs = (volatile IOPreg*)VirtualAlloc(0, sizeof(MEMreg), MEM_RESERVE, PAGE_NOACCESS);
if (v_pIOPRegs == NULL)
{
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(MEMreg), PAGE_READWRITE | PAGE_NOCACHE))
{
RetValue = FALSE;
}
}
if (!RetValue)
{//InitializeAddresses - Failed !!
if (v_pIOPRegs)
{
VirtualFree((PVOID) v_pIOPRegs, 0, MEM_RELEASE);
}
v_pIOPRegs = NULL;
return(RetValue);
}
v_pIOPRegs->rGPBCON &= (~(0x3<<20));
v_pIOPRegs->rGPBCON |= (0x1<<20);
v_pIOPRegs->rGPBCON &= (~(0x3<<14));
v_pIOPRegs->rGPBCON |= (0x1<<14);
v_pIOPRegs->rGPBCON &= (~(0x3<<10));
v_pIOPRegs->rGPBCON |= (0x1<<10);
return(RetValue);
}
BOOL CItsLcd::lcd_init()
{
UCHAR command_data;
Delay_n_us(40);
command_data=0x30;
CtlCode(command_data); /*功能设置:一次送8位数据,基本指令集*/
command_data=0x06;
CtlCode(command_data); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
command_data=0x0c;
CtlCode(command_data); /*显示设定:开显示,不显示光标,不允许当前显示位反白闪动*/
command_data=0x01;
CtlCode(command_data); /*清DDRAM*/
command_data=0x02;
CtlCode(command_data); /*DDRAM地址归位*/
command_data=0x80;
CtlCode(command_data); /*把显示地址设为0X80,即为第一行的首位*/
return TRUE;
}
void CItsLcd::CtlCode(UCHAR command_data)
{
UCHAR i, temp;
temp = 0xf8;
Delay_n_us(100);
if (0x20 == (command_data & 0xe0))
{ //function set, save it.
cCurrentFun = command_data;
}
LCD_CS(TRUE);
for(i = 0; i < 8; i++)
{
LCD_SET_DAT(temp&0x80);
LCD_SCLK_JUMP();
temp <<= 1;
}
LCD_SEND_BYTE(command_data);
LCD_CS(FALSE);
}
void CItsLcd::LCDPrint(PCHAR DatStr, CHAR Position)
{
UCHAR i, temp;
temp = 0xfa;
Sleep(1);
if (Position != NULL)
{
CtlCode(Position);
}
LCD_CS(TRUE);
for(i = 0; i < 8; i++)
{
LCD_SET_DAT(temp&0x80);
LCD_SCLK_JUMP();
temp <<= 1;
}
while(*DatStr != '\0')
{
LCD_SEND_BYTE(*DatStr);
DatStr++;
}
LCD_CS(FALSE);
}
void CItsLcd::LCDPrint(PCHAR DatStr, INT iVar, CHAR Position)
{
CHAR temp, temp1, cItoChr[10], DatBuffer[21];
INT i = 0, j = 0;
while (*DatStr != '\0')
{
temp = *DatStr;
temp1 = *(DatStr+1);
if ('%' == temp)
{
switch(temp1)
{
case 'd':
case 'D':
_itoa(iVar, cItoChr, 10);
break;
case 'x':
case 'X':
_itoa(iVar, cItoChr, 16);
break;
default:
_itoa(iVar, cItoChr, 10);
break;
}
RETAILMSG(DBGMSGON, (_T("strlen(cItoChr) = %d\n"), strlen(cItoChr)));
while (cItoChr[j] != '\0')
{
DatBuffer[i] = cItoChr[j];
i++;
j++;
RETAILMSG(DBGMSGON, (_T("::::::::i = %d j = %d\n"), i, j));
}
if (i%2 != 0)
{
DatBuffer[i] = 0x20;
i++;
}
DatStr += 2;
}
DatBuffer[i] = *DatStr;
i++;
DatStr++;
RETAILMSG(DBGMSGON, (_T("i = %d\n"), i));
}
DatBuffer[i] = '\0';
LCDPrint(DatBuffer, Position);
}
void CItsLcd::LCD_ReverseVideo(DWORD row)
{
BYTE FunTemp;
FunTemp = cCurrentFun;
if ((cCurrentFun & 0x34) != 0x34)
{
CtlCode(0x34);
}
switch(row)
{
case 1:
CtlCode(0x04);
break;
case 2:
CtlCode(0x05);
break;
}
CtlCode(FunTemp);
}
void CItsLcd::LCD_Cursor(DWORD OnorOff, CHAR Position)
{
if (0 == OnorOff)
{
CtlCode(0x0c);
}
else
{
CtlCode(Position);
CtlCode(0x0d);
}
}
//GPB10 片选
void CItsLcd::LCD_CS(BOOL x)
{
if (TRUE == x)
{//设置为高电平
v_pIOPRegs->rGPBDAT |= (1<<10);
}
else
{
(v_pIOPRegs->rGPBDAT &= ~(1<<10));
}
}
//GPB5 数据传输
void CItsLcd::LCD_SET_DAT(BOOL x)
{
if (x != 0)
{//设置为高电平
v_pIOPRegs->rGPBDAT |= (1<<5);
}
else
{
(v_pIOPRegs->rGPBDAT &= ~(1<<5));
}
}
//GPB7 模拟时钟
void CItsLcd::LCD_SCLK_JUMP()
{
v_pIOPRegs->rGPBDAT |= (1<<7);
Delay_n_us(1);
(v_pIOPRegs->rGPBDAT &= ~(1<<7));
//Sleep(1);
}
void CItsLcd::LCD_SEND_BYTE(UCHAR dat)
{
UCHAR temp, i;
temp = dat;
temp &= 0xf0;
for(i = 0; i < 8; i++)
{
LCD_SET_DAT(temp&0x80);
LCD_SCLK_JUMP();
temp <<= 1;
}
temp = dat;
temp &=0x0f;
temp <<= 4;
temp &= 0xf0;
for(i = 0; i < 8; i++)
{
LCD_SET_DAT(temp&0x80);
LCD_SCLK_JUMP();
temp <<= 1;
}
}
void CItsLcd::Delay_n_us(int n)
{
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
if(QueryPerformanceFrequency(&litmp)==FALSE)
{
return;
}
dfFreq = (double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;
do
{
QueryPerformanceCounter(&litmp);
QPart2=litmp.QuadPart;
dfMinus=(double)(QPart2-QPart1);
dfTim=dfMinus/dfFreq;
}while(dfTim <0.000001*n);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -