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

📄 main.c

📁 这是一个关于ARM7的实时时钟的C源代码
💻 C
字号:
/****************************************************************************
* File: main.c
* 功能: 运行RTC进行计时,并将所计时间值向LCD输出 
****************************************************************************/
#include  "config.h"

#define rs (1<<8)	// 0000 0001 0000 0000 = 0x0100 
#define rw (1<<9)	// 0000 0010 0000 0000 = 0x0200 
#define en (1<<10)	// 0000 0100 0000 0000 = 0x0400 
#define busy (1<<7)	// 0000 0000 1000 0000 = 0x0080 

#define rs_rw_en rs|rw|en  	// 0000 0111 0000 0000 = 0x0700 P8~P10 
#define lcd_pins 0x7FF	 	// 将 P0.0~P0.10 设置为输出  0000  0111 1111 1111

uint32 IO0DIR_bak; 
uint32 IO0SET_bak;
uint32 IO0CLR_bak;

uint8 MESSAGE[]="RTC Time is:";

#define   LED1CON   1<<23           /*P0.23口为LED2控制端 */

uint8 send_buf[16];           		// 数据缓冲区 

/****************************************************************************
* 名称:ChkBusy() 
* 功能:检查总线是否忙 
****************************************************************************/
void ChkBusy()
{
	IO0DIR_bak=IO0DIR;
	IO0DIR=rs_rw_en;	// 0000 0111 0000 0000 P8~P10 即 en, rw, rs 设置为输出, 其他为输入。 	
	while(1)
	{
		IO0CLR=(IO0CLR & ~rs)|rs; 	// 置 rs 为 0 
		IO0SET=(IO0SET & ~rw)|rw;	// 置 rw 为 1 
		IO0SET=(IO0SET & ~en)|en;	// 置 en 为 1, 禁用 LED 
		if(!(IO0PIN & busy))break; // 测试最低位数据,如果为低,总线空闲,跳出循环。 
		IO0CLR=(IO0CLR & ~en)|en;	// 置 en 为 0,使能 LCD 
	}
	IO0DIR=lcd_pins;	// 将 P0.0~P0.10 设置为输出  0000  0111 1111 1111
	IO0DIR=IO0DIR_bak;
}
/****************************************************************************
* 名称:WrOp()
* 功能:写操作数函数 
****************************************************************************/
void WrOp(uint8 dat)
{
	ChkBusy();
	IO0SET_bak=IO0SET;
	IO0CLR_bak=IO0CLR;
	IO0CLR=rs;		//全部清零 
	IO0CLR=rw;
	IO0CLR=0xff;	//先清零 
	IO0SET=dat;		//再送数	  
	IO0SET=en;
	IO0CLR=en;
	IO0SET=IO0SET_bak;
	IO0CLR=IO0CLR_bak;
}
/****************************************************************************
* 名称:WrDat()
* 功能:写数据函数 
****************************************************************************/
void WrDat(uint8 dat)	
{
	ChkBusy();
	IO0SET_bak=IO0SET;
	IO0CLR_bak=IO0CLR;
	IO0SET=rs;
	IO0CLR=rw;
	IO0CLR=0xff;	//先清零 
	IO0SET=dat;		//再送数 
	IO0SET=en;
	IO0CLR=en;
	IO0SET=IO0SET_bak;
	IO0CLR=IO0CLR_bak;
}
/****************************************************************************
* 名称:lcd_init()
* 功能:lcd初始化函数 
****************************************************************************/
void lcd_init(void)
{
	WrOp(0x38);			
	WrOp(0x06);			//光标加1 
	WrOp(0x0c);			//开显示 
}
/****************************************************************************
* 名称:DisText()
* 功能:显示文本函数
****************************************************************************/
void DisText(uint8 addr,uint8 *p)
{
	WrOp(addr);
	while(*p !='\0')WrDat(*(p++));
}

/*******************************************************************************
*名称: SendTimeRtc()
*功能: 读取RTC的时间值,并将读出的时分秒值由串口发送到上位机显示
*******************************************************************************/
void SendTimeRtc(void)
{ 
  uint32 times;
  uint8 bak;
  times=CTIME0;                  //读取完整时钟寄存器0
  bak=(times>>16)&0x1F;          //取得时的值 
  send_buf[0]=bak/10+'0';
  send_buf[1]=bak%10+'0';
  send_buf[2]=':';
  bak=(times>>8)&0x3F;           //取得分的值
  send_buf[3]=bak/10+'0';
  send_buf[4]=bak%10+'0';
  send_buf[5]=':';
  bak=times&0x3F;                //取得秒的值
  send_buf[6]=bak/10+'0';
  send_buf[7]=bak%10+'0';
  send_buf[8]='\n';
  
  DisText(0xC0,send_buf);	// 第二行字符地址为:C0~CF。 

}

/****************************************************************************
* 名称:RTCIni()		  
* 功能:初始化实时时钟。 
* 入口参数:无 
* 出口参数:无 
****************************************************************************/
void  RTCIni(void)
{  PREINT = Fpclk / 32768 - 1;			// 设置基准时钟分频器
   PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
   
   YEAR = 2004;				   		 	// 初始化年 
   MONTH = 2;				    		// 初始化月 
   DOM = 19;				    		// 初始化日 
   HOUR = 8;
   MIN = 30;
   SEC = 0;
      
   CIIR = 0x01;				    		// 设置秒值的增量产生一次中断
   CCR = 0x01;				    		// 启动RTC
}

/****************************************************************************
* 名称:main() 
* 功能: 读取实时时钟的值,并发送到 LCD 
****************************************************************************/

int  main(void)
{   
	IO0DIR = LED1CON;	

	IO0DIR=(IO0DIR & ~lcd_pins) | lcd_pins;		// 将 P0.0~P0.10 设置为输出  0000  0111 1111 1111
	IO0CLR=(IO0CLR & ~lcd_pins) | lcd_pins;		// 将 P0.0~P0.10 设置为低电平 
	lcd_init();	
	DisText(0x80,MESSAGE);	// 第一行字符地址为:80~8F。 

	RTCIni();                 //初始化RTC

    while(1)
    { IO0SET = (IO0SET & ~LED1CON) | LED1CON;          //熄灭LED
      while(0==(ILR&0x01));  //等待RTC增量中断标志位
      ILR=0x01;               //清除中断标志位
      SendTimeRtc();          //读取时钟值,并向LCD发送
      IO0CLR = (IO0CLR & ~LED1CON) | LED1CON;          //点亮LED
      while(0==(ILR&0x01));
      ILR=0x01;
      SendTimeRtc();
    }
    //return(0);
}

⌨️ 快捷键说明

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