[mw_shl_code=c,true]#ifndef __T6963C_DRIVER_H
#define __T6963C_DRIVER_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//
//Zkek
//辊缝仪 信息显示
//775286866@qq.com
//
//修改日期:2014/12/25
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) Zkek 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
#define LCM_WR PEout(2) //0有效
#define LCM_CE PEout(3) //0有效
#define LCM_RD PEout(4) //0有效
#define LCM_D0C1 PEout(5) //0

ata 1:Command
#define LCM_RST PEout(6) //0有效
#define PIN_OUT 0
#define PIN_IN (!0)
#define LCM_OUT_PORT (GPIOF ->ODR)
#define LCM_IN_PORT ((GPIOF ->IDR) & 0xFF)
//---------------define LCM characteristic ----------------------//
#define graphic_addr (BlocksWidth * BlocksHeight)
#define text_addr 0x0000
#define lcm_x_dots 240
#define lcm_y_dots 64
#define BlockDotsX 8
#define BlockDotsY 8
#define BlocksWidth 30 //显示区宽度
#define BlocksHeight 8
#define longWidth 16
#define shortWidth 8
#define graphicMode 0x98
#define textMode 0x9C
#define dataInstrRWRdy 0x03
#define dataAutoWRdy 0x08
#define displayMode_OR 0x80
#define displayMode_NOR 0x81
#define displayMode_AND 0x83
#define cmdSetTextOffsetAddr 0x40
#define cmdSetTextAreaWidth 0x41
#define cmdSetGraphicOffsetAddr 0x42
#define cmdSetGraphicAreaWidth 0x43
#define cmdSetRamAddr 0x24
#define cmdDataAutoWrOn 0xB0
#define cmdDataAutoWrOff 0xB2
#define iCursorOn 0x02
#define iCursorBlink 0x01
//LCM Zone
//////////////////设置LCM的DB方向,
//ucIoType !0为输入,0为输出
void SetLcmPinType(u8 ucIoType);
void SetLcmIoIn(void);
void SetLcmIoOut(void);
u8 RetrieveLcmStat(void);
u8 LcmIsBusy(void);
u8 SendCmdToLcm(u8 ucCmd);
u8 SendDataToLcm(u8 ucCmd);
u8 ReadDataFromLcm(void);
u8 LcmWordCmd(u8 ucData1, u8 ucData2, u8 ucCmd);
u8 LcmByteCmd(u8 ucData1, u8 ucCmd);
u8 LcmNoneDataCmd(u8 ucCmd);
u8 LcmTextClear(void);
u8 LcmGraphicClear(void);
u8 LcmAutoWr(u8 ucData);
u8 LcmDisplayTextChar(u8 ucRow, u8 ucColumn, u8 ucChar);
u8 LcmTextFormat(u8 ucChar);
u8 LcmGraphicFormat(u8 ucChar);
//
u8 LcmInit(u8 ucMode); //初始化Lcm显示
u8 LcmDisplayGraphicChar(u8 ucRow, u8 ucColumn, u8 ucCharIndex);
u8 LcmGraphicCharShow(u8 ucRow, u8 ucColumn, u8 ucCharIndex);
u8 LcmGraphicSpread(void);
#endif[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true]#include "T6963C_Driver.h"
#include "zkekglobe.h"
#include "CommUse.h"
#include "board.h"
#include "delay.h"
#include "Fonts.h"
//////////////////////////////////////////////////////////////////////////////////
//
//Zkek
//辊缝仪 信息显示
//775286866@qq.com
//
//修改日期:2014/12/25
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) Zkek 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//////////////////设置LCM的DB方向,
//ucIoType !0为输入,0为输出
void SetLcmPinType(u8 ucIoType)
{
if(ucIoType)
{
SetLcmIoIn();
}
else
{
SetLcmIoOut();
}
}
void SetLcmIoIn(void)
{
GPIO_Set(GPIOF, PIN0 | PIN1 | PIN1 | PIN2 | PIN3 | PIN4 | PIN5 | PIN6 | PIN7, GPIO_MODE_IN, 0, 0, GPIO_PUPD_PD);
}
void SetLcmIoOut(void)
{
GPIO_Set(GPIOF, PIN0 | PIN1 | PIN1 | PIN2 | PIN3 | PIN4 | PIN5 | PIN6 | PIN7, GPIO_MODE_OUT, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PD);
}
u8 LcmInit(u8 ucMode)
{
u8 ucStat= 1;
u16 uwAddr;
//PF0-7 LCM_DB0-7
SetLcmPinType(PIN_OUT);
LCM_OUT_PORT &= (~0xFF);
//PE2-6 LCM_WR LCM_CE LCM_RD LCM_C/D LCM_RST
GPIO_Set(GPIOE, PIN2 | PIN3 | PIN4 | PIN5 | PIN6, GPIO_MODE_OUT, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PD);
LCM_WR = 1;
LCM_RD = 1;
LCM_CE = 1;
LCM_RST = 1;
LCM_RST = 0; //重启
delay_ms(20); //此处保证要有5ms以上才能保证复位稳定,推荐20ms
LCM_RST = 1; //启动
delay_ms(20); //此处保证要有5ms以上才能保证复位稳定,推荐20ms
LCM_CE = 0; //使能
do {
//显示方式:逻辑或, 内部CGRAM关闭
if(LcmNoneDataCmd(0x88))
{
break;
}
//文本显示区域首地址
if(LcmWordCmd((u8)text_addr, (u8)(text_addr >> 8), cmdSetTextOffsetAddr))
{
break;
}
//设置文本有30列
if(LcmWordCmd(BlocksWidth, 0, cmdSetTextAreaWidth))
{
break;
}
uwAddr = BlocksWidth * BlocksHeight;
//图形区域首地址
if(LcmWordCmd((u8)uwAddr, (u8)(uwAddr >> 8), cmdSetGraphicOffsetAddr))
{
break;
}
//图形区域宽度
if(LcmWordCmd(BlocksWidth, 0, cmdSetGraphicAreaWidth))
{
break;
}
//显示状态:光标闪烁关,光标显示关,文本显示关,图形显示开
if(LcmNoneDataCmd(ucMode))
{
break;
}
//光标形状:占一行
ucStat = LcmNoneDataCmd(0xA1);
} while(0);
return ucStat;
}
u8 LcmDisplayGraphicChar(u8 ucRow, u8 ucColumn, u8 ucCharIndex)
{
return 0;
}
u8 LcmDisplayTextChar(u8 ucRow, u8 ucColumn, u8 ucChar)
{
u8 ucStat = 1;
u16 uwAddr;
uwAddr = ucRow * BlocksWidth + ucColumn;
do {
if(LcmWordCmd((u8)uwAddr, (u8)(uwAddr >> 8), cmdSetRamAddr))
{
break;
}
if(LcmNoneDataCmd(cmdDataAutoWrOn))
{
break;
}
if(LcmAutoWr(ucChar))
{
break;
}
ucStat = LcmNoneDataCmd(cmdDataAutoWrOff);
} while(0);
return ucStat;
}
u8 LcmAutoWr(u8 ucData)
{
u16 uwCnt = 2000;
while(!(RetrieveLcmStat() & 0x08) && uwCnt--)
{
;
}
if(!uwCnt)
{
return 1;
}
SetLcmPinType(PIN_OUT);
LCM_OUT_PORT = (LCM_OUT_PORT & (~0xFF)) | ucData;
LCM_D0C1 = 0; //switch to Data mode
LCM_RD = 1;
LCM_WR = 0;
delay_us(100);
LCM_WR = 1;
return 0;
}
u8 LcmGraphicClear(void)
{
return LcmGraphicFormat(0);
}
u8 LcmGraphicFormat(u8 ucChar)
{
u8 ucStat = 1;
u16 uwCnt;
do {
if(LcmWordCmd((u8)graphic_addr, (u8)(graphic_addr >> 8), cmdSetRamAddr))
{
break;
}
if(LcmNoneDataCmd(cmdDataAutoWrOn))
{
break;
}
for(uwCnt = BlocksWidth * lcm_y_dots; uwCnt > 0; uwCnt--)
{
if(LcmAutoWr(ucChar))
{
break;
}
}
if(uwCnt)
{
break;
}
ucStat = LcmNoneDataCmd(cmdDataAutoWrOff);
} while(0);
return ucStat;
}
u8 LcmGraphicSpread(void)
{
u8 ucStat = 1;
u16 uwCnt;
do {
if(LcmWordCmd((u8)graphic_addr, (u8)(graphic_addr >> 8), cmdSetRamAddr))
{
break;
}
if(LcmNoneDataCmd(cmdDataAutoWrOn))
{
break;
}
for(uwCnt = 0; uwCnt < (lcm_x_dots * lcm_y_dots) >> 3; uwCnt++)
{
if(LcmAutoWr(uwCnt % 256))
{
break;
}
}
if(uwCnt)
{
break;
}
ucStat = LcmNoneDataCmd(cmdDataAutoWrOff);
} while(0);
return ucStat;
}
u8 LcmGraphicCharShow(u8 ucRow, u8 ucColumn, u8 ucCharIndex)
{
u8 ucStat = 1,ucCnt;
u16 uwAddr;
do {
//uwAddr = (BlockDotsX * BlockDotsY * (BlocksWidth * ucRow + ucColumn)) >> 3;
uwAddr = (lcm_x_dots / BlockDotsX) * (lcm_y_dots / BlockDotsY) + (BlockDotsY * (lcm_x_dots >> 3)) * ucRow * 2 + ucColumn;
if((BlockDotsX >> 3) * BlockDotsY * BlocksWidth * BlocksHeight <= uwAddr)
{
break;
}
for(ucCnt = 0; ucCnt < 16; ucCnt++)
{
if(LcmWordCmd((u8)(uwAddr + ucCnt * 30), (u8)((uwAddr + ucCnt * 30) >> 8), cmdSetRamAddr))
{
break;
}
if(LcmNoneDataCmd(cmdDataAutoWrOn))
{
break;
}
if(LcmAutoWr(acChar_A[ucCnt]))
{
break;
}
if(LcmAutoWr(acChar_A[ucCnt]))
{
break;
}
if(LcmNoneDataCmd(cmdDataAutoWrOff))
{
break;
}
}
//
// if(LcmAutoWr(asc2_1608[ucCharIndex][1]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][2]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][3]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][4]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][5]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][6]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][7]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][8]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][9]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][10]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][11]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][12]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][13]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][14]))
// {
// break;
// }
// if(LcmAutoWr(asc2_1608[ucCharIndex][15]))
// {
// break;
// }
//
ucStat = LcmNoneDataCmd(cmdDataAutoWrOff);
} while(0);
return ucStat;
}
u8 LcmTextClear(void)
{
return LcmTextFormat(0);
}
u8 LcmWordCmd(u8 ucData1, u8 ucData2, u8 ucCmd)
{
if(SendDataToLcm(ucData1))
{
return 1;
}
if(SendDataToLcm(ucData2))
{
return 1;
}
if(SendCmdToLcm(ucCmd))
{
return 1;
}
return 0;
}
u8 LcmByteCmd(u8 ucData1, u8 ucCmd)
{
if(SendDataToLcm(ucData1))
{
return 1;
}
if(SendCmdToLcm(ucCmd))
{
return 1;
}
return 0;
}
u8 LcmNoneDataCmd(u8 ucCmd)
{
return SendCmdToLcm(ucCmd);
}
u8 RetrieveLcmStat(void)
{
u8 ucStat = 0;
SetLcmPinType(PIN_IN);
LCM_D0C1 = 1; //switch to Command mode
LCM_WR = 1;
LCM_RD = 0;
ucStat = LCM_IN_PORT;
LCM_RD = 1;
return ucStat;
}
u8 LcmIsBusy(void)
{
return !(RetrieveLcmStat() & 0x03);
}
u8 SendCmdToLcm(u8 ucCmd)
{
u16 uwCnt = 2000;
while(LcmIsBusy() && uwCnt--)
{
;
}
if(!uwCnt)
{
return 1;
}
SetLcmPinType(PIN_OUT);
LCM_OUT_PORT = (LCM_OUT_PORT & (~0xFF)) | ucCmd;
LCM_D0C1 = 1; //switch to Command mode
LCM_RD = 1;
LCM_WR = 0;
LCM_WR = 1;
return 0;
}
u8 SendDataToLcm(u8 ucData)
{
u16 uwCnt = 2000;
while(LcmIsBusy() && uwCnt--)
{
;
}
if(!uwCnt)
{
return 1;
}
SetLcmPinType(PIN_OUT);
LCM_OUT_PORT = (LCM_OUT_PORT & (~0xFF)) | ucData;
LCM_D0C1 = 0; //switch to Data mode
LCM_RD = 1;
LCM_WR = 0;
LCM_WR = 1;
return 0;
}
u8 LcmTextFormat(u8 ucChar)
{
u8 ucStat= 1;
u32 ucCnt = 0;
do {
//文本显示区域首地址
if(LcmWordCmd((u8)text_addr, (u8)(text_addr >> 8), cmdSetTextOffsetAddr))
{
break;
}
//自动写开
if(LcmNoneDataCmd(cmdDataAutoWrOn))
{
break;
}
for(ucCnt = BlocksHeight * BlocksWidth; ucCnt; ucCnt--)
{
if(LcmAutoWr(ucChar))
{
break;
}
}
if(ucStat)
{
break;
}
//关闭自动写
ucStat = LcmNoneDataCmd(cmdDataAutoWrOff);
} while(0);
return ucStat;
}
u8 ReadDataFromLcm(void)
{
u8 ucData;
SetLcmPinType(PIN_IN);
while(LcmIsBusy())
{
;
}
LCM_D0C1 = 0;
LCM_WR = 1;
LCM_RD = 0;
ucData = LCM_IN_PORT;
LCM_RD = 1;
return ucData;
}
[/mw_shl_code]
[/mw_shl_code]