您的位置:首页 > 其它

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

2012-01-03 15:30 211 查看
//使用步骤

//

//•(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;				   // 向量中断结束
}


//图片

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  menu delay io 图形 c function