ARM7---12864---液晶显示驱动

//使用步骤

//

//•(1)LCD初始化。主要包括对控制器的显示开,显示起始行设置。
//•(2)LCD清屏。由于系统上电时,显示缓冲区的数据是不固定的,显示出乱码,因此在液晶显示操作之前应将缓冲区清零。
//•(3)数据显示。确定显示坐标后,写入显示数据,将做好字模的文字、图形等显示到LCD上。
//•注意列地址有自增功能
//•



//config.h

#ifndef __CONFIG_H
#define __CONFIG_H

#include <LPC21xx.H>

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif

typedef  unsigned char uint8;
typedef  signed    char    int8;
typedef  unsigned  short  uint16;
typedef  signed  short  int16;
typedef  unsigned  int  uint32;
typedef  signed  int   int32;
typedef  float  fp32;
typedef  double  fp64 ;


#define Fosc		11059200

#define Fcclk		(Fosc*4)

#define Fcco		(Fcclk*4)

#define Fpclk		(Fcclk/4)*1


#endif


//zimo.c

#include "config.h"


//欢迎同学止步的风,每个字分别取的字模,否则字模工具是按照单行来取的字节
//注意在工程中字模数据要放到c文件中!!!!!!!
uint8 hytx[8][32]=
{
	{0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
	0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00
	},
	{
	0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
	0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00

	} ,

	{
	0x00,0xFE,0x02,0x12,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00,
	0x00,0xFF,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x08,0x1F,0x40,0x80,0x7F,0x00,0x00

	},
	{0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,
	0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00
	},
	{0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,0x00,
	0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x00},

	{0x20,0x20,0x20,0xBC,0x20,0x20,0x20,0xFF,0x24,0x24,0x24,0xA4,0x24,0x20,0x20,0x00,
	0x00,0x88,0x86,0x81,0x80,0x40,0x40,0x3F,0x20,0x10,0x08,0x04,0x01,0x06,0x02,0x00
	},
	{0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,
	0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00
	} ,
	{0x00,0x00,0x00,0xFE,0x02,0x12,0x22,0x42,0x82,0x7A,0x12,0x02,0xFE,0x00,0x00,0x00,
	0x40,0x20,0x18,0x07,0x10,0x08,0x04,0x02,0x01,0x06,0x1C,0x00,0x0F,0x30,0x7C,0x00
	}
 };	



//**************************************************************************************************************
//*提供0—9 横线  温度标示的字模
//****************************************************************************************************************/
 uint8 snum[][16]=
 {
   {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},//0
   {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//1
   {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},//2
   {0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},//3
   {0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},//4
   {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},//5
   {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},//6
   {0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},//7
   {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},//8
   {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},//9
   {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},//-
   {0xC7,0x33,0x0B,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00}, //度
   {0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00 }//冒号
 };

//main.c

/****************************************************
*  功能:LCD12864  液晶显示  驱动程序
****************************************************/

#include "config.h"

#define LCD12864_DIR IO0DIR		//端口方向
#define LCD12864_CLR IO0CLR		//数据清零
#define LCD12864_SET IO0SET		//数据置一
#define LCD12864_PIN IO0PIN			//端口状态

#define LCD12864_BUSY (1<<26)		//BUSY

#define LCD12864_CTL_NO 11						//控制线起始端口
#define LCD12864_DAT_NO 16						//数据线起始端口


#define LCD12864_RS	 (1<<(LCD12864_CTL_NO+2))   //命令/数据
#define LCD12864_RW	 (1<<(LCD12864_CTL_NO+3))	//读/写
#define LCD12864_EN	 (1<<(LCD12864_CTL_NO+4))	//使能位


#define LCD_DispOn  0x3F	//开显示命令
#define LCD_STARTROW 0xC0		//设置起始行指令,0xC0为第0行
#define LCD_PAGE 	 0xB8		//设置页指令。10111000
#define LCD_COL 	 0x40		//设置列指令。
#define LCD_LINE 	 0x40			//设置列指令
#define SINGLE_SCREEN_COL  64	 //左右屏,每屏64列

#define LCD12864_CSA (1<<(LCD12864_CTL_NO))		//控制线端口定义,选中左部屏幕
#define LCD12864_CSB (1<<(LCD12864_CTL_NO+1))   //选中右部屏幕


#define LCD12864_WIDTH 128  		//宽度
#define LCD12864_HIGH  64   		//高度
#define LCD12864_PAGE  8    		//页数


//引用外部字模
extern uint8 sytx[8][32];
extern uint8 snum[][16];
extern uint8 hytx[8][32];
extern uint8 Nums[10][16];
extern uint8 week[][32];
extern uint8 menu1[];
extern uint8 menu0[];
extern uint8 degree[] ;
//extern  uint8 dianqiguan[];
extern uint8 menu2[] ;
extern uint8 menu3[];
extern uint8 menu4[];

uint8  tm[6];	 //获取时间存在数组中
uint8  year[6];	 //获取日期存在数组中
uint8  day;		 //获取星期号

uint8  dis_buf[22];		//数据缓冲区

//uint8 dayoder;

//延时函数
void Delay(uint32 x);

//初始化函数
void RTCInit (void);
void LCDInit2(void);
void vCheckBusy(void);
void vWriteCMD2(uint8 ucCMD);
void WriteData2(uint8 ucData);
void ClearAll2(void);

//显示字符函数
void DisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData);  //显示字符
void vDisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData);  //反选显示字符

//显示数字函数
void  Displaynum (uint8 ucPage,uint8 ucCol, uint8  *pDisTable ); //显示数字

//显示汉字、字符串函数
void DispOneChinese(uint8 ucPage,uint8 ucCol,uint8 *pDisTable,uint8 Col);	  //一个汉字
void DispChinese(uint8 ucPage,uint8 ucCol,uint8 pDisTable[][32],uint8 Num,uint8 Col) ;	//多个汉字

//全屏 显示图片
void DisPicture(uint8 *pDisTable);
void vDisPicture(uint8 *pDisTable,uint8 sur );


//刷新屏幕函数---只刷新其中一部分
void  Dateupdated(uint8  numcode[]);
void  Weekupdated(uint8  oder);
void  Timeupdated(uint8  numcode[]);

void SetTimeRtc (void);	   //填充时间变量

//刷新屏幕函数
void fresh(void);

//定时器中断处理函数 ,其中调用屏幕刷新函数fresh
void __irq RTC_Int(void);


//主函数入口
int main()
{
	LCDInit2();	  //初始化后清屏

	RTCInit();			   //初始化实时时钟
	
	DispChinese(0,0,hytx,8,16)	; //显示"欢迎同学止步的风"
	

	VICIntSelect = 0x00;			// 设置所有中断连接IRQ中断
    VICVectCntl0 = 0x20 | 13;		// 分配通道0
    VICVectAddr0 = (int)RTC_Int;	// 设置中断服务程序地址
   	VICIntEnable = (1 << 13);		// 使能RTC中断

	
	SetTimeRtc();
	Timeupdated(tm);
	Dateupdated(year);
	Weekupdated(day);

	while (1)
	{
		while (0 == (ILR & 0x01));				// 等待RTC增量中断
		ILR = 0x01;								// 清除中断标志
	}

	//WriteData2(0xff);
	//DispChinese(1,0,Nums,10,8)	; //显示"0123456789"
	//ClearAll2();
	//Displaynum (6,2+8*2,*(snum+10));
	//DispChinese(1,0,Nums,10,8)	; //显示"0123456789"
	//DispOneChinese (6,96,*(week+6),16);	   //每次循环,显示一个汉字
	//ClearAll2();
	//Displaynum (2,32+8*4,*(snum+year[4]));
	//Displaynum (0,0,*(snum+year[4]));
	//Displaynum (0,0,*(snum));
	//vDisPicture(menu4,0);			 //反选8块中的一块区域
	//DisPicture(menu4) ;
	
}


//*******************************************************************************
//*名称:Delay()
//*功能:延时函数
//*******************************************************************************/
void Delay(uint32 x)
{
 	unsigned int i1,j1;
 	for(j1=0;j1<100;j1++)
   	{
    	for(i1=0;i1<x;i1++);
    }
}


//****************************************************************************
//* 名称:vCheckBusy
//* 功能:检查LCD是否忙
//****************************************************************************
void vCheckBusy(void)     
{
	LCD12864_DIR &= 0xF9FFFF03;	    //数据线为输入
	
	while(1)
	{
		LCD12864_CLR=LCD12864_RS;
		LCD12864_SET=LCD12864_RW;
		
		LCD12864_SET=LCD12864_EN;
		
		LCD12864_CLR=LCD12864_EN;
		if(!(LCD12864_PIN & LCD12864_BUSY))
			break;
	} 

	LCD12864_DIR |= 0x060000FC;      	//数据线为输出*/ 	
	
}


//****************************************************************************
//* 名称:vWriteCMD2
//* 功能:写命令
//****************************************************************************
void vWriteCMD2(uint8 ucCMD)
{

	vCheckBusy();

	LCD12864_CLR=LCD12864_RS;	  //RS置L ,数据格式为:命令
	LCD12864_CLR=LCD12864_RW;	  //RW置L ,为写操作
	
	LCD12864_CLR=0xFF <<LCD12864_DAT_NO;  //清零数据端口
	LCD12864_SET=ucCMD<<LCD12864_DAT_NO;  //传递命令
								  
	LCD12864_SET=LCD12864_EN;		//给EN一个高脉冲,发送数据
	LCD12864_CLR=LCD12864_EN;		//发送完成后,使能位置L,供以后继续使用
}


//****************************************************************************
//* 名称:WriteData2
//* 功能:写数据
//****************************************************************************
void WriteData2(uint8 ucData)
{
	vCheckBusy();	

	LCD12864_SET=LCD12864_RS;	 //写数据时,RS为H,RW为L
	LCD12864_CLR=LCD12864_RW;

	LCD12864_CLR=0xFF <<LCD12864_DAT_NO;   //清零8位数据端口	
	LCD12864_SET=ucData<<LCD12864_DAT_NO;   //传递命令	

	LCD12864_SET=LCD12864_EN;		//给EN一个高脉冲,发送数据
	LCD12864_CLR=LCD12864_EN;		//发送完成后,使能位置L,供以后继续使用
}


//****************************************************************************
//* 名称:CleanAll2
//* 功能:清屏
//****************************************************************************
void ClearAll2(void)
{
	uint8 ucPage,ucCol;  //页号,列号
	LCD12864_SET=LCD12864_CSA;	//左右两屏都选中
	LCD12864_SET=LCD12864_CSB;
	
	for(ucPage=0;ucPage<8;ucPage++)
	{
		vWriteCMD2(LCD_PAGE+ucPage);	  //设置页号 ,从0行开始  ,光标位置
 		vWriteCMD2(LCD_COL);		 	  //设置列号 ,定位在第0列
		for(ucCol=0;ucCol<64;ucCol++)	  //左右半屏都是64列,所以循环64次就可以啦,两边同时清屏
		{
			vWriteCMD2(LCD_PAGE+ucPage);	  //设置页号 ,从0行开始  ,光标位置
			vWriteCMD2(LCD_COL+ucCol);		  //设置列号 ,从0列开始,到63列结束
			WriteData2(0x00);				  //写零,表示清空当前列
		}
	}

}


//****************************************************************************
//* 名称:LCDInit2
//* 功能:初始化
//****************************************************************************
void LCDInit2(void)
{
	LCD12864_DIR |=0x00FFF800;	  //11-23为输出
	LCD12864_CLR |=0x00FFF800;	  //清零11-23

	vWriteCMD2(LCD_DispOn);  //开显示
	vWriteCMD2(LCD_STARTROW);  //设置起始行地址,列地址和页地址是变化的

	ClearAll2();
}


//* *************************************************************************************************
//* Function Name : DisplayByte                                                                      *
//* Description	: 显示一个字节,即纵向8个像素    							             	       *
//* Date		    :                                                             	           *
//* Parameter     : ucPage         显示的页 (屏幕一共8页)                                            *
//*                 ucCol          要显示的列 (屏幕一共128列)                                        *
//*                 ucData         要显示的数据                                                      *
//* Return Code   : 无                                                                               *
//* Author	    :                                                                 	           *
//************************************************************************************************* */
void DisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData)
{
	//先选择显示屏幕(左or右)
	if(ucCol/SINGLE_SCREEN_COL==0)		 //为0说明ucCol小于64。,在左半屏幕
	{
		LCD12864_SET=LCD12864_CSA;		 //左开
		LCD12864_CLR=LCD12864_CSB;		 //右关
	}
	else if(ucCol/SINGLE_SCREEN_COL==1)		 //为1说明ucCol大于64。,在右半屏幕
	{
		LCD12864_CLR=LCD12864_CSA;		 //左关
		LCD12864_SET=LCD12864_CSB;		 //右开
	}

	//设置坐标
	vWriteCMD2(LCD_PAGE+ucPage);		//设置开始的页号
	vWriteCMD2(LCD_COL+ucCol%SINGLE_SCREEN_COL);  //设置开始的列号

	 //显示数据
	 WriteData2(ucData);
}


//***************************************************************************************
//*  名称 	 vDisplayByte
//*  功能   反显一个字符
//*  	参数解释		ucPage 显示的起始页数	 ucCol  显示的起始列数	ucData  要显示的数据
//***************************************************************************************/
void vDisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData)
{	
	
	if(ucCol/ LCD12864_HIGH==0)
	{
		LCD12864_SET=LCD12864_CSA;
		LCD12864_CLR=LCD12864_CSB;
	}
	else{
		LCD12864_CLR=LCD12864_CSA;
		LCD12864_SET=LCD12864_CSB;
	}

													//设置开始的页,列

	vWriteCMD2(LCD_PAGE+ucPage);
	vWriteCMD2(LCD_LINE+ucCol%LCD12864_HIGH);
	WriteData2(~ucData);
	
}


//**************************************************************************
 //*   名称   vDisPicture
 //*	功能   显示一个被选中一部分的界面
 //*	参数解释   *pDisTable  图像数据的指针
 //*	sur 值作用	  0 1 2 3 4 5 6 7  分别为选中八块中的一块 12 24 36 48 分别为选中 0 1 页 2 3 页 4 5页 6 7 页
 //*****************************************************************************/
 
 void vDisPicture(uint8 *pDisTable,uint8 sur )
{	uint8 ucPage=0;	//起始页
    uint8 ucCol=0;	//起始列
	uint8 width=128; //lcd宽度
	uint8 hight=64;	 //lcd高度
	uint8 i,j;		  //临时变量
	
	   if(sur>=0 & sur<=7  )//输入数据sur在 0-7之间
	   {
		for(i = ucPage;i<ucPage+hight/8;i++)	 //页数递增
		{
					for(j = ucCol;j<ucCol+ width;j++)	//列数递增
					{
							if( (i>=(sur/2)*2)&&(i<=(sur/2)*2+1))//通过参数计算选中八块中的一块	
							   
								{	
								  if(j>=64*(sur%2)&&j<=64*(sur%2)+63)
								  {
								vDisplayByte(i,j,*(pDisTable+i*128+j));	  //两页中被选中半部分反选
								
								 }
								  else
								  {DisplayByte(i,j,*(pDisTable+i*128+j));}//两页中未被选中半部分正常显示
								
								}
							 else
							 { DisplayByte(i,j,*(pDisTable+i*128+j));//未被选中页正常显示
							  }
					  }
		 }

		}
	else    //如果参数不为0-7之间即为 12 24 36 48 其中之一
	{
		for(i = ucPage;i<ucPage+hight/8;i++)   //页递增
		{
					for(j = ucCol;j<ucCol+ width;j++)  //列递增
					{
							if( i>=((sur-12)/12)*2&&i<=((sur-12)/12)*2+1)//通过参数选中两页	
							   
								{	
								  
								vDisplayByte(i,j,*(pDisTable+i*128+j));	 //反选选中两页
								
								 }
								 
								
							
							 else
							 { 
							 	DisplayByte(i,j,*(pDisTable+i*128+j));	 //其余页正常显示
							  }
					  }
		 }
	}
}



//*******************************************************************************
//** 函数名称 :Displaynum()
//** 函数功能 :显示一个数字
//** 入口参数 :ucPage 显示的起始页数  ucCol  显示的起始列数	*pDisTable  要显示的数据的指针
//** 出口参数 :无
//*******************************************************************************/

void  Displaynum (uint8 ucPage,uint8 ucCol, uint8  *pDisTable )
{
	
			 uint8 i;
			for(i= 0;i<8;i++)	//数字上半部分
			{
			DisplayByte(ucPage,ucCol+i,*(pDisTable+i));
		
			}
			for(i= 0;i<8;i++)	 //数字下半部分
			{
			DisplayByte(ucPage+1,ucCol+i,*(pDisTable+8+i));
		
			}
			pDisTable++;
}


//*******************************************************************************
//** 函数名称 :Dateupdated()
//** 函数功能 :在待机界面刷新日期
//** 入口参数 :numcode[] 要显示的数据组成的数组 长度为六 数字范围0-9	   pDisTable[][16] 数字 和温度标示横线字符
//** 出口参数 :无
//*******************************************************************************/

void Dateupdated(uint8  numcode[])
{	  
	 uint8 count=6;
	 uint8 ucPage=2;
	 uint8 ucCol=32;

	uint8 i=0;
	for(i= 0;i<count;i++)
	{ if( i==2||i==4)
		{
		Displaynum (ucPage,ucCol+8*i,*(snum+10));
		ucCol+=8;
		Displaynum (ucPage,ucCol+8*i,*(snum+numcode[i]));
		}
	   else
	   {
	   	 Displaynum (ucPage,ucCol+8*i,*(snum+numcode[i]));
	   }
	}
}


//*******************************************************************************
//** 函数名称 :SetTimeRtc()
//** 函数功能 :获取时间的各种数据
//** 入口参数 :无
//** 出口参数 :无
//*******************************************************************************/

void SetTimeRtc (void)
{	
	uint32 datas;
	uint32 times;
	uint32 bak;
//	uint8  MESSAGE[]="--北京时间:--";
	
	times = CTIME0;								// 读取完整的时钟寄存器
	datas = CTIME1;
	
	bak = (datas >> 16) & 0xfff;				// 获取年
	dis_buf[0]=bak/1000+'0';
	bak = bak % 1000;
	dis_buf[1]=bak/100+'0';
	bak = bak % 100;
	dis_buf[2]=bak/10;
    dis_buf[3]=bak%10;
    dis_buf[4]='-';
    	
	bak = (datas >> 8) & 0x0f;					// 获取月
	dis_buf[5]=bak/10;
    dis_buf[6]=bak%10;
    dis_buf[7]='-';
    
	bak = datas & 0x1f;							// 获取日
	dis_buf[8]=bak/10;
    dis_buf[9]=bak%10;
    dis_buf[10]=' ';
    
	bak = (times >> 24) & 0x07;					// 获取星期
	dis_buf[11]=bak%10;
    dis_buf[12]=' ';
		
	bak = (times >> 16) & 0x1f;					// 获取小时
	dis_buf[13]=bak/10;
    dis_buf[14]=bak%10;
    dis_buf[15]=':';
    
	bak = (times >> 8) & 0x3f;					// 获取分钟
	dis_buf[16]=bak/10;
    dis_buf[17]=bak%10;
    dis_buf[18]=':';
    
	bak = times & 0x3f;							// 获取秒钟
	dis_buf[19]=bak/10;
    dis_buf[20]=bak%10; 


	tm[0]= dis_buf[13];
	tm[1]= dis_buf[14];
	tm[2]= dis_buf[16];
	tm[3]= dis_buf[17];
	tm[4]= dis_buf[19];
	tm[5]= dis_buf[20];
	year[0]= dis_buf[2];
	year[1]= dis_buf[3];
	year[2]= dis_buf[5];
	year[3]= dis_buf[6];
	year[4]= dis_buf[8];
	year[5]= dis_buf[9];
	day = dis_buf[11]; 
	 
	//dayoder = dis_buf[9]; 
}			


//****************************************************************************
//* 名称:Weekupdated()
//* 功能:更新星期
//****************************************************************************
 
void  Weekupdated(uint8  oder)
{
	//DispOneChinese(6,96,*(week+oder),16);
	DispOneChinese (6,96,*(week+oder),16);	   //每次循环,显示一个汉字
}

//*************************************************************************************************
//*  名称 :  Timeupdated 
//*  作用 :  在待机界面刷新时间
//*  参数解释 : numcode[] 要显示的数据组成数组   pDisTable[][16]
//*************************************************************************************************/
		
void  Timeupdated(uint8  numcode[])
{	
	uint8 ucPage=4;
	uint8 ucCol=32;
	uint8 count=6;
	uint8 i=0;
	for(i= 0;i<count;i++)
	{ if( i==2||i==4)
		{
		Displaynum (ucPage,ucCol+8*i,*(snum+12));
		ucCol+=8;
		Displaynum (ucPage,ucCol+8*i,*(snum+numcode[i]));
		}
	   else
	   {
	   	 Displaynum (ucPage,ucCol+8*i,*(snum+numcode[i]));
	   }
	}
}


//****************************************************************************
//* 名称:DispOneChinese
//* 功能:显示一个汉字
//一个汉字需要两页*16列
//*注意:页,列有改变
//****************************************************************************
 void DispOneChinese(uint8 ucPage,uint8 ucCol,uint8 *pDisTable,uint8 Col)		 //页号,列号,指向字模数组的指针,	Col表示列数,为8,则是字符数组,为16则是汉字
{
	uint8 i=0;
	for(i=0;i<Col;i++)	//汉字上半部分
	{
		DisplayByte(ucPage,ucCol+i,*(pDisTable+i));
	}

	for(i=0;i<Col;i++)	  //汉字下半部分
	{
		DisplayByte(ucPage+1,ucCol+i,*(pDisTable+16+i));	 //汉字时用
		//DisplayByte(ucPage+1,ucCol+i,*(pDisTable+8+i));
	}
}

//*******************************************************************************
//** 函数名称 :RTCInit()
//** 函数功能 :初始化实时时钟
//** 入口参数 :无
//** 出口参数 :无
//*******************************************************************************/

void RTCInit (void)
{
	PREINT = Fpclk / 32768 - 1;					// 设置基准时钟分频器
	PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
	
	CCR   = 0x00;								// 禁止时间计数器
	
	YEAR  = 2009;
	MONTH = 6;
	DOM   = 18;
	DOW   = 6;
	HOUR  = 23;
	MIN   = 59;
	SEC   = 55;
	
	CIIR = 0x01;								// 设置秒值的增量产生1次中断
	CCR  = 0x01;								// 启动RTC
}


//****************************************************************************
//* 名称:DispChinese
//* 功能:显示n个汉字
//一个汉字需要两页*16列
//*注意:  按照这种写法要每个汉字单独取模
//**************************************************
void DispChinese(uint8 ucPage,uint8 ucCol,uint8 pDisTable[][32],uint8 Num,uint8 Col)    //汉字时用
//void DispChinese(uint8 ucPage,uint8 ucCol,uint8 pDisTable[][16],uint8 Num,uint8 Col)	  //Col表示列数,为8,则是字符数组,为16则是汉字
{
	uint8 i=0;
	for(i=0;i<Num;i++)
	{
		//汉字时用
		DispOneChinese (ucPage,ucCol+16*i,*(pDisTable+i),Col);	   //每次循环,显示一个汉字
		//DispOneChinese (ucPage,ucCol+8*i,*(pDisTable+i),Col);	   //每次循环,显示一个字符数字
	}
}


//*******************************************************************************
//** 函数名称 :fresh()
//** 函数功能 :刷新屏幕
//** 入口参数 :无
//** 出口参数 :无
//*******************************************************************************/

void fresh()
  {
  	SetTimeRtc();
	Timeupdated(tm);
	Dateupdated(year);
	Weekupdated(day);
  }


//*******************************************************************************
//** 函数名称 :DisPicture()
//** 函数功能 :显示一幅图
//** 入口参数 :最大128*64点阵 ,要提供图形的高度和宽度
//** 出口参数 :*pDisTable  要显示的数据的指针
//*******************************************************************************/

void DisPicture(uint8 *pDisTable)
{
	uint8 ucPage=0;
	uint8 ucCol=0;
	uint8 width=128;
	uint8 hight=64;
	uint8 i,j;

	for(i=ucPage;i<ucPage+hight/8;i++)
		for(j=ucCol;j<ucCol+width;j++)
			DisplayByte(i,j,*(pDisTable+i*128+j));
}


//*******************************************************************************
//** 函数名称 :RTC_Int()
//** 函数功能 :每一秒中断一次,刷新一次
//** 入口参数 :无
//** 出口参数 :无
//*******************************************************************************/

void __irq RTC_Int(void)
{	
	fresh();						//刷新
    ILR = 0x01;						// 清除RTC增量中断标志
    VICVectAddr = 0;				   // 向量中断结束
}





//图片


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值