历史上的今天
返回首页

历史上的今天

今天是:2025年07月13日(星期日)

正在发生

2021年07月13日 | 【ARM】s3c2440裸机之RTC数字时钟

2021-07-13 来源:eefocus

功能


裸机程序,实现LCD显示数字时钟


主要代码


1)背景绘制


void Brush_ U32  c)

{

    int x,y ;

    for ( y = 0 ; y < LCD_HEIGHT ; y++ )

    {

        for ( x = 0 ; x < LCD_WIDTH ; x++ )

        {

            LCD_BUFFER[y][x] = c ;

        }

    }

}


2)文字绘制


void Draw_Text16(U32 x,U32 y,U32 color,U32 backColor,const unsigned char ch[])

{

    unsigned short int i,j;

    unsigned char mask,buffer;

    /*一个汉字16行*/

    for (i=0;i<16;i++)

    {

        /*汉字左半部分*/

        mask=0x80;                        //从bit7开始判断

        buffer=ch[i*2];                   //提取一行的第一个字节

        /*一个字节有8个位,每一位代表字模数据对应的点是否描颜色*/

        for (j=0;j<8;j++)

        {

            if (buffer&mask)

            {

                PutPixel(x+j,y+i,color);  //为笔画上色

            }

            else

            {

                PutPixel(x+j,y+i,backColor); //背景色

            }

            mask=mask>>1;                 //移位,为判断下一位作准备

        }

        /*汉字右半部分*/

        mask=0x80;                        //从bit7开始判断

        buffer=ch[i*2+1];                 //提取一行的第二个字节

        /*一个字节有8个位,每一位代表字模数据对应的点是否描颜色*/

        for (j=0;j<8;j++)

        {

            if (buffer&mask)

            {

                PutPixel(x+j+8,y+i,color); //为笔画上色

            }

            else

            {

                PutPixel(x+j+8,y+i,backColor);//背景色

            }

            mask=mask>>1;                 //移位,为判断下一位作准备

        }

    }

}


3)时钟设置


void RTC_Time_Set( void )

{

    /*RTC读写使能,选择BCD时钟、计数器,无复位,1/32768*/

    rRTCCON = 1 ;   

    rBCDYEAR = 0x13;        /*年*/

    rBCDMON  = 0x05;        /*月*/

    rBCDDATE = 0x09;        /*日*/

    rBCDDAY  = 0x04;        /*星*/

    rBCDHOUR = 0x10;        /*小时*/

    rBCDMIN  = 0x57;        /*分*/

    rBCDSEC  = 0x20;        /*秒*/

    /*关读写使能*/

    rRTCCON &= ~1 ;

}


4)数字绘制


void Draw_Text_8_16(U32 x,U32 y,U32 color,U32 backColor,const unsigned char *chs)

{

    U32 i=0;

    while (*chs != '')

    {   //汉字内码都是大于0xa0

        if (*chs > 0xa0)

        {

            /*查汉字表*/

            for (i=0 ;i < GB16_NUM();i++)

            {

                /*换行*/

                if(x>235)

                {

                    x=0;

                    y=y+16;

                }

                /*判断汉字是否匹配*/

                if ((*chs == hz_index[i]) && (*(chs+1) == hz_index[i+1]))

                {

                    /*写汉字*/

                    Draw_Text16(x,y,color,backColor,&hz[16*(i)]);

                    /*增加X坐标值,为写下一个汉字或字符作准备*/

                    x +=16;

                    break;

                }

            }

            /*字符串指针加2,一个汉字编译后内码占两个字节*/

            chs+=2;

        }

        /*如果是字符*/

        else

        {

            /*换行*/

            if(x>230)

            {

                x=0;

                y=y+16;

            }

            /*查字符表*/

            for (i=0 ;i < ASCII_NUM();i++)

            {

                /*判断字符是否匹配*/

                if (*chs == zf_index[i])

                {

                    /*写字符*/

                    Draw_ASCII(x,y,color,backColor,&zf[16*i]);

                    /*增加X坐标值,为写下一个汉字或字符作准备*/

                    x += 8;

                    break;

                }

            }

            /*字符串指针加1,一个字符编译后内码占1个字节*/

            chs++;

        }

    }

}


5)时钟显示


void rtc_display_lcd(void)

 {

                          //0   1   2   3   4

     unsigned char time[]={'2','0','1','3','-',

                          //5   6   7   8   9  10

                           '0','5','-','0','9',' ',

                          //11  12  13  14  15  16  17  18

                           '1','5',':','2','1',':','5','9',

                           ''};

     time[2]=rBCDYEAR/16+'0';   //年十位,16进制

     time[3]=rBCDYEAR%16+'0';   //年个位

     time[5]=rBCDMON/16+'0';    //月十位

     time[6]=rBCDMON%16+'0';    //月个位

     time[8]=rBCDDATE/16+'0';   //天十位

     time[9]=rBCDDATE%16+'0';   //天个位

     time[11]=rBCDHOUR/16+'0';   //时十位

     time[12]=rBCDHOUR%16+'0';   //时个位

     time[14]=rBCDMIN/16+'0';    //分十位

     time[15]=rBCDMIN%16+'0';    //分个位

     time[17]=rBCDSEC/16+'0';   //秒十位

     time[18]=rBCDSEC%16+'0';   //秒个位

     /*调用LCD显示时间程序*/

     if(time[18]%2==1)

     {

      time[16]=':';

     }

     else

     {

      time[16]=' ';

     }

     Draw_Text_8_16(50,220,0x0,0xffff,(const unsigned char * )time);   

}


6)实时刷新


    while (1)

    {

        /*读取时间,并LCD显示*/                       

        rtc_display_lcd();

        for(r=0;r<3;r++)

    {

        for(a=0;a<(2*PI);)

        {

            X=(int)(r*cos(a)+120);

            Y=(int)(r*sin(a)+120);

            LCD_BUFFER[Y][X]=0X00;

            a=a+(PI/360);

        }

    }

/************秒指针的显示*************/ 

        n=(rBCDSEC/16)*10+(rBCDSEC%16);

        if(secondbit!=n)

        {

            for(w=0;w<66;w++)//清前一秒秒表指针,必须要清掉      

            {

                X=(int)(w*cos((3*PI/2)+secondbit*(PI/30))+120);

                Y=(int)(w*sin((3*PI/2)+secondbit*(PI/30))+120);

推荐阅读

史海拾趣

问答坊 | AI 解惑

日本:着手认证试验蓝牙产品(转)

 日本质量协会(JQA)宣布从2001年12月20日开始进行蓝牙产品的标志认证试验。标志认证是将蓝牙嵌入产品时证明其符合标准的手续。日本质量协会(JQA)对已经安装有通过认证的模块的产品进行试验。认证试验由BQB(Bluetooth Qualification Body)认 ...…

查看全部问答>

exdi2是否只支持oal,而不支持应用程序的调试?

基于exdi2rvi,我利用visual studio2005和rvi仿真器,在三星6410上进行调试。是否exdi2只支持oal,只能进行image的调试,而对于应用程序(.exe)和驱动(.dll)无能为力?请教各位,谢谢…

查看全部问答>

SSP与SSI接口的区别?

SSP与SSI接口的区别?…

查看全部问答>

请教:AD1674的DB6-DB0值不稳定的原因

我在使用ad1674时发现,转换后的DB6-DB0这几位数据不稳定,比如说输入5V电压,转换后的DB11-DB7这几位的值是固定不变的,但是DB6-DB0这几位时而是0,时而是1。所以在采集100HZ的正弦波时,得到的数据重新绘出的波形,不是很平滑的正弦波。 不知道 ...…

查看全部问答>

求助嵌入式GPRS手机数据接收问题

请问在使用JXARM9-2410的ADTIDE编程中使用GPRS模快的时候 有什么函数或者是方法能获取到通话过程中对方手机按键盘的信息. 有没有什么AT命令能把GPRS转换成接收手机按键信息,如果有接收后的信息怎么获取,存放在哪里…

查看全部问答>

求助:能否删除用户模式,使得一个ARM处理器能正常应用,分析适用场合与优缺点,,

求助:     能否删除用户模式,使得一个ARM处理器能正常应用,分析适用场合与优缺点,,请高手指点一二。。。。。。   谢谢…

查看全部问答>

哪里可以得到LM3S8962评估套件里的程序代码?

如题:        哪里可以得到LM3S8962评估套件里的程序代码?…

查看全部问答>

出售闲置

  出售闲置:1.火牛STM32开发板2.microchip开发套件  进口ICD3+18片(PIC18F87J10)+microchip以太网串口 价格QQ上聊 需要的朋友联系QQ:562191411…

查看全部问答>

富士通FM3应用笔记和示例代码

Application Notes and Sample Code Software & OS No. Product Serial Title Description Application Notes Sanple Code MN706-00001-1v0-E 32bit Microcontroller FM3 Family Application Note FM3 Family uT-Kernel ...…

查看全部问答>

【ULP Advisor Rule Table】规则1.1确保使用低功耗模式

从今天起逐渐的将ULP的规则介绍给大家,ULP Advisor作为低功耗使用的助手,刚推出的时候引起过大家的关注。 好久没人提过了,我老看到这样的代码__bis_SR_register(LPM3_bits + GIE); while(1);//这句话啥用?????复制代码可见初学者受51影响 ...…

查看全部问答>