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

📄 main.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)****************************************************
**                         Guangzhou ZHIYUAN electronics Co.,LTD.                               
**                                     
**                               http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**--------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "main.h"
/*********************************************************************************************************
** 跳线连接:	VBAT_SEL
** 				KEY1	KEY2	KEY3	KEY5	
**				TXD0	RXD0
**				BEEP
** 波 特 率:	9600
**********************************************************************************************************/
                                                                                                     
#define TASKKEY_ID            15      		                            /*  TaskKey任务的ID              */
#define TASKKEY_PRIO          TASKKEY_ID	                            /*  TaskKey任务的优先级          */
#define TASKKEY_STACK_SIZE    256     		                            /*  TaskKey定义用户堆栈长度      */

#define TASKDISP_ID           13      		                            /*  TaskDisp任务的ID             */
#define TASKDISP_PRIO         TASKDISP_ID	                            /*  TaskDisp任务的优先级         */
#define TASKDISP_STACK_SIZE   256     		                            /*  TaskDisp定义用户堆栈长度     */   

#define TASKSET_ID            11      		                            /*  TaskSet任务的ID              */
#define TASKSET_PRIO          TASKSET_ID	                            /*  TaskSet任务的优先级          */
#define TASKSET_STACK_SIZE    256     		                            /*  TaskSet定义用户堆栈长度      */ 

static OS_EVENT  		*KeyBox; 
static OS_EVENT  		*RtcBox; 

OS_STK  TASKKEY_STACK[TASKKEY_STACK_SIZE];
OS_STK  TASKDISP_STACK[TASKDISP_STACK_SIZE];
OS_STK  TASKSET_STACK[TASKSET_STACK_SIZE];

#define     KEY1    1 << 12                                             /*  P0.12为KEY1输入脚            */
#define     KEY2    1 << 24						                        /*  P0.24为KEY2输入脚            */
#define     KEY3    1 << 25						                        /*  P0.25为KEY3输入脚            */
#define     KEY5    1 << 15						                        /*  P0.15为KEY5输入脚            */
uint32 const KEY[4] = {KEY1,KEY2,KEY3,KEY5};    
uint8 const SHOWTABLE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void TaskKey(void *pdata);
void TaskDisp(void *pdata);
void TaskSet(void *pdata);



/*********************************************************************************************************
** Function name:      rtcException
** Descriptions:       RTC的中断服务函数
** Input parameters:   无
** Output parameters:  无			    
********************************************************************************************************/
void rtcException(void)
{
    static INT32U time[2];
    ILR |= 0x03;							                            /*  清除RTC增量中断标志          */
    time[0] = CTIME0; 
    time[1] = CTIME1;
    OSMboxPost(RtcBox,(void*)time);
    VICVectAddr = 0;                                 	                /*  通知中断控制器中断结束       */

}

/*********************************************************************************************************
** Function name:     uart0Init
** Descriptions:      UART0的初始化
** Input parameters:  无
** Output:            无 
*********************************************************************************************************/
void uart0Init(void)
{
    INT32U 	Fdiv = 0;
    PINSEL0 = (PINSEL0&0xffffff0f)|(0x01 << 4)|(0x01 << 6);	            /*  设置P0.2和P0.3连接到UART0    */
    U0LCR 	= 0x80;							                            /*  设置为8位数据位,1位停止位, */
                                                                        /*  无奇偶校验,DLAB=1,允许设置  */
                                                                        /*  波特率                       */
    Fdiv 	= (Fpclk / 16) / 9600;		                                /*  设置波特率                   */
    U0DLM 	= (INT32U)(Fdiv / 256);
    U0DLL 	= (INT32U)(Fdiv % 256);
    U0LCR 	= 0x03;							                            /*  令DLAB位为0                  */ 
    U0FCR 	&= ~0x07;						                            /*  禁用FIFO                     */
    U0IER 	&= ~0x07;						                            /*  禁止UART0产生中断            */
}


/*******************************************************************************************************
** Function name:     rtcInit
** Descriptions:      按照默认值初始化实时时钟.RTC被初始化为时钟源选择Fpclk,秒值增加一次后产生中断.
** Input parameters:  time:初始化时间指针
** Output:            无
*******************************************************************************************************/
void rtcInit(uint16 *time)
{   
  	                                              
    CCR   = 0x00;								                        /*  禁止时间计数器               */
	PREINT 	= Fpclk / 32768 - 1;				                        /*  设置基准时钟分频器,RTC时钟使*/
                                                                        /*  用内部时钟分频得到           */
	PREFRAC = Fpclk % 32768;
    YEAR 	= time[0];							                        /*  初始化时间寄存器             */
    MONTH	= time[1];
    DOM 	= time[2];
    DOW 	= time[3];
    HOUR	= time[4];
    MIN 	= time[5];
    SEC		= time[6];
    CISS    &= ~(0x01 << 7);					                        /*  必需禁止次秒级中断,因为该寄存*/
                                                                        /*  器的值不受复位影响           */ 
    AMR		|= 0xff;							                        /*  必需禁止报警,因为它的值不受复*/
                                                                        /*  位影响                       */
    CIIR 	= 0x01;								                        /*  设置秒值的增量产生1次中断    */ 
    ILR  	|= 0x03;							                        /*  清除RTC增量中断标志          */
    CCR  	= 0x01;                                                     /*  启动RTC,时钟源使用Fpclk     */
   
}
					

/*********************************************************************************************************
** Function name:     uart0SendByte
** Descriptions:      从串口0发送数据
** Input parameters:  发送的字节数据
** Output:            无
********************************************************************************************************/
void uart0SendByte(uint8 data)
{
    U0LCR 	= 0x03;							                            /*  令DLAB位为0                  */
    U0THR   = data;
    while ( (U0LSR & 0x20) == 0 );	
}

/*********************************************************************************************************
** Function name:     pcDispChar
** Descriptions:      向PC机发送显示字符
** Input parameters:  no	显示位置
**			          chr	显示的字符,不能为ff
** Output:            无
********************************************************************************************************/
void pcDispChar (uint8 no, uint8 chr)
{
    uart0SendByte(0xff);
    uart0SendByte(0x81);
    uart0SendByte(no);
    uart0SendByte(chr);
    uart0SendByte(0x00);
}

/*********************************************************************************************************
** Function name:     keyIn
** Descriptions:      查询按键的输入
** Input parameters:  无
** Returned value:    有效键按下时,返回对应的键值,否则返回0;			    
********************************************************************************************************/
INT32U keyIn(void)
{ 
    INT32U i,uiKey;
    
    for (i=0;i<4;i++) {
        uiKey = KEY[i];
        if ((uiKey&IO0PIN) == 0) {
            break;
        }
    }
	
    if (i >=4 ) {
    uiKey = 0;
    }
    return uiKey;
}

/*******************************************************************************************
** Function name:      timeDisp
** Descriptions:       将RTC的数据发送到PC机上显示
** Input parameters:   uiTimes  RTC的CTIME0的值
                       uiDates  RTC的CTIME1的值
** Output parameters:  无 
*******************************************************************************************/
void timeDisp(INT32U uiTimes,INT32U uiDates)
{   
    INT32U uiTimedata;
   
    uiTimedata = (uiDates >> 16) & 0xfff;	                            /*  发送年                       */
    pcDispChar(0, SHOWTABLE[uiTimedata / 1000]);
    uiTimedata = uiTimedata % 1000;
    pcDispChar(1, SHOWTABLE[uiTimedata / 100]);
    uiTimedata = uiTimedata % 100;
    pcDispChar(2, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(3, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = (uiDates >> 8) & 0x0f;		                            /*  发送月                       */
    pcDispChar(4, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(5, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = uiDates & 0x1f;				                        /*  发送日                       */
    pcDispChar(6, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(7, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = (uiTimes >> 24) & 0x07;		                        /*  发送星期                     */
    pcDispChar(8, SHOWTABLE[uiTimedata]);
		
    uiTimedata = (uiTimes >> 16) & 0x1f;		                        /*  发送小时                     */
    pcDispChar(9, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(10, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = (uiTimes >> 8) & 0x3f;		                            /*  发送分钟                     */
    pcDispChar(11, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(12, SHOWTABLE[uiTimedata % 10]);
	
    uiTimedata = uiTimes & 0x3f;				                        /*  发送秒钟                     */
    pcDispChar(13, SHOWTABLE[uiTimedata / 10]);
    pcDispChar(14, SHOWTABLE[uiTimedata % 10]);
}

/*******************************************************************************************
** Function name:      timeGet
** Descriptions:       根据输入的编号,获得对应编号的数据位的值。
** Input parameters:  n  PC的万年历窗口中时间数据位对应的编号。
** Output parameters: 无
** Returned value:     输入编号对应的时间数据位的值
*******************************************************************************************/
INT32U timeGet(INT32U n)
{	
    INT32U uiTimedata,uiTimes,uiDates;
    uiTimes = (INT32U)CTIME0;					                        /*  读取完整的时钟寄存器         */
    uiDates = (INT32U)CTIME1;
    switch(n) {
    case 0:
        uiTimedata = (uiDates >> 16) & 0xfff;	                        /*  获取年的千位数据             */
        uiTimedata = uiTimedata / 1000;
        break;
    case 1:
        uiTimedata = (uiDates >> 16) & 0xfff;	                        /*  获取年的百位数据             */
        uiTimedata = uiTimedata % 1000;
        uiTimedata = uiTimedata / 100;
        break;
    case 2:                                                             /*  获取年的十位数据             */
        uiTimedata = (uiDates >> 16) & 0xfff;
        uiTimedata = uiTimedata % 100;
        uiTimedata = uiTimedata / 10;
        break;
    case 3:                                                             /*  获取年的个位数据             */
        uiTimedata = (uiDates >> 16) & 0xfff;
        uiTimedata = uiTimedata % 10;
        break;
	case 4:
        uiTimedata = (uiDates >> 8) & 0x0f;		                        /*  获取月的十位数据             */ 
        uiTimedata = uiTimedata / 10;
        break;
	case 5:
        uiTimedata = (uiDates >> 8) & 0x0f;		                        /*  获取月的个位数据             */
        uiTimedata = uiTimedata % 10;
        break;
    case 6:
        uiTimedata = uiDates & 0x1f;				                    /*  获取日的十位数据             */
        uiTimedata = uiTimedata / 10;
        break;
    case 7:
        uiTimedata = uiDates & 0x1f;				                    /*  获取日的个位数据             */
        uiTimedata = uiTimedata % 10;
        break;
    case 8:
        uiTimedata = (uiTimes >> 24) & 0x07;		                    /*  获取星期数                   */
        break;
    case 9:
        uiTimedata = (uiTimes >> 16) & 0x1f;		                    /*  获取小时的十位数据           */
        uiTimedata = uiTimedata / 10;
        break;
    case 10:
        uiTimedata = (uiTimes >> 16) & 0x1f;		                    /*  获取小时的个位数据           */  
        uiTimedata = uiTimedata % 10;
        break;
    case 11:
        uiTimedata = (uiTimes >> 8) & 0x3f;		                        /*  获取分钟的十位数据           */
        uiTimedata = uiTimedata / 10;
        break;
    case 12:
        uiTimedata = (uiTimes >> 8) & 0x3f;		                        /*  获取分钟的个位数据           */
        uiTimedata = uiTimedata % 10;
        break;
    case 13:
        uiTimedata = uiTimes & 0x3f;				                    /*  获取秒钟的十位数据           */
        uiTimedata = uiTimedata / 10;
        break;
    case 14:
        uiTimedata = uiTimes & 0x3f;				                    /*  获取秒钟的个位数据           */
        uiTimedata = uiTimedata % 10;
        break;
    }
    return uiTimedata;
}

/*******************************************************************************************
** Function name:      timeSet
** Descriptions:       根据输入的编号,设置对应编号的时间数据位的值。
** Input parameters:  n  PC的万年历窗口中时间数据位对应的编号。
                       uiTimedata  对应的数据位变化的值,如:+1,-1 
** Output parameters: 无
** Returned value:     无
*******************************************************************************************/
void timeSet(INT32U n,INT32S uiTimedata)
{
    switch(n) {
    case 0:                                                             /*  设置年的千位数据             */
        YEAR += (INT32S)(uiTimedata*1000);

⌨️ 快捷键说明

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