桌面时钟怎么设置

桌面时钟怎么设置,第1张

#include <reg51h>

#include <intrinsh>

unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"};

unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};//星期月参变数

unsigned char data dis_buf1[16];//lcd上排显示缓冲区

unsigned char data dis_buf2[16];//lcd下排显示缓冲区

unsigned char data year,month,date,week;//年、月、日、星期

unsigned char data armhour,armmin,armsec;//闹钟时、分、秒

unsigned char data hour,min,sec,sec100;//时、分、秒、百分之一秒

unsigned char data flag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值

bitalarm;//标识是否启用闹钟,1--启用,0--关闭

sbit rs = P2^0;//LCD数据/命令选择端(H/L)

sbit rw = P2^1;//LCD读/写选择端(H/L)

sbit ep = P2^2;//LCD使能控制

sbitPRE = P3^3;//调整键(AN3)

sbitSET = P3^4;//调整键(AN4)

sbitSPK = P3^6;

void delayms(unsigned char ms);//延时程序

bit lcd_busy();//测试LCD忙碌状态程序

void lcd_wcmd(char cmd);//写入指令到LCD程序

void lcd_wdat(char dat);//写入数据到LCD程序

void lcd_pos(char pos);//LCD数据指针位置程序

void lcd_init();//LCD初始化设定程序

void pro_timedate();//时间日期处理程序

void pro_display();//显示处理程序

void pro_key();//按键处理程序

void time_alarm();//定时报警功能(闹钟)

unsigned char scan_key();//按键扫描程序

unsigned char week_proc();//星期自动计算与显示函数

bit leap_year();//判断是否为闰年

void lcd_sef_chr();//LCD自定义字符程序

void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);

//更新显示缓冲区函数

// 延时程序

void delay(unsigned char ms)

{while(ms--)

{unsigned char i;

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

{

_nop_(); //执行一条_nop_()指令为一个机器周期

_nop_();

_nop_();

_nop_();

}

}

}

//测试LCD忙碌状态

bit lcd_busy()

{

bit result;

rs = 0;

rw = 1;

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

result =(bit)(P0&0x80);//LCD的D0--D7中,D7=1为忙碌,D7=0为空闲

ep = 0;

return result;

}

//写入指令到LCD

void lcd_wcmd(char cmd)

{

while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令

rs = 0;

rw = 0;

ep = 0;

_nop_();

_nop_();

P0 = cmd;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 0;

}

//写入数据到LCD

void lcd_wdat(char dat)

{

while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据

rs = 1;

rw = 0;

ep = 0;

P0 = dat;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 0;

}

//LCD数据指针位置程序

void lcd_pos(char pos)

{

lcd_wcmd(pos|0x80);//数据指针=80+地址码(00H~27H,40H~67H)

}

//设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符)

//这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)

void lcd_sef_chr()

{//第一个自定义字符

lcd_wcmd(0x40);//"01 000 000" 第1行地址 (D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))

lcd_wdat(0x1f);//"XXX 11111"第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)

lcd_wcmd(0x41);//"01 000 001" 第2行地址

lcd_wdat(0x11);//"XXX 10001"第2行数据

lcd_wcmd(0x42);//"01 000 010" 第3行地址

lcd_wdat(0x15);//"XXX 10101"第3行数据

lcd_wcmd(0x43);//"01 000 011" 第4行地址

lcd_wdat(0x11);//"XXX 10001"第4行数据

lcd_wcmd(0x44);//"01 000 100" 第5行地址

lcd_wdat(0x1f);//"XXX 11111"第5行数据

lcd_wcmd(0x45);//"01 000 101" 第6行地址

lcd_wdat(0);//"XXX 01010"第6行数据

lcd_wcmd(0x46);//"01 000 110" 第7行地址

lcd_wdat(0x1f);//"XXX 11111"第7行数据

lcd_wcmd(0x47);//"01 000 111" 第8行地址

lcd_wdat(0x00);//"XXX 00000"第8行数据

//第二个自定义字符

lcd_wcmd(0x48);//"01 001 000" 第1行地址

lcd_wdat(0x01);//"XXX 00001"第1行数据

lcd_wcmd(0x49);//"01 001 001" 第2行地址

lcd_wdat(0x1b);//"XXX 11011"第2行数据

lcd_wcmd(0x4a);//"01 001 010" 第3行地址

lcd_wdat(0x1d);//"XXX 11101"第3行数据

lcd_wcmd(0x4b);//"01 001 011" 第4行地址

lcd_wdat(0x19);//"XXX 11001"第4行数据

lcd_wcmd(0x4c);//"01 001 100" 第5行地址

lcd_wdat(0x1d);//"XXX 11101"第5行数据

lcd_wcmd(0x4d);//"01 001 101" 第6行地址

lcd_wdat(0x1b);//"XXX 11011"第6行数据

lcd_wcmd(0x4e);//"01 001 110" 第7行地址

lcd_wdat(0x01);//"XXX 00001"第7行数据

lcd_wcmd(0x4f);//"01 001 111" 第8行地址

lcd_wdat(0x00);//"XXX 00000"第8行数据

}

//LCD初始化设定

void lcd_init()

{

lcd_wcmd(0x38);//设置LCD为16X2显示,5X7点阵,八位数据借口

delay(1);

lcd_wcmd(0x0c);//LCD开显示及光标设置(光标不闪烁,不显示"-")

delay(1);

lcd_wcmd(0x06);//LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)

delay(1);

lcd_wcmd(0x01);//清除LCD的显示内容

delay(1);

}

//闰年的计算

bit leap_year()

{

bit leap;

if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件

leap=1;

else

leap=0;

return leap;

}

//星期的自动运算和处理

unsigned char week_proc()

{unsigned char num_leap;

unsigned char c;

num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年数

if( leap_year()&& month<=2 ) //既是闰年且是1月和2月

c=5;

else

c=6;

week=(year+para_month[month]+date+num_leap+c)%7;//计算对应的星期

return week;

}

//更新显示缓冲区

void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s)

{dis_buf1[0]=t1; //

dis_buf1[1]=0x20; //空格

dis_buf1[2]=50; //'2'

dis_buf1[3]=48; //'0'

dis_buf1[4]=year/10+48;

dis_buf1[5]=year%10+48;

dis_buf1[6]=0x2d;

dis_buf1[7]=month/10+48;

dis_buf1[8]=month%10+48;

dis_buf1[9]=0x2d; //'-'

dis_buf1[10]=date/10+48;

dis_buf1[11]=date%10+48;

dis_buf1[12]=0x20;

dis_buf1[13]=dis_week[4week];

dis_buf1[14]=dis_week[4week+1];

dis_buf1[15]=dis_week[4week+2];

dis_buf2[0]=t2[0];

dis_buf2[1]=t2[1];

dis_buf2[2]=t2[2];

dis_buf2[3]=t2[3];

dis_buf2[4]=t2[4];

dis_buf2[5]=t2[5];

dis_buf2[6]=t2[6];//空格

if (alarm)

dis_buf2[7]=0x01;//alarm=1,显示闹钟启用标致(第二个自定义字符)

else

dis_buf2[7]=0x20;//alarm=0,不显示闹钟启用标致

dis_buf2[8]=dis_h/10+48;

dis_buf2[9]=dis_h%10+48;

dis_buf2[10]=0x3a;//':'

dis_buf2[11]=dis_m/10+48;

dis_buf2[12]=dis_m%10+48;

dis_buf2[13]=0x3a;

dis_buf2[14]=dis_s/10+48;

dis_buf2[15]=dis_s%10+48;

}

//时间和日期处理程序

void pro_timedate()

{

sec++;

if(sec > 59)

{sec = 0;

min++;

if(min>59)

{min=0;

hour++;

if(hour>23)

{hour=0;

date++;

if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)

if (date>31) {date=1;month++;}//大月31天

if (month==4||month==6||month==9||month==11)

if (date>30) {date=1;month++;}//小月30天

if (month==2)

{if( leap_year())//闰年的条件

{if (date>29) {date=1;month++;}}//闰年2月为29天

else

{if (date>28) {date=1;month++;}}//平年2月为28天

}

if (month>12) {month=1;year++;}

if (year>99) year=0;

}

}

}

week_proc();

if (sec==armsec && min==armmin && hour==armhour)

{if (alarm)

TR1=1;//闹钟启用时,报警时间到,启动Timer1

}

}

//显示处理程序

void pro_display()

{unsigned char i;

lcd_pos(0x00);

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

{lcd_wdat(dis_buf1[i]);}

lcd_pos(0x40);

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

{lcd_wdat(dis_buf2[i]);}

}

//Timer0中断处理程序,秒的产生

void timer0() interrupt 1

{

TH0=0xD8;

TL0=0xF0;

sec100++;

if(sec100 >= 100)//1秒时间 (10010ms=1000ms=1s)

{sec100 = 0;

pro_timedate();//调用时间和日期处理程序

}

if (sec&0x01)//"RICHMCU"闪一秒,停一秒

update_disbuf(0x00," ",hour,min,sec); //0x00表示显示00位置的自定义字符

else

update_disbuf(0x00,"RICHMCU",hour,min,sec);

pro_display(); //调用显示处理函数

}

//按键扫描程序

unsigned char scan_key()

{

skey=0x00;//给变量vkey置初值

skey|=PRE;//读取PRE键的状态

skey=skey<<1;//将PRE键的状态存于skey的B1位

skey|=SET;//读取SET键的状态,并存于skey的B0位

return skey;//返回skey的键值(即PRE,SET的状态)

}

//外部中断INT0中断处理程序

void int0() interrupt 0

{

TR0=0;//禁止Timer0

IE=0;//禁止中断

lcd_wcmd(0x0e);//显示光标"_",整个光标不闪烁

alarm=1;

update_disbuf(0x50,"alarm:",armhour,armmin,armsec);//更新显示数据,0x50表示要显示"P"

pro_display();//调用显示处理程序

lcd_pos(0x47); //使光标位于第一个调整项下

flag=0;

vkey=0x03;

while(flag^0)

{skey = scan_key();//扫描按键状态

if (skey^vkey)//若skey与vkey相同,跳出循环,相异执行循环体

{delay(10);//去按键抖动

skey = scan_key();//转回扫描按键状态

if (skey^vkey)//若skey与vkey相同,跳出循环,相异执行循环体

{vkey=skey;//将skey的值付给vkey

if (skey==0x01)//PRE键按下

{ flag++;//调整标志位加1

switch (flag)//将光标置于相应调整位置

{

case 1: lcd_pos(0x49);break;//光标置小时报警设置位置

case 2:lcd_pos(0x4c);break;//光标置分钟报警设置位置

case 3:lcd_pos(0x4f);break;//光标置秒时报警设置位置

case 4:update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x05);break;//光标置年调整位置

case 5:lcd_pos(0x08);break;//光标置月调整位置

case 6:lcd_pos(0x0b);break;//光标置日调整位置

case 7: lcd_pos(0x49);break;//光标置时调整位置

case 8:lcd_pos(0x4c);break;//光标置分调整位置

case 9:lcd_pos(0x4f);break;//光标置秒调整位置

default:break;

}

}

if (skey==0x02) //SET键按下

{pro_key();//转设置按键处理程序

}

}

}

}

lcd_wcmd(0x0c);//设置LCD开显示及光标不闪烁,不显示"-"

lcd_wcmd(0x01); //清除LCD的显示内容

IE=0x8f; //CPU开中断,INT0,INT1,开中断

TR0=1;//Timer0启动

}

//主程序,初始化及初值设定

void main()

{

lcd_init(); //初始化LCD

lcd_sef_chr();//写入自定义字符号

hour=0;min=0;sec=0; //开机时的时,分,秒显示

armhour=0;armmin=0;armsec=0;//开机时的时,分,秒报警初值

year= 5; month=1;date=1; //开机时的年,月,日,星期显示

week_proc();

alarm=1;//初始开机,启用闹钟

IE = 0x8f;//CPU开中断,INT0,INT1,Timer0,Timer1开中断

IP = 0x04;//设置INT0为中断最高优先级

IT0=0;IT1=0;//外部INT0,INT1设置为电平触发方式(注意,触发不要选边沿方式,易误动)

TMOD = 0x11;//Timer0,Timer1工作于模式1, 16位定时方式

TH0 = 0xdc;TL0 = 0x00;//Timer0置10ms定时初值

TH1 = 0xff;TL1 = 0x00;//Timer1置初值

TR0 = 1;//Timer0启动

TR1 = 0;

while(1);

}

//设置按键处理程序

void pro_key()

{

switch (flag)

{

case 0:alarm=!alarm;//启用或关闭闹钟(alarm=1:启用,alarm=0:关闭)

update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新显示数据

pro_display();//调用显示处理

lcd_pos(0x47);break;//光标回到原调整位置

case 1:armhour++;

if (armhour>23) armhour=0;

update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新显示数据

pro_display();//调用显示处理

lcd_pos(0x49);break;//光标回到原调整位置

case 2:armmin++;

if (armmin>59) armmin=0;

update_disbuf(0x50,"alarm:",armhour,armmin,armsec);

pro_display();

lcd_pos(0x4c);break;

case 3:armsec++;

if (armsec>59) armsec=0;

update_disbuf(0x50,"alarm:",armhour,armmin,armsec);

pro_display();

lcd_pos(0x4f);break;

case 4:year++;

if(year> 99) year= 0;

week_proc(); //星期自动运算

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x05);break;

case 5:month++;

if (month>12) month=1;

week_proc();//星期自动运算

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x08);break;

case 6:date++;

if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)

if (date>31) date=1;//大月31天

if (month==4||month==6||month==9||month==11)

if (date>30) date=1;//小月30天

if (month==2)

{if(leap_year())//闰年的条件

{if (date>29) date=1;}//闰年2月为29天

else

{if (date>28) date=1;}}//平年2月为28天

week_proc(); //星期自动运算

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x0b);break;

case 7:hour++;

if (hour>23) hour=0;

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x49);break;

case 8:min++;

if (min>59) min=0;

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x4c);break;

case 9:sec++;

if (sec>59) sec=0;

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x4f);break;

default: break ;

}

}

//Timer1中断处理程序,产生报警的声音

void timer1() interrupt 3

{

TH1=0xff;

TL1=0x00;

SPK=~SPK;

}

//外部中断INT1中断处理程序,停止报警声音

void int1() interrupt 2

{

if(TR1)

TR1=0;

}

实验说明:

按K1按键进入设定状态

按K2,依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,直到退出设置状态

按K3,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字

LCD第二排中间显示小喇叭,表示启用闹钟功能,无则禁止闹钟功能(可在调整状态进行设置)

正常状态,LCD上排最前面显示自定义字符,LCD下排最前面闪动"RICHMCU"

设置状态,LCD上排最前面显示"P",下排最前面在设置闹钟时间时显示"alarm:",其它状态显示"time"

年代变化2000--2099,星期自动转换

望采纳,谢谢~~

        读者们,大家好!

        接着上一章多功能时钟(绪论)的内容,在这一章中,我将介绍多功能时钟的时钟显示部分。话不多说,我们正式开始吧~

        多功能时钟,时钟显示功能是必不可少的。所以,我们利用stm32的定时器来计时。本来打算采用stm32的RTC实时时钟,但后来想,刚开始弄得时候,尽量简单一些,别一开始就给自己出难题,毕竟RTC实时时钟要配置的东西还挺多的。如果此次做得不错的话,后面可以再加RTC实时时钟。

        stm32不同于51,共有11个定时器,其中2个高级控制定时器(TIM1和TIM8),4个普通定时器(TIM2~TIM5)和2个基本定时器(TIM6和TIM7),以及2个看门狗定时器和1个系统滴答定时器。这里,我们采用普通定时器TIM2,并且开启定时器的中断,中断时间为1s,并且在中断函数里,模拟时钟的计时功能。

(1)配置嵌套中断控制器NVIC

void tim2_nvic_config(void)

{

    NVIC_InitTypeDef NVIC_InitStruct;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitStructNVIC_IRQChannel = TIM2_IRQn;

    NVIC_InitStructNVIC_IRQChannelPreemptionPriority = 2;//抢占优先级为2

    NVIC_InitStructNVIC_IRQChannelSubPriority = 0;//子优先级为0

    NVIC_InitStructNVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStruct);

}

        这里,我们只需对NVIC_InitStruct结构体的每个元素赋值,其中TIM2_IRQn为定时器TIM2中断线,设置优先级组为2,即抢占优先级组为4组,这里抢占优先级为2,子优先级为0,然后使能NVIC(优先级不能理解上网查询)。

(2)定时器初始化配置

void tim2_config(void)

{

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

    tim2_nvic_config();                                //配置NVIC

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟

    TIM_DeInit(TIM2);                                      //定时器2复位

    TIM_TimeBaseInitStructTIM_Period = 2000-1;                  //自动重装载寄存器值

    TIM_TimeBaseInitStructTIM_Prescaler = 36000-1;              //时钟预分频数

    TIM_TimeBaseInitStructTIM_ClockDivision = TIM_CKD_DIV1;    //采样分频

    TIM_TimeBaseInitStructTIM_CounterMode = TIM_CounterMode_Up; //计数模式

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);            //初始化TIM2

    TIM_ClearFlag(TIM2, TIM_FLAG_Update);                        //清除溢出中断标志

    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

    TIM_Cmd(TIM2, ENABLE);                                      //使能时钟

}

        TIM2初始化,首先配置NVIC,打开TIM2时钟,复位TIM2。然后对TIM_TimeBaseInitStruct结构体的每个元素赋值。这里,主要阐述如何计算定时中断时间。定时器的溢出中断时间由TIM_Period和TIM_Prescaler来决定的。这里,我直接给出公式:发生中断时间=(TIM_Period+1)(TIM_Prescaler+1)/FCLK,而FCLK为72M,所以定时1s,可以这样:TIM_Period=2000-1,TIM_Prescaler=36000-1;最后清除溢出中断标志,使能时钟即可计时。

(3)编写中断计时函数

void TIM2_IRQHandler(void)

{

    if(TIM_GetITStatus(TIM2 ,TIM_IT_Update)!=RESET)

    {

        sec++;

        if(sec>=60)

        {

            sec = 0;

            min++;

            if(min>=60)

            {

                min = 0;

                hour++;

                if(hour>=24)

                {

                    hour = 0;

                }

            }

        }

    }

    TIM_ClearITPendingBit(TIM2 ,TIM_FLAG_Update);

}

这里,先定义时、分、秒三个变量,然后在中断函数里,对时间变量的关系进行换算即可。

(4)编写时钟显示函数

        这里,我们采用LCD12864实时显示。LCD12864的相关内容,我后面在LCD库函数章节中,会专门介绍的。这里,只将时间显示即可。

    lcd_display_num_m(2, 16, hour/10);

    lcd_display_num_m(2, 24, hour%10);

    lcd_display_string(2,32,"时");

    lcd_display_num_m(2, 48, min/10);

    lcd_display_num_m(2, 56, min%10);

    lcd_display_string(2,64,"分");

    lcd_display_num_m(2, 80, sec/10);

    lcd_display_num_m(2, 88, sec%10);

    lcd_display_string(2,96,"秒");

        LCD12864的驱动函数,我跟着黄老师的视频后面写的,在老师的基础上,增加了汉字字符串显示函数。这里,看成库函数即可,只需简单的调用,显示时间就行。

(5)按键调整时间

        成功显示时间后,我们需要按键来调整时间。 我们需要设置时钟启/停键(K1),时间位选择键(K2),数值增加键(K3),数值减小键(K4)。

1我们先对按键的GPIO进行配置,开启相应的时钟,选择相关引脚,设置浮空输入模式等。

void key_gpio_init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    /使能GPIO的RCC时钟/

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    /配置PB11~PB14引脚/

    GPIO_InitStructureGPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;

    GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructureGPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOB,&GPIO_InitStructure);

}

2配置好按键的GPIO口后,编写按键扫描函数,从而达到调整时间的功能。

u8 flag,mark;//flag为定时器启停标志位,mark为位选择标志位

//mark为0表示未选中,mark为1表示选择时位,mark为2表示选择分位,mark为3表示选择秒位

void keyscan(void)

{

    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==RESET)

    {

        delay_ms(10);

        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==RESET)

        {

            flag = ~flag;

            if(!flag)

            {

                TIM_Cmd(TIM2, ENABLE);

            }

            else

            {

                TIM_Cmd(TIM2, DISABLE);

                mark = 0;

            }

        }while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==RESET);

    }

    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET)

    {

        delay_ms(10);

        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET)

        {

            mark = mark>=30:mark+1;

        }while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==RESET);

    }

    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET)

    {

        delay_ms(10);

        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET)

        {

            if(flag)

            {

                switch(mark)

                {

                    case 1:hour = hour<23hour+1:0;break;

                    case 2:min = min<59min+1:0;break;

                    case 3:sec = sec<59sec+1:0;break;

                    default:break;

                }

            }

        }while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET);

    }

    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==RESET)

    {

        delay_ms(10);

        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==RESET)

        {

            if(flag)

            {

                switch(mark)

                {

                    case 1:hour = hour>0hour-1:23;break;

                    case 2:min = min>0min-1:59;break;

                    case 3:sec = sec>0sec-1:59;break;

                    default:break;

                }

            }

        }while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==RESET);

    }

}

        至此,我们完成了时钟显示的功能,当然,后期如果可以的话,我们可以使用stm32的RTC实时时钟资源,还可以设置闹钟、整点报时的功能。

         本章,我主要介绍了如何利用stm32的TIM定时器和GPIO资源,实现时钟显示和按键调整的功能。下一章中,我将介绍如何利用DHT11模块来测量温度和湿度,从而实现系统对环境参量的获取。

以电脑为例,设置桌面时钟的步骤是:

1、在电脑桌面右击,选择小工具。

2、在d出的对话框里选择时钟即可。

电脑(computer,又称计算机)是一种用于高速计算的电子计算机器,被称为“20世纪最先进的科学技术发明之一”。电脑由硬件系统和软件系统所组成,具有进行数值计算、逻辑计算和存储记忆等多项功能。它的应用领域从最初的军事科研应用扩展到社会的各个领域,带动了全球范围的技术进步。

电脑的软件系统包括: *** 作系统、应用软件等。应用软件中电脑行业的管理软件,IT电脑行业的发展必备利器,电脑行业的erp软件。硬件系统包括:机箱(电源、硬盘、磁盘、内存、主板、CPU-中央处理器、CPU风扇、光驱、声卡、网卡、显卡)、显示器、UPS(不间断电源供应系统)、键盘、鼠标等等(另可配有耳机、麦克风、音箱、打印机、摄像头等)。家用电脑一般主板都有板载声卡、网卡。部分主板装有集成显卡。

2ms周期方波,1:2占空比的话得不到精确值。

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#02H

MOV TH0,#246

MOV TL0,#246

SETB TR0

SETB ET0

SETB EA

SETB P10

CLR A

SJMP $

T0ISR:

INC A

CJNE A,#67,T01

T01:

JC T02

CLR P10

CJNE A,#200,T03

T03:

JC T0E

CLR A

T0E:

RETI

T02:

SETB P10

RETI

END

时钟的英文clock。

读音:英[klɒk];美[klɒk]

词典释义:时钟;计时器;vt记录;记时;vi打卡;记录时间;n (Clock)人名;(英)克洛克

短语搭配:Clock Tower钟楼惊魂;钟楼;尖沙咀前九广铁路钟楼;钟塔

Alarm Clock[仪]闹钟;闹表;复位时钟;机闹表

Corpus Clock圣体钟

双语例句

The clock said four minutes past eleven when we set off

我们出发时,时钟显示11点4分。

The clock is simply for ornament; it doesn't work any more

这架时钟纯属摆设,它再也不走了。

Clocks never told the right time

时钟从来都不报正确的时间。

时钟的英文clock。

读音:英[klɒk];美[klɒk]

词典释义:时钟;计时器;vt记录;记时;vi打卡;记录时间;n (Clock)人名;(英)克洛克

短语搭配:Clock Tower钟楼惊魂;钟楼;尖沙咀前九广铁路钟楼;钟塔

Alarm Clock[仪]闹钟;闹表;复位时钟;机闹表

Corpus Clock圣体钟

双语例句

The clock said four minutes past eleven when we set off

我们出发时,时钟显示11点4分。

The clock is simply for ornament; it doesn't work any more

这架时钟纯属摆设,它再也不走了。

Clocks never told the right time

时钟从来都不报正确的时间。

以上就是关于急求一个用51单片机编的可按键调时的数字时钟程序,数码管显示,C语言编写,谢谢。全部的内容,包括:急求一个用51单片机编的可按键调时的数字时钟程序,数码管显示,C语言编写,谢谢。、基于stm32的多功能时钟1——时钟显示、桌面时钟怎么设置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/8846625.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-22
下一篇 2023-04-22

发表评论

登录后才能评论

评论列表(0条)

保存