⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 LPC214X驱动LCD128x64 时钟显示
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************************
	(1)		lcd定义:P0.0~P0.7  数据总线	P0.8=D/I    P0.9=R/W; 
			P0.10=E;	P0.11=CS1   P0.12=CS2	P0.13=RES
	(2)		时钟
	(3)		ADC	
		
********************************************************************************************************/
#include "config.h"
uint8     CODE;                // LCD的汉字 字符代码 单元
uint8     LCD_X;               // LCD的X座标
uint8     LCD_Y;               // LCD的Y座标
uint8     COUNT;               // LCD显示的字符个数,若是汉字,则需要四个字节字符
//uint8     cursor_Flag;		   // LCD的光标标志,1显示光
uint8     Dis_Page;			   // LCD的显示页码
/***********************************************************************************************
***********************************************************************************************
****************************************  TIME *************************************************
***********************************************************************************************/
typedef struct	 My_calendar
{
	uint16 year;
	uint8  month;
	uint8  date;
	uint8  week;
	uint8  hour;
	uint8  minute;
	uint8  second;
	uint8  temp;
}Calendar;
/*******函数声明*******/
void WRI_CC	(uint8 x,uint8 y,uint8 cod,uint8 dat8_16); 
	//(		 uint8 x为X坐标		 uint8 Y为Y坐标		uint8 cod 为数字 dat8_16为字型选择
/*
********************************************************************************************************
** 函数名称 : RTC_Int()
** 功能描述 : RTC中断服务函数。
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************
*/
void  __irq RTC_Int(void)
{
	uint32	datas;
	uint32	times;
	uint32	bak;
	
	if ((IO0SET & BEEP) == 0)
		IO0SET = BEEP;			/* 关闭BEEP										*/
	else
		IO0CLR = BEEP;

	times = CTIME0;
	datas = CTIME1;

	bak = (datas >> 16) & 0xfff;// 获取 年
	WRI_CC(0,0,(bak / 1000),1);//2
	bak =  bak % 1000; 
	WRI_CC(8,0,(bak / 100),1);//0
	bak =  bak % 100;
	WRI_CC(16,0,(bak / 10),1);//0
	WRI_CC(24,0,(bak % 10),1);//7

	
	WRI_CC(32,0,5,2);//年
	bak = (datas >> 8) & 0x0f;		// 获取 月
		WRI_CC(44,0,(bak / 10),1);
		WRI_CC(52,0,(bak % 10),1);
		WRI_CC(60,0,6,2);// 重新写"月"
		
	bak = datas & 0x1f;         // 获取 日
		WRI_CC(72,0,(bak / 10),1);
		WRI_CC(80,0,(bak % 10),1);
		WRI_CC(88,0,7,2);// 重新写"日"
	bak = (times >> 16) & 0x1f;		// 获取 小时
		WRI_CC(0,2,(bak / 10),1);
		WRI_CC(8,2,(bak % 10),1);
		WRI_CC(16,2,10,1);//:
	bak = (times >> 8) & 0x3f;		// 获取 分钟
		WRI_CC(24,2,(bak / 10),1);
		WRI_CC(32,2,(bak % 10),1);
		WRI_CC(40,2,10,1);//:
	bak = times & 0x3f;				// 获取 秒钟
	WRI_CC(48,2,(bak / 10),1);
	WRI_CC(56,2,(bak % 10),1);
	WRI_CC(64,2,10,1);//:
	bak = (times >> 24) & 0x07;		// 获取 星期
	if(bak == 0 )
	{	
		WRI_CC(112,2,7,2);
	}
	else
	{
		WRI_CC(112,2,(bak +10),2);//一
	}
	//WRI_CC(11,73,2,1);//2
	//WRI_CC(12,73,5,1);//5
	//WRI_CC(13,73,10,2);//℃ 
	    
	ILR = 0x01;					// 清除RTC增量中断标志
    VICVectAddr = 0;			// 向量中断结束
}
/*
*********************************************************************************************************
** 函数名称 :IRQ_Timer0()
** 函数功能 :定时器0中断服务程序,取反LED9控制口。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void IRQ_Timer0 (void)__irq 
{
	uint8 i;	

	Dis_Page--;	
	if(Dis_Page < 19)
	{
		
	    for(i = (Dis_Page+1);i<20;i++)
			WRI_CC(i,0,18,1);
	}
	if(Dis_Page == 25) WRI_CC(0,0,18,1);
	
	if(Dis_Page == 0)  Dis_Page = 26;

	T0IR = 0x01;				/* 清除中断标志									*/
	VICVectAddr = 0x00;			/* 通知VIC中断处理结束							*/
}
/*
*******************************************************************************************************
** 函数名称 :VIC_Init()
** 函数功能 :初始化VIC
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************
*/
void VIC_Init(void)
{
	VICIntSelect = 0x00;       // 设置所有中断连接IRQ中断
    
	/* 设置RTC中断IRQ */
	VICVectCntl1 = 0x20 | 13;  // 分配通道0
    VICVectAddr1 = (int)RTC_Int;// 设置中断服务程序地址
	//VICDefVectAddr = (uint32)RTC_Int;
    //VICIntEnable = (1 << 13);	// 使能RTC中断

	/* 设置定时器0中断IRQ */
	VICVectCntl0 = 0x20 | 0x04;			/* 设置定时器0中断通道分配次优先级	*/
	VICVectAddr0 = (uint32)IRQ_Timer0;	/* 设置中断服务程序地址					*/
	VICIntEnable = (1 << 0x04) | (1 << 13);/* 使能定时器0中断,RTC中断		                */
}																   
/*
*******************************************************************************************************
** 函数名称 :RTCInit()
** 函数功能 :初始化实时时钟
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************
*/
void RTCInt (void)
{
	
	CCR   = 0x00;	           // 禁止时间计数器,RTC对连接在RTCX1 和RTCX2 两端的32kHz 振荡器信号进行计数
	
	YEAR  = 2007;
	MONTH = 12;
	DOM   = 1;
	DOW   = 62;
	HOUR  = 15;
	MIN   = 25;
	SEC   = 50;
	
	CIIR  = 0x01;	           // 设置秒值的增量产生1次中断
	//AMR   = 0xFF;			   // 所有报警都被屏蔽
	
	ILR   = 0x03;			   // 清除RTC增量和报警中断标志
	CCR   = 0x11;	           // 启动RTC
}
/*
*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly	延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************
*/
void DelayNS (uint32 dly)
{
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<1000; i++);
}
void DelayUS (uint32 dly)
{
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<1; i++);
}

/*********************************************************************************************************
** 函数名称 :LCD_BESY
** 函数功能 :LCD的忙检测
** 入口参数 :IO0PIN  P0.07
** 出口参数 :无			  RS=L RW=H CS=H E=H
*********************************************************************************************************/

void LCD_BESY1(void)
{  	IO0SET =0xff << 7;
	IO0DIR =0X0003BFFF;
	
   IO0CLR =LCD_RS;
   IO0SET =LCD_RW;
   IO0SET =LCD_CS1;
   IO0SET =LCD_E;

   while((IO0PIN&0x4000)==0x4000);
   IO0DIR =0X0003FFFF;
   IO0CLR=0Xff << 7;
   IO0CLR =LCD_RW;
    IO0CLR =LCD_E;
   IO0CLR =LCD_CS1;
}
void LCD_BESY2(void)
{  	IO0SET=0Xff << 7;
	IO0DIR =0X0003BFFF;	
   IO0CLR =LCD_RS;
   IO0SET =LCD_RW;
   IO0SET =LCD_CS2;
   IO0SET =LCD_E;
   while((IO0PIN&0x4000)==0x4000);
   IO0DIR =0X0003FFFF;
   IO0CLR=0XFF << 7;
   IO0CLR =LCD_RW;
   IO0CLR =LCD_E;
   IO0CLR =LCD_CS2;
}
/*********************************************************************************************************
** 函数名称 :LCD_WC
** 函数功能 :LCD的指令写入
** 入口参数 :DAT
** 出口参数 :无 		   RS=L RW=L CS=H E=H
*********************************************************************************************************/
void LCD_WC1(uint8 DAT)
{  LCD_BESY1();
   
   IO0CLR =LCD_RS;
   IO0CLR =LCD_RW;
   IO0SET =LCD_CS1;
   IO0SET = DAT << 7;
   IO0SET =LCD_E;
   DelayUS(1);
   IO0CLR =LCD_E;
   IO0CLR =LCD_CS1;
   IO0CLR = 0xFF << 7;
}

void LCD_WC2(uint8 DAT)
{  LCD_BESY2();
   
   IO0CLR =LCD_RS;
   IO0CLR =LCD_RW;
   IO0SET =LCD_CS2;
    IO0SET = DAT << 7;
   IO0SET =LCD_E;  
   DelayUS(1);
   IO0CLR =LCD_E;
   IO0CLR =LCD_CS2;
   IO0CLR = 0xFF << 7;
}
/*********************************************************************************************************
** 函数名称 :LCD_WD
** 函数功能 :LCD的数据写入
** 入口参数 :DAT
** 出口参数 :无		  RS=H RW=L CS=H E=H
*********************************************************************************************************/

void LCD_WD1(uint8 DAT)
{	LCD_BESY1();
   
   IO0SET =LCD_RS;
   IO0CLR =LCD_RW;
   IO0SET =LCD_CS1;
   IO0SET = DAT << 7;
   IO0SET =LCD_E;
   DelayUS(1);
   IO0CLR =LCD_E;
   IO0CLR =LCD_RS;
   IO0CLR =LCD_CS1;
   IO0CLR = 0xFF << 7;
}

void LCD_WD2(uint8 DAT)
{  LCD_BESY2();
   
   IO0SET =LCD_RS;
   IO0CLR =LCD_RW;
   IO0SET =LCD_CS2;
   IO0SET = DAT << 7;
   IO0SET =LCD_E;
   DelayUS(1);
   IO0CLR =LCD_E;
   IO0CLR =LCD_RS;
   IO0CLR =LCD_CS2;
   IO0CLR = 0xFF << 7;
}
void LCD_WD(uint8 DAT)
{   
	
	 if((LCD_X)<64)
      LCD_WD1(DAT);
   else
      LCD_WD2(DAT);
	
	   					//设置地址页指针
}
/*********************************************************************************************************
** 函数名称 :LCD_POS
** 函数功能 :LCD的内部数据地址指针定位
** 入口参数 :LCD_X, LCD_Y
** 出口参数 :无
*********************************************************************************************************/
void LCD_POS(uint8 cmd_x, uint8 cmd_y)
{   
	cmd_x = (LCD_COL|LCD_X) ;       // 计算显示RAM地址	
	{  if((LCD_X)<64)
      LCD_WC1(cmd_x);
   else
      LCD_WC2(cmd_x);
	}

         					      //设置地址列指针
		 
	cmd_y = (LCD_PAGE|LCD_Y);  
	{  if((LCD_X)<64)
      LCD_WC1(cmd_y);
   else
      LCD_WC2(cmd_y);
	}  					//设置地址页指针
}
/*********************************************************************************************************
** 函数名称 :CLERA()
** 函数功能 :清屏
** 入口参数 :
** 出口参数 :无
*********************************************************************************************************
*/
void CLEAR(void)
{		for(LCD_Y=0;LCD_Y<8;LCD_Y++)
		{	 for(LCD_X=0;LCD_X<127;LCD_X++)
			 {LCD_POS(LCD_X,LCD_Y);
			
			  LCD_WD(0X00);    // 写入上半部汉字数据
			 }
		}
};
/*********************************************************************************************************
** 函数名称 :INT()
** 函数功能 :初始化设置子程序,主要是对显示区域的设置和显示方式的设置。
** 入口参数 :DAT1,DAT2
** 出口参数 :无
*********************************************************************************************************
*/
void INI(void)
{
	IO0SET = LCD_RES;
	LCD_WC1(LCD_ON);
	LCD_WC2(LCD_ON);
	LCD_WC1(LCD_STA);
	LCD_WC2(LCD_STA);
	CLEAR();
}	

// *********************************************** */
// 此表为图形显示方式下(自定义字符,包括汉字)的字模 */
uint8 const CCTAB[] = {

/////////////////////////////////////////////////////////////////////////
// 汉字字模表                                                          //
// 汉字库: 宋体12.dot 纵向取模下高位,数据排列:从左到右从上到下         //
/////////////////////////////////////////////////////////////////////////
    // 数据表
0x44,0x04,0x24,0x08,0xFF,0x07,0x14,0x09,0x70,0x05,0x57,0x03,0x75,0x01,0x85,0x0F,0x75,0x01,0x57,0x03,0x70,0x05,0x00,0x09,

 0x20,0x00,0x10,0x00,0xFC,0x0F,0x23,0x00,0x10,0x00,0x0C,0x00,0x07,0x00,0xFC,0x0F,0x24,0x01,0x24,0x01,0x26,0x01,0x24,0x01,

 0x20,0x08,0x22,0x04,0xE4,0x03,0x00,0x04,0xF9,0x0B,0xA9,0x08,0xAB,0x08,0xFD,0x0B,0xAB,0x08,0xA9,0x0A,0xF9,0x0B,0x00,0x08,

 0x10,0x00,0x11,0x00,0xF2,0x07,0x00,0x02,0x22,0x00,0x22,0x00,0xFE,0x0F,0x22,0x00,0x22,0x00,0xFF,0x07,0x02,0x08,0x00,0x0F,

 0x10,0x02,0x10,0x02,0x35,0x01,0x55,0x05,0x95,0x08,0xF5,0x07,0x55,0x00,0x95,0x00,0x5F,0x01,0x30,0x02,0x10,0x06,0x10,0x02,

 0x90,0x00,0x88,0x00,0x84,0x00,0xF3,0x00,0x92,0x00,0x92,0x00,0xFE,0x0F,0x92,0x00,0x92,0x00,0x93,0x00,0x92,0x00,0x82,0x00,

 0x00,0x08,0x00,0x04,0x00,0x02,0xFF,0x01,0x49,0x00,0x49,0x00,0x49,0x04,0x49,0x08,0x49,0x08,0xFF,0x07,0x00,0x00,0x00,0x00,

 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0xFF,0x07,0x02,0x00,0x00,0x00,

 0x00,0x0A,0x00,0x09,0xFE,0x0A,0xAA,0x0A,0xAA,0x0A,0xEA,0x0F,0xAA,0x0A,0xAA,0x0A,0xAA,0x0A,0xBF,0x0A,0x82,0x08,0x00,0x08,

 0x04,0x09,0xFF,0x05,0x54,0x03,0x54,0x01,0xFF,0x03,0x04,0x09,0x00,0x04,0xFE,0x03,0x92,0x00,0x92,0x04,0x92,0x08,0xFF,0x07,

 0x00,0x00,0x06,0x00,0xF6,0x00,0xF8,0x01,0x04,0x02,0x02,0x04,0x02,0x04,0x02,0x04,0x04,0x02,0x0C,0x01,0x00,0x00,0x00,0x00,

 0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x20,0x00,

 0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x04,0x06,0x00,0x04,

 0x00,0x04,0x02,0x04,0x22,0x04,0x22,0x04,0x22,0x04,0x22,0x04,0x22,0x04,0x22,0x04,0x32,0x04,0x23,0x04,0x02,0x06,0x00,0x04,

 0x00,0x00,0xFE,0x0F,0x02,0x05,0x82,0x04,0x7E,0x04,0x02,0x04,0x02,0x04,0x7E,0x04,0x82,0x04,0x82,0x04,0xFF,0x0F,0x02,0x00,

 0x02,0x08,0x02,0x08,0x22,0x08,0x22,0x08,0xE2,0x0F,0x3E,0x08,0x22,0x08,0x22,0x08,0xF2,0x0F,0x22,0x08,0x03,0x0C,0x02,0x08,

 0x08,0x04,0x08,0x02,0x08,0x01,0xC8,0x00,0x29,0x00,0x0A,0x00,0x2C,0x00,0x48,0x00,0x88,0x00,0x08,0x01,0x0C,0x06,0x08,0x00

 	
// 汉字表:
// 00操 01作 02通 03讯 04录 05 年 06月 07 日 08星 09 期 10 ℃ 11 一12 二 13 三 14四 15 五 16 六	17 日
}  ;
// *********************************************** */
// **
// **
// *********************************************** */
// 此表为图形显示方式下(西文字符:8*16点阵数据)的字模 */
uint8 const CTAB_8_16[] = {
	0xF8,0x07,0xFC,0x0F,0x04,0x09,0xC4,0x08,0x24,0x08,0xFC,0x0F,0xF8,0x07,0x00,0x00, // -0-

	0x00,0x00,0x10,0x08,0x18,0x08,0xFC,0x0F,0xFC,0x0F,0x00,0x08,0x00,0x08,0x00,0x00, // -1-

	0x08,0x0E,0x0C,0x0F,0x84,0x09,0xC4,0x08,0x64,0x08,0x3C,0x0C,0x18,0x0C,0x00,0x00, // -2-

	0x08,0x04,0x0C,0x0C,0x44,0x08,0x44,0x08,0x44,0x08,0xFC,0x0F,0xB8,0x07,0x00,0x00, // -3-

	0xC0,0x00,0xE0,0x00,0xB0,0x00,0x98,0x08,0xFC,0x0F,0xFC,0x0F,0x80,0x08,0x00,0x00, // -4-

	0x7C,0x04,0x7C,0x0C,0x44,0x08,0x44,0x08,0xC4,0x08,0xC4,0x0F,0x84,0x07,0x00,0x00, // -5-

	0xF0,0x07,0xF8,0x0F,0x4C,0x08,0x44,0x08,0x44,0x08,0xC0,0x0F,0x80,0x07,0x00,0x00, // -6-

	0x0C,0x00,0x0C,0x00,0x04,0x0F,0x84,0x0F,0xC4,0x00,0x7C,0x00,0x3C,0x00,0x00,0x00, // -7-

	0xB8,0x07,0xFC,0x0F,0x44,0x08,0x44,0x08,0x44,0x08,0xFC,0x0F,0xB8,0x07,0x00,0x00, // -8-

	0x38,0x00,0x7C,0x08,0x44,0x08,0x44,0x08,0x44,0x0C,0xFC,0x07,0xF8,0x03,0x00,0x00, // -9-


0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,/*":",10*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,/*".",11*/

0x00,0x00,0x20,0x3F,0x22,0x74,0x54,0x54,0x5F,0x64,0x24,0x34,0x34,0x54,0x0C,0x00,/*"好",12*/

0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x18,0x14,0x24,0x22,0x42,0x01,0x00,/*"人",13*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"一",14*/

0x00,0x00,0x08,0x28,0x48,0x3F,0x48,0x48,0x88,0x3E,0x08,0x08,0x08,0x08,0x7F,0x00,/*"生",15*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -