//****************************************************************************************
//*File: LCD12864.c *
//****************************LCD12864驱动程序********************************************
//* *
//****************************************************************************************
#include <LPC21xx.H> /* LPC21xx definitions */
#include "lcdtest.h" /*12864显示图案*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
typedef unsigned char BOOLEAN; /* 布尔变量 */
typedef unsigned char INT8U; /* 无符号8位整型变量 */
typedef signed char INT8S; /* 有符号8位整型变量 */
typedef unsigned short INT16U; /* 无符号16位整型变量 */
typedef signed short INT16S; /* 有符号16位整型变量 */
typedef unsigned int INT32U; /* 无符号32位整型变量 */
typedef signed int INT32S; /* 有符号32位整型变量 */
typedef float FP32; /* 单精度浮点数(32位长度) */
typedef double FP64; /* 双精度浮点数(64位长度) */
typedef unsigned char uint8 ;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define LCD12864_CTL_NO 11 //控制线起始端口
#define LCD12864_DAT_NO 16 //数据线起始端口
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define LCD12864_CSA (1<<(LCD12864_CTL_NO)) //控制线端口定义
#define LCD12864_CSB (1<<(LCD12864_CTL_NO+1))
#define LCD12864_RS (1<<(LCD12864_CTL_NO+2)) //DI
#define LCD12864_RW (1<<(LCD12864_CTL_NO+3))
#define LCD12864_EN (1<<(LCD12864_CTL_NO+4))
//#define LCD12864_BUSY (1<<LCD12864_DAT_NO+7) //忙标志位。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define LCD12864_CLR IO0CLR //数据清零
#define LCD12864_SET IO0SET //数据置一
#define LCD12864_DIR IO0DIR //端口方向
#define LCD12864_PIN IO0PIN //端口状态
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define LCD12864_SEL0 PINSEL0
#define LCD12864_SEL1 PINSEL1 //端口功能
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define LCD_STARTROW 0xC0 //设置起始行指令。
#define LCD_PAGE 0xB8 //设置页指令。10111000
#define LCD_COL 0x40 //设置列指令。
#define SINGLE_SCREEN_COL 64 //左右屏,每屏64列
#define LCD_DispOn 0x3F
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
uint8 Disp_Table[8][128]; //虚拟屏幕缓存
uint8 (*menu[])[32] = {kaishiyouxi,nanduxuanze,guanyuzuozhe,tuichuyouxi};
//****************************************************************************
//* 名称:vWriteCMD2
//* 功能:写命令
//****************************************************************************
void vWriteCMD2(INT8U ucCMD)
{
LCD12864_CLR=LCD12864_RS;
LCD12864_CLR=LCD12864_RW;
LCD12864_CLR=0xFF <<LCD12864_DAT_NO;
LCD12864_SET=ucCMD<<LCD12864_DAT_NO;
LCD12864_SET=LCD12864_EN;
LCD12864_CLR=LCD12864_EN;
}
//****************************************************************************
//* 名称:WriteData2
//* 功能:写数据
//****************************************************************************
void WriteData2(INT8U ucData)
{
LCD12864_SET=LCD12864_RS;
LCD12864_CLR=LCD12864_RW;
LCD12864_CLR=0xFF <<LCD12864_DAT_NO;
LCD12864_SET=ucData<<LCD12864_DAT_NO;
LCD12864_SET=LCD12864_EN;
LCD12864_CLR=LCD12864_EN;
}
//****************************************************************************
//* 名称:CleanAll2
//* 功能:清屏
//****************************************************************************
void CleanAll2(void)
{
INT8U ucPage,ucCol;//页 列
LCD12864_SET=LCD12864_CSA; //左右两屏都选中
LCD12864_SET=LCD12864_CSB;
for(ucPage=0;ucPage<8;ucPage++)
{
vWriteCMD2(LCD_PAGE+ucPage); //页
vWriteCMD2(LCD_COL); //列
for(ucCol=0;ucCol<64;ucCol++)
WriteData2(0x00);
}
}
//****************************************************************************
//* 名称:LCDInit2
//* 功能:初始化
//****************************************************************************
void LCDInit2(void)
{
//LCD12864_SEL0 &=0x003FFFFF;
LCD12864_DIR |=0x00FFF800;
LCD12864_CLR |=0x00FFF800;
vWriteCMD2(LCD_DispOn); //开显示
vWriteCMD2(LCD_STARTROW); //设置起始行地址,列地址和页地址是变化的
CleanAll2();
}
void ReadByte(uint8 pic_Page,uint8 pic_Col,uint8* ppic_Data)
{
*ppic_Data = Disp_Table[pic_Page][pic_Col];
}
/* *************************************************************************************************
* Function Name : DisplayByte *
* Description : 显示一个字节,即纵向8个像素 *
* Date : *
* Parameter : ucPage 显示的页 (屏幕一共8页) *
* ucCol 要显示的列 (屏幕一共128列) *
* ucData 要显示的数据 *
* Return Code : 无 *
* Author : *
************************************************************************************************* */
void DisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData)
{
if(ucCol/SINGLE_SCREEN_COL==0)
{
LCD12864_SET=LCD12864_CSA;
LCD12864_CLR=LCD12864_CSB;
}
else{
LCD12864_CLR=LCD12864_CSA;
LCD12864_SET=LCD12864_CSB;
}
//设置开始的页,列
vWriteCMD2(LCD_PAGE+ucPage);
vWriteCMD2(LCD_COL+ucCol%SINGLE_SCREEN_COL);
WriteData2(ucData);
Disp_Table[ucPage][ucCol] = ucData;
}
//****************************************************************************
//* 名称:DispOneChinese
//* 功能:显示一个汉字
//一个汉字需要两页*16列
//*注意:页,列有改变
//****************************************************************************
void DispOneChinese(uint8 ucPage,uint8 ucCol,uint8 *pDisTable)
{
uint8 i=0;
for(i= 0;i<16;i++) //汉字上半部分
{
DisplayByte(ucPage,ucCol+i,*(pDisTable+i));
}
for(i= 0;i<16;i++) //汉字下半部分
{
DisplayByte(ucPage+1,ucCol+i,*(pDisTable+16+i));
}
}
//****************************************************************************
//* 名称:DispChinese
//* 功能:显示n个汉字
//一个汉字需要两页*16列
//*注意: 按照这种写法要每个汉字单独取模
//****************************************************************************
void DispChinese(uint8 ucPage,uint8 ucCol,uint8 pDisTable[][32],uint8 Num)
{
uint8 i=0;
for(i= 0;i<Num;i++)
DispOneChinese (ucPage,ucCol+16*i,*(pDisTable+i));
}
//****************************************************************************
//* 名称:DispPicture
//* 功能:显示一幅图
//
//*注意:最大128*64点阵 ,要提供图形的高度和宽度
//****************************************************************************
void DisPicture(uint8 ucPage,uint8 ucCol,uint8 *pDisTable,uint8 width,uint8 hight)
{
uint8 i,j;
for(i = ucPage;i<ucPage+hight/7;i++)
for(j = ucCol;j<ucCol+ width;j++)
DisplayByte(i,j,*(pDisTable+i*44+j));
}
//****************************************************************************
//* 名称:DisplayWelcome
//* 功能:显示欢迎
//****************************************************************************
void DisplayWelcome(voi