闹钟+定时器主程序代码(STM8 单片机)

合集下载

STM8教程-第八章 STM8S207时钟编程及其实例

STM8教程-第八章 STM8S207时钟编程及其实例

第八章STM8S207时钟编程及其实例本章介绍STM8S207 的时钟编程。

STM8S207 时钟控制器功能强大而灵活易用,允许程序运行中将主时钟从一个时钟源切换到另一个时钟源,而且同一个时钟源可以任意更改分频系数。

8.1 STM8 时钟控制简介时钟控制器功能强大而且灵活易用。

其目的在于使用户在获得最好性能的同时,亦能保证消耗的功率最低。

用户可独立地管理各个时钟源,并将它们分配到CPU 或各个外设。

主时钟和CPU 时钟均带有预分频器。

具有安全可靠的无故障时钟切换机制,可在程序运行中将主时钟从一个时钟源切换到另一个时钟源。

抗电磁干扰时钟配置寄存器为了避免由电磁干扰造成的对应用程序误写操作或系统挂起,大多数关键的时钟配置寄存器都有一个互补寄存器与之相对应。

系统将会自动检测这些关键寄存器与其互补寄存器之间是否匹配。

如果不匹配,则产生一个EMS 复位,从而使应用程序恢复到正常操作。

详情请参见时钟寄存器描述。

1、主时钟源介绍下面4种时钟源可用做主时钟1、1-24MHz 高速外部晶振(HSE)2、最大24MHz 高速外部时钟信号3、16MHz 高速内部RC 振荡器(HSI)4、128KHz 低速内部RC(LSI)所以总的来说可以分为三种时钟源,HSE、HSI、LSI2、时钟树,如下图所示由上图可以发现,作为f_cpu 的时钟源可以来源于f_hse、f_hsi 经过HSIDIV分频后的时钟、f_lsi 这三个时钟源。

而选择开关在CKM[7:0]中。

由此事实上可以作为f_master 的时钟源频率有:外部HSE 24MHz内部高速HSI 16MHz、2 分频的8MHz、4 分频的4MHz、8 分频的2MHz(复位默认时钟源)内部低速LSI 128KHz上面得到的频率是f_master 的频率,然后f_master 还可以通过CPUDIV 来分频后提供f_cpu 的时钟,CPUDIV 可以为1、2、4、8、16、32、64、128 分频,最终得到是CPU 的时钟频率f_cpu。

单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。

其中正常时间显示和闹钟时间显示可用一个开关来调整。

芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。

我的电子钟c程序完整代码

我的电子钟c程序完整代码

我的电子钟c程序完整代码真的很感谢问问的朋友帮我解决了定时器的问题。

今天是拿到单片机的第五天了,经过五天的挑灯学习,单片机的基础也算了解的三三两两了。

解决了定时器问题,早上逃课,趁热打铁,把电子钟的程序写完。

有一年没有写复杂的程序了,今天的过程也是磕磕碰碰,问题颇多。

废话不说了,想玩wow 了。

有图有真相。

#include#define unchar unsigned char//sbit beep=P1 ;unchar temp=0;unsigned char code shuzi[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};unsigned char count[]={0,0,10,5,5,10,3,2};void delay(void){int i=100;while(--i);}unchar time(unchar j){if (temp==20){ temp=0 ;++count[0];if (count[0]==10){ count[0]=0;++count[1];}if(count[1]==6){count[1]=0;++count[3];} if (count[3]==10){count[3]=0;++count[4];}if (count[4]==6){count[4]=0;++count[6];}if (count[6]==10){count[6]=0;++count[7];}if (count[7]==3)count[7]=0;if (count[7]==2&&count[6]==4)count[7]=count[6]=0;}return count[j];}void main(){uncharnum,i,j;EA=1;ET0=1;TMOD=0x01;TL0=15535%256;TH0=15535/256;TR0=1;while (1){P2=0xff;i=1;for (j=0;jtips:感谢大家的阅读,本文由我司收集整编。

STM8教程实验8-定时器TIM1

STM8教程实验8-定时器TIM1

STM8教程实验8-定时器TIM1例程⼋ TIM1这⼀节,我们将向⼤家介绍如何使⽤STM8的定时器中的基本定时功能,STM8的定时器功能⼗分强⼤,有TIM1⾼级定时器,也有TIM2、TIM3等通⽤定时器,还有TIM4基本定时器。

在STM8S参考⼿册⾥⾯,定时器的介绍占了1/3的篇幅,⾜见其重要性。

这⼀节,我们分别介绍TIM1的基本定时功能16位⾼级控制定时器(TIM1)简介:TIM1由⼀个16位的⾃动装载计数器组成,它由⼀个可编程的预分频器驱动。

TIM1有4个通道,分别是1到4。

分别对应于四个不同的捕获/⽐较通道。

⾼级控制定时器适⽤于许多不同的⽤途:基本的定时测量输⼊信号的脉冲宽度(输⼊捕获)产⽣输出波形(输出⽐较,PWM和单脉冲模式)对应与不同事件(捕获,⽐较,溢出,刹车,触发)的中断与TIM5/TIM6或者外部信号(外部时钟,复位信号,触发和使能信号)同步⾼级控制定时器⼴泛的适⽤于各种控制应⽤中,包括那些需要中间对齐模式PWM的应⽤,该模式⽀持互补输出和死区时间控制。

⾼级控制定时器的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进⾏选择。

TIM1的时基单元包括,如下图所⽰:● 16位向上/向下计数器● 16位⾃动重载寄存器●重复计数器●预分频器16位计数器,预分频器,⾃动重载寄存器和重复计数器寄存器都可以通过软件进⾏读写操作。

⾃动重载寄存器由预装载寄存器和影⼦寄存器组成。

可在在两种模式下写⾃动重载寄存器:●⾃动预装载已使能(TIM1_CR1寄存器的ARPE位置位)。

在此模式下,写⼊⾃动重载寄存器的数据将被保存在预装载寄存器中,并在下⼀个更新事件(UEV)时传送到影⼦寄存器。

●⾃动预装载已禁⽌(TIM1_CR1寄存器的ARPE位清除)。

在此模式下,写⼊⾃动重载寄存器的数据将⽴即写⼊影⼦寄存器。

更新事件的产⽣条件:●计数器向上或向下溢出。

●软件置位了TIM1_EGR寄存器的UG位。

单片机闹钟程序设计

单片机闹钟程序设计

单片机闹钟程序设计这个是在之前的电子时钟上功能的扩展,主要加入闹钟模块。

即到达预定时间响铃一分钟,一分钟后自动停止,也可以按下已设定的键实现手动停止。

数码管方面的学习就到此为此吧,下一步是对液晶显示的学习。

单片机闹钟程序设计如下:#i nclude;#define uchar unsigned charunsigned char codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管数字编码uchari,j,k,second,tcount,minute,hour,tminute,thour,rin g;sbit beep=P2^6;sbitS2=P3^4;//---------------------------------------------------延时子程序,大约延时 n MSdelay(uchar n){for(j=n;j>;0;j--)for(k=125;k>;0;k--);}//---------------------------------------------------中断子程序void timer0() interrupt 1 using 0{TH0=(65536-50000)/256;//中断设置初始化TL0=(65536-50000)%256;tcount++;if(tcount==20)//满1秒{tcount=0;second++;beep=0;//秒数加1 if(second==60)//满1分{second=0;minute++;//分数加1,秒数归零if(minute==60)//满1小时{minute=0;hour++;//小时数加1,分数归零if(hour==24){hour=0;}}} }}void timer1() interrupt 3 using 1{TH1=0x3c; //中断设置初始化TL1=0xb0;if(minute==tminute & hour==thour & ring==1) {beep=0;}//到预设时间自动响铃,持续一分钟后自己关闭if(S2==0){ring=0;//铃声中断}}//---------------------------------------------------void main(){tminute=1;thour=0;//预置响铃时间second=55;minute=0;hour=0;//给电子时钟赋初值,即启动时显示的时间ring=1; //启动响铃功能TH0=(65536-50000)/256;//中断设置初始化TL0=(65536-50000)%256;EA=1;ET0=1;TMOD=0x21;TR0=1;//开中断总开关,计数器0允许中断,设置中断模式,启动计数器0ET1=1;TR1=1;while(1)//死循环,进入显示,主要是动态显示原理{ P0=table[(second%10)]; P2=0xdf; delay(5);P0=table[(second/10)]; P2=0xef; delay(5);P0=table[(minute%10)]; P2=0xf7; delay(5);P0=table[(minute/10)]; P2=0xfb; delay(5);P0=table[(hour%10)]; P2=0xfd; delay(5);P0=table[(hour/10)]; P2=0xfe; delay(5); }}。

STM8的C语言编程(5)--8位定时器应用之一

STM8的C语言编程(5)--8位定时器应用之一

STM8的C语言编程(5)--8位定时器应用之一在STM8单片机中,有多种定时器资源,既有8位的定时器,也有普通的16位定时器,还有高级的定时器。

今天的实验是用最简单的8位定时器TIM4来进行延时,然后驱动LED闪烁。

为了简单起见,这里是通过程序查询定时器是否产生更新事件,来判断定时器的延时是否结束。

同样还是利用ST的开发工具,生成一个C程序的框架,然后修改其中的main. c,修改后的代码如下。

编译通过后,下载到开发板,运行程序,可以看到LED在闪烁,或者用示波器可以在LED引脚上看到方波。

在这里要特别提醒的是,从ST给的手册上看,这个定时器中的计数器是一个加1计数器,但本人在实验过程中感觉不太对,经过反复的实验,我认为应该是一个减1计数器(也许是我拿的手册不对,或许是理解上有误)。

例如,当给定时器中的自动装载寄存器装入255时,产生的方波频率最小,就象下面代码中计算的那样,产生的方波频率为30HZ左右。

若初始化时给自动装载寄存器装入1,则产生的方波频率最大,大约为3.9K左右。

也就是说实际的分频数为ARR寄存器的值+1。

// 程序描述:通过初始化定时器4,进行延时,驱动LED闪烁// LED接在MCU的GPIO的PD3上#include "STM8S207C_S.h"main(){// 首先初始化GPIOPD_DDR = 0x08;PD_CR1 = 0x08; // 将PD3设置成推挽输出PD_CR2 = 0x00;// 然后初始化定时器4TIM4_IER = 0x00; // 禁止中断TIM4_EGR = 0x01; // 允许产生更新事件TIM4_PSCR = 0x07; // 计数器时钟=主时钟/128=2MHZ/128// 相当于计数器周期为64uSTIM4_ARR = 255; // 设定重装载时的寄存器值,255是最大值TIM4_CNTR = 255; // 设定计数器的初值// 定时周期=(ARR+1)*64=16320uSTIM4_CR1 = 0x01; // b0 = 1,允许计数器工作// b1 = 0,允许更新// 设置控制器,启动定时器while(1) // 进入无限循环{while((TIM4_SR1 & 0x81) == 0x00); // 等待更新标志TIM4_SR1 = 0x00; // 清除更新标志PD_ODR = PD_ODR ^ 0x08; // LED驱动信号取反// LED闪烁频率=2MHZ/128/255/2=30.63 }}。

一个闹钟的单片机程序隔时闹铃

一个闹钟的单片机程序隔时闹铃

一个闹钟的单片机程序/***一个闹钟的单片机程序。

其中蜂鸣器接P3.4,数码管是四位共阳数码管,段接P0、位接P2,K1接P24,K2接P25,K3接P26,K4接P27。

晶振采用11.0592MHz。

(建议用12M,初始值修改为[65536-5000]) ***/#include <reg51.h>#define u8 unsigned char#define u16 unsigned intsbit wei1=P2^0;sbit wei2=P2^1;sbit wei3=P2^2;sbit wei4=P2^3;sbit k1=P2^4; //加sbit k2=P2^5; //减sbit k3=P2^6; //设置位选择sbit k4=P2^7; //开停闹铃sbit bee=P3^4; //蜂鸣器sbit led0=P1^3; //秒显示sbit led1=P1^5; //秒显示sbit led2=P1^7; //闹铃指示灯,亮开启闹铃,灭关闭闹铃bit isClock =0;//是否开启闹钟bit isClick = 0;u8 bianji =0x00;//是否处于时间编辑状态u16 hour,minute,second,laoHour,laoMinute;u8 timercount;const u8 ledCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};void timer0() interrupt 1{TH0=(19448)/256;TL0=(19448)%256;//19450timercount++;if(timercount==20){timercount=0;second++;led0=!led0;led1=!led1;if(second==60){minute++;second=0;}if(minute==60){hour++;minute=0;}if(hour==24){hour=0;}}}//延迟void Delay(u16 time){u8 a,b;for(a=0;a<time;a++)for(b=0;b<120;b++);}//用于显示时间void ShowTime(void){u16 a,b, tempH,tempM;u8 showChar;if(bianji==0x00 || bianji ==0x01 || bianji ==0x02) {tempH=hour;tempM=minute;}else{tempH=laoHour;tempM=laoMinute;}if(bianji==0x00 || bianji ==0x01 || bianji ==0x03){//显示第4个数码管P0=0xFF;P2=0xFF;a=tempH/10;showChar=ledCode[a];P0=showChar;wei1=0x00;Delay(1);//延迟很短//显示第3个数码管P0=0xFF;P2=0xFF;b=tempH%10;showChar=ledCode[b];wei2=0x00;P0=showChar;Delay(1);//延迟很短}if(bianji==0x00 || bianji ==0x02 || bianji ==0x04) {//显示第2个数码管P0=0xFF;P2=0xFF;a=tempM/10;showChar=ledCode[a];P0=showChar;wei3=0x00;Delay(1);//延迟很短//显示第1个数码管P0=0xFF;P2=0xFF;b=tempM%10;showChar=ledCode[b]; wei4=0x00;P0=showChar;Delay(1);//延迟很短 }}void Beep(u8 t) //蜂鸣器响{u16 n,c;for(c=0;c<t;c++){for(n=0;n<80;n++);bee=!bee;}}void main(void){hour=8;minute=30;second=0;laoHour=8;laoMinute=31;TMOD=0x01;ET0=0x01;//定时器T0可以中断EA=0x01;//表示允许所有的中断TR0=0x01;//开始T0计时while(1){if(k1==0x00)//按下了K1键,增加小时或分钟 {if(!isClick){switch(bianji){case 0x01://调整小时hour++;if(hour==24)hour=0;break;case 0x02://调整分钟minute++;if(minute==60)minute=0;break;case 0x03://调整闹钟的小时laoHour++;if(laoHour==24)laoHour=0;break;case 0x04://调整闹钟的分钟laoMinute++;if(laoMinute==60)laoMinute=0;break;default:break;}isClick=1;}}else if(k2==0x00)//按下了K2键,减少小时或分钟 {if(!isClick){switch(bianji){case 0x01://调整时间的小时if(hour==0)hour=23;elsehour--;break;case 0x02://调整时间的分钟if(minute==0)minute=59;elseminute--;break;case 0x03://调整闹钟的小时if(laoHour==0)laoHour=23;elselaoHour--;break;case 0x04://调整闹钟的分钟if(laoMinute==0)laoMinute=59;elselaoMinute--;break;default:break;}isClick=1;}}else if(k3==0x00)//按下了K3键,更改模式,第一次修改小时,//第二次修改分钟,第三次恢复{if(!isClick){switch(bianji){case 0x00://不是修改状态,调整小时bianji=0x01;break;case 0x01://调整分钟bianji=0x02;break;case 0x02://调整闹钟的小时bianji=0x03;break;case 0x03://调整闹钟的分钟bianji=0x04;break;case 0x04://不修改bianji=0x00;break;default:break;}isClick=1;}}else if(k4==0x00)//按下了K4键,开启或关闭闹钟{if(!isClick){isClock=~isClock;isClick=1;if (isClock==0) led2=1; else led2=0; //闹铃指示灯 }}elseisClick=0; //闹钟是否响了if(isClock){u8 zxMinute=laoMinute+5;//设置隔5分钟再响一次变量 if(hour==laoHour && minute == laoMinute){Beep(2000);//响}/***再响一分钟****/if(hour==laoHour && minute == zxMinute){Beep(2000);//响}}ShowTime();}}页脚。

STM8数码管计时程序

STM8数码管计时程序

STM8数码管计时程序我们设计的单片机电子钟/计时器学习板,它采用6位LED数码管显示时、分、秒,以24小时计时方式。

可以通过按键实现时分调整、秒表/时钟功能转换、省电(关闭显示)等功能。

我们能提供的完整的汇编语言源程序清单及电路原理设计图有助于学习者进行分析和进行实验验证。

硬件参数板上资源:MCU STC89C52、6位Led显示、3位按键。

电源部分为5V直流电压,需要稳压、滤波电路,不能接反!51单片机做的电子钟在很多地方都有介绍,对于单片机学习者来说这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。

常见的电子钟程序由显示部分、计算部分、时钟调整部分构成,本产品硬件上完全支持倒计时器,客户只要自己修改程序就能实现倒计时功能。

为了实现LED显示器的数字显示,可以采用静态显示法和动态显示法。

由于静态显示法需要数据锁存器等硬件,接口复杂一些。

考虑时钟显示只有六位,且系统没有其它复杂的处理任务,所以决定采用动态扫描法实现LED的显示。

单片机采用易购的AT89S51系列,这样单片机可具有足够的空余硬件资源实现其它的扩充功能。

该板采用AT89S51单片机,最小化应用设计,采用共阳七段LED显示器,P0口输出段码数据,P2.0~P2.5做列扫描输出,P1.0,P1.2,P1.3,接三个按键开关,用以调时及功能设置。

为了提高共阳数码管的驱动电压,用9012做电源驱动输出。

采用12M晶振,有利于提高秒计时的精度。

本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。

数码管显示的数据存放在内存单元70H~75H中。

其中70H~71H存放秒数据,72H~73H存放分数据,74H~75H存放时数据,每一地址单元内均为十进制BCD码。

由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。

显示时,先取出70H~~75H某一地址中的数据,然后查得对应的显示用段码,并从P0口输出,P2口将对应的数码管选中供电,就能显示该地址单元的数据值。

IAR for stm8平台 系统时钟设置实验程序

IAR for stm8平台 系统时钟设置实验程序

GPIOF
68 #defineຫໍສະໝຸດ LED2_PORTGPIOF
69 #define LED3_PORT
GPIOF
70
71 void LED_Init(void);
72 void LED1_Open(void);
73 void LED1_Close(void);
74 void LED1_Toggle(void);
102 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
103 *
104 * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
main.c * - Printed on 2020/11/13 12:42:41
1 //"sysclock.h" 头文件
2
3 #ifndef __SYSCLOCK_H
4 #define __SYSCLOCK_H
5
6 /* 包含系统头文件 */
7
8 /* 包含自定义头文件 */
9 #include "stm8.h"
35 #define FlagStatus bool
36 #define u8 uint8_t
37 #define u16 uint16_t
38 #define u32 uint32_t
39 #define EnableInterrupt __enable_interrupt()
40 #endif
41

单片机课设定时闹钟代码及注解

单片机课设定时闹钟代码及注解

#include<reg52.h>#define uint unsigned int#define uchar unsigned charuintmiao,fen,fen1,shi,shi1,flag1,flag2,flag3,aa,K1num,K2num,K3num,K4num,N;//K1num-K1按键被按下的标记变量,K2num-K2按键被按下的标记变量,K3num=0-K3按键被按下的标记变量uchar code table[]=" TIMING CLOCK"; //定义初始上电时液晶默认显示状态sbit K1=P1^0; //四个按键sbit K2=P1^1;sbit K3=P1^2;sbit K4=P1^3;sbit rs=P2^6;sbit lcden=P2^7;sbit led=P2^3; //发光二极管控制端sbit beep=P1^5; //蜂鸣器控制端sbit relay=P2^5; //继电器控制端void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //液晶写命令函数{rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date) //液晶写数据函数{rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void write_sfm(uchar add,uchar date) //液晶写时分秒函数{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void init() //初始化函数{uint num; //写液晶的循环控制变量aa=0; //中断次数标志K1num=0; //K1按键被按下的标记变量K2num=0; //K2按键被按下的标记变量K3num=0; //K3按键被按下的标记变量K4num=0;flag1=1; //控制lcd屏刷新的变量flag2=1; //控制闹钟响闹和继电器开启关闭的标记flag3=1; //控制闹钟响起时,按下K4停止闹钟响闹的标记led=1; //发光二极管初始化relay=0; //继电器初始化N=100; //系统启动时,闹钟时间到发出的声音为连续三次发出“哗”的一声miao=0; //系统初始化时间fen=0;shi=0;fen1=1; //初始化闹钟的时间shi1=0;beep=0; //蜂鸣器初始化lcden=0; //液晶使能端初始化//1602液晶初始化,设置16*2显示。

STM8单片机课程设计报告(闹钟+定时器)

STM8单片机课程设计报告(闹钟+定时器)

课程设计内容与要求课程设计目的:1、巩固和加深对单片机原理知识的理解和运用。

2、进一步提高学生综合运用所学知识的能力。

3、培养学生综合分析问题、发现问题和解决问题的能力基本要求:1)显示时间和日期2)可设置多个闹钟3)可以调整时间扩展功能:1)按键复用共有六个按键,每个按键在不同模式下有不同的功能。

2)秒表功能进入秒表界面后,再按一下就秒表开始计时,再按一下秒表停止。

3)省电模式在每天00:00会自动进入省电模式,8个数码管会自动关闭,到5:00时会自动退出省电模式;也可以手动进入和退出省电模式。

4)查看/删除闹钟查看闹钟时间为五秒,五秒内按键无动作则自动退出。

器件介绍本次设计主要用到的硬件有:1、51实验板1块2、stm8s105c6开发板1快51实验板:主要用到实验板上的硬件有:1)两个四位一体的共阴LED数码管,电路图如下:2)两个74HC573的锁存芯片:3)8个独立按键,用了其中6个5)一个蜂鸣器:Stm8s105c6开发板:总共有48个引脚,本设计共用引脚20个引脚。

PB0~PB7和PE6~PE7用于数码管显示控制,PD0~PD5用于键盘输入,PD6、PE0、PE3用于LED指示灯控制。

PD7用于蜂鸣器控制。

设计方案本次设计采用51实验板和stm8s105c6开发板来完成,没有做实物。

显示电路采用8个共阳数码管显示;控制按键采用六个独立按键,每一个按键都有复用功能;闹钟提醒采用蜂鸣器;外加四个不同颜色的LED发光二极管,当进入相应功能模式时对应的指示灯就会亮。

1、键盘设计:在键盘电路中,使用的是6个独立键盘。

键盘在源程序中的功能安排如下:1)当扫描到有键盘按下时,设置相应标志位,然后延时一定时间消抖。

2)键盘的设置键盘表面如图:其中各键设置为:待机状态下是“设置闹钟”,在其他模式下是“递增功能”待机状态下是“调整时间”,在其他模式下是“递减功能”。

待机状态下是“秒表功能”,在其他模式下是“左移功能”。

单片机课程设计---数字定时闹钟汇编程序

单片机课程设计---数字定时闹钟汇编程序

ORG 0000HLJMP MAINORG 000BHLJMP TIME;×××××主程序部分:×××××ORG 0100HMAIN:MOV SP,#50HMOV 20H,#00H ;秒钟BINMOV 21H,#00H ;分钟BINMOV 22H,#00H ;小时BINMOV 23H,#01HMOV 24H,#01HMOV 25H,#00HMOV 30H,#00HMOV 31H,#00HMOV 32H,#00HMOV 33H,#00HMOV 34H,#00HMOV 35H,#00HMOV 36H,#01HMOV 37H,#00HMOV 38H,#01HMOV 39H,#00HMOV TMOD,#01H ;16位计数器MOV TH0,#03CH ;赋计数初值MOV TL0,#0B0HMOV IE,#10000111BSETB TR0 ;T0启动计数MOV R2,#14HMOV P2,#0FFHLOOP: LCALL TIMEPROLCALL DISPLAY1JB P1.1,M1LCALL SETTIME ;调用设定时间程序LJMP LOOPM1:JB P1.2,M2LCALL SETA TIME ;调用设定时间程序LJMP LOOPM2:JB P1.4,M4LCALL LOOKATIME ;调用设定闹钟时间程序M4:LJMP LOOPDELAY:MOV R4,#030H ;延时时间DL00:MOV R5,#0FFHDL11:MOV R6,#9HDL12:DJNZ R6,DL12DJNZ R5,DL11DJNZ R4,DL00RET;×××××设定时间程序:×××××SETTIME:L0:LCALL DISPLAY1 ;调用时间允许程序MM1: JB P1.2,L1MOV C,P1.2JC MM1LCALL DELAY1 ;调用延时JC MM1MSTOP1: MOV C,P1.2JNC MSTOP1 ;判断P1.2是否释放?释放则继续LCALL DELAY1 ;调用延时MOV C,P1.2JNC MSTOP1INC 22H ;小时增加1MOV A,22HCJNE A,#18H,GO12 ;判断小时是否到24时?未到继续循环MOV 22H,#00H ;小时复位MOV 34H,#00HMOV 35H,#00HLJMP L0L1:JB P1.3,L2MOV C,P1.3JC L1LCALL DELAY1 ;延时JC L1MSTOP2: MOV C,P1.3JNC MSTOP2 ;判断P1.3是否释放?释放则继续LCALL DELAY1 ;调用延时MOV C,P1.3JNC MSTOP2INC 21H ;分钟增加一MOV A,21HCJNE A,#3CH,GO11MOV 21H,#00H ;分钟复位MOV 32H,#00HMOV 33H,#00HLJMP L0GO11:MOV B,#0AH ;将A中的内容分成高低两部分DIV ABMOV 32H,BMOV 33H,ALJMP L0GO12: MOV B,#0AHDIV ABMOV 34H,BMOV 35H,ALJMP L0L2:JB P1.4,L0MOV C,P1.4JC L2LCALL DELAY1 ;调用延时MOV C,P1.4JC L2STOP1: MOV C,P1.4 ;判断按键P1.4是否释放?JNC STOP1LCALL DELAY1 ;调用延时MOV C,P1.4JNC STOP1LJMP LOOP;×××××设置闹钟时间×××××SETATIME:LCALL DISPLAY2 ;调用时间运行N0:LCALL DISPLAY2MM2: JB P1.3,N1 ;判断P1.3是否按下?MOV C,P1.3JC MM2LCALL DELAY1JC MM2MSTOP3: MOV C,P1.3 ;判断P1.3是否释放?JNC MSTOP3LCALL DELAY1MOV C,P1.3JNC MSTOP3INC 24H ;设定小时增加1MOV A,24HCJNE A,#24,GO22MOV 24H,#00H ;时钟复位MOV 38H,#00HMOV 39H,#00HLJMP N0N1:JB P1.1,N2 ;判断P1.1是否按下?MOV C,P1.1JC N1LCALL DELAY1JC N1MSTOP4: MOV C,P1.1 ;判断P1.1是否释放?JNC MSTOP4LCALL DELAY1MOV C,P1.1JNC MSTOP4INC 23H ;设定闹钟分钟增加1MOV A,23HCJNE A,#60,GO21 ;判断A是否到60分?MOV 23H,#00H ;分钟复位MOV 36H,#00HMOV 37H,#00HLJMP N0GO21:MOV B,#0AH ;将A中的内容分成高低两部分DIV ABMOV 36H,BMOV 37H,ALJMP N0GO22: MOV B,#0AHDIV ABMOV 38H,BMOV 39H,ALJMP N0N2:JB P1.4 ,N0 ;判断P1.4是否按下?MOV C,P1.4JC N2LCALL DELAY1MOV C,P1.4JC N2STOP2: MOV C,P1.4 ;判断P1.4是否释放?JNC STOP2LCALL DELAY1MOV C,P1.4JNC STOP2LJMP LOOPTIMEPRO:MOV A,21HMOV B,23HCJNE A,B,BK ;判断分钟是否运行到设定的闹钟的分钟?MOV A,22HMOV B,24HCJNE A,B,BK ;判断时钟是否运行到设定的闹钟的时钟?SETB 25H.0MOV C,25H.0JC XXXX: LCALL TIMEOUT ;调用时间闹钟响应程序BK:RETTIMEOUT:X1:LCALL BZ ;调用喇叭响应程序LCALL DISPLAY2CLR 25H.0JB P1.4, X1 ;判断P1.4是否按下?LCALL DELAYCLR 25H.0LJMP DISPLAY1BZ: CLR P3.7 ;喇叭响应程序MOV R7,#250 ;响应延时时间T2: MOV R6,#124T3: DJNZ R6,T3DJNZ R7,T2SETB P3.7RETLOOKATIME:LCALL DISPLAY2 ;调用时间运行程序MM: JB P1.4,LOOKATIME ;判断按键P1.4是否按下MOV C,P1.4JC MMLCALL DELAY1MOV C,P1.4JC MMSTOP3: MOV C,P1.4JNC STOP3LCALL DELAY1MOV C,P1.4JNC STOP3LJMP LOOPDELAY1: MOV R4,#14H ;时间延时DL001: MOV R5,#0FFHDL111: DJNZ R5,DL111DJNZ R4,DL001RET;×××××时间运行程序×××××TIME: PUSH ACC ;现场保护PUSH PSWMOV TH0,#03CH ;赋初值MOV TL0,#0B0HDJNZ R2,RET0MOV R2,#14HMOV A,20HCLR CINC A ;秒钟自加1CJNE A,#3CH,GO1 ;判断秒钟是否到60秒?MOV 20H,#0 ;到60秒复位MOV 30H,#0MOV 31H,#0MOV A,21HINC A ;分钟自加1CJNE A,#3CH,GO2 ;判断分钟是否到60分?MOV 21H,#0H ;到60分复位MOV 32H,#0MOV 33H,#0MOV A,22HINC A ;时钟自加1CJNE A,#18H,GO3 ;判断时钟是否到24时?MOV 22H,#00H ;到24时复位MOV 34H,#0MOV 35H,#0AJMP RET0GO1: MOV 20H,AMOV B,#0AHDIV ABMOV 31H,AMOV 30H,BAJMP RET0GO2: MOV 21H,AMOV B,#0AHDIV ABMOV 33H,AMOV 32H,BAJMP RET0GO3: MOV 22H,AMOV B,#0AHDIV ABMOV 35H,AMOV 34H,BRET0: POP PSW ;恢复现场POP ACCRETI;×××××运行部分×××××DISPLAY1: MOV R0,#30HMOV R3,#0FEHMOV A,R3PLAY1: MOV P2,AMOV A,@R0MOV DPTR,#DSEG1 ;表首地址送DPTRMOVC A,@A+DPTRMOV P0,ALCALL DL1MOV P2,#0FFH ;送高电平到P2MOV A,R3RL A ;JNB ACC.6,LD1INC R0MOV R3,ALJMP PLAY1 ;调用查表程序LD1: RETDISPLAY2: PUSH ACC ;现场保护PUSH PSWMOV R0,#36HMOV R3,#0FBHMOV A,R3PLAY2: MOV P2,AMOV A,@R0MOV DPTR,#DSEG1 ;表首地址送DPTRMOVC A,@A+DPTR ;查ASCII特码MOV P0,A ;查表结果送ALCALL DL1MOV P2,#0FFH ;送高电平到P2MOV A,R3RL AJNB ACC.6,LD2INC R0LJMP PLAY2LD2: POP PSW ;恢复现场POP ACCRET;×××××延时时间×××××DL1: MOV R7,#02H ;延时时间DL: MOV R6,#0200HDL6: DJNZ R6,$DJNZ R7,DLRETDSEG1:DB 3FH,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FHEND。

stm8固件库(时钟部分)

stm8固件库(时钟部分)

一时钟管理1 恢复相关的时钟寄存器到默认值void CLK_DeInit()2 启用或关闭外部高速振荡器(HSE)void CLK_HSECmd(FunctionState NewState)启用CLK_HSECmd(ENABLE)关闭CLK_HSECmd(DISABLE)3启用或关闭内部高速振荡器(HSI)void CLK_HSICmd(FunctionState NewState)启用CLK_HSICmd(ENABLE)关闭CLK_HSICmd(DISABLE)4启用或关闭内部低速振荡器(LSI)void CLK_LSICmd(FunctionState NewState)关闭CLK_LSICmd(DISABLE);启用CLK_LSICmd(ENABLE);5 启用或关闭时钟输出功能void CLK_CCOCmd(FunctionState NewState)关闭CLK_CCOCmd(DISABLE);启用CLK_CCOCmd(ENABLE);6 启用或关闭时钟切换void CLK_ClockSwitchCmd(FunctionState NewState)关闭CLK_ClockSwitchCmd(DISABLE);启用CLK_ClockSwitchCmd(ENABLE);7 启用或关闭快速唤醒void CLK_FastHaltWakeUpCmd(FunctionState NewState)关闭CLK_FastHaltWakeUpCmd(DISABLE);启用CLK_FastHaltWakeUpCmd(ENABLE);8 启用或关闭活跃停机模式下的电压调节器CLK_SlowActiveHaltWakeUpCmd(FunctionState NewState)关闭CLK_SlowActiveHaltWakeUpCmd(DISABLE);启用CLK_SlowActiveHaltWakeUpCmd(ENABLE);9 启用或关闭指定的时钟中断CLK_PeripheralClockConfig(CLK_IT_TypeDef CLK_IT, FunctionState NewState)参数1:I2C 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);参数1:SPI 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, ENABLE);参数1:UART1 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);参数1:UART2 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_UART2, ENABLE);参数1:UART3 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_UART3, ENABLE);参数1:TIMER1 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);参数1:TIMER2 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE);参数1:TIMER3 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER3, ENABLE);参数1:TIMER4 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE);参数1:TIMER5 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER5, ENABLE);参数1:TIMER6 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER6, ENABLE);参数1:AWU 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, ENABLE);参数1:ADC 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE);参数1:CAN 参数2:ENABLECLK_PeripheralClockConfig(CLK_PERIPHERAL_CAN, ENABLE);10 系统时钟切换配置CLK_ClockSwitchConfig(CLK_SwitchMode_TypeDef CLK_SwitchMode, CLK_Source_TypeDef CLK_NewClock,FunctionState ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState)参数1:手动切换参数2:内部高速振荡器参数3:关闭参数4:继续启用ErrorStatus clk_return_status;clk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_MANUAL, CLK_SOURCE_HSI, ENABLE, CLK_CURRENTCLOCKSTATE_ENABLE);参数1:自动切换参数2:内部低速振荡器参数3:关闭参数4:关闭ErrorStatus clk_return_status;clk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_LSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);参数1:自动切换参数2:外部高速振荡器参数3:关闭参数4:关闭ErrorStatus clk_return_status;clk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);11 配置内部高速振荡器(HSI)的分频器void CLK_HSIPrescalerConfig(CLK_Prescaler_TypeDef HSIPrescaler)1分频CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);2分频CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);4分频CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);8分频CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);12 配置时钟输出脚(CCO)的时钟源Void CLK_CCOConfig(CLK_Output_TypeDef CLK_CCO)参数1:内部高速振荡器/分频值CLK_CCOConfig(CLK_OUTPUT_HSI);参数1:内部低速振荡器CLK_CCOConfig(CLK_OUTPUT_LSI);参数1:外部高速振荡器CLK_CCOConfig(CLK_OUTPUT_HSE);参数1:CPU时钟1分频CLK_CCOConfig(CLK_OUTPUT_CPU);参数1:CPU时钟2分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV2);参数1:CPU时钟4分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV4);参数1:CPU时钟8分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV8);参数1:CPU时钟16分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV16);参数1:CPU时钟32分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV32);参数1:CPU时钟64分频CLK_CCOConfig(CLK_OUTPUT_CPUDIV64);参数1:fHSI CLK_CCOConfig(CLK_OUTPUT_HSIRC);参数1:fMASTER CLK_CCOConfig(CLK_OUTPUT_MASTER);参数1:其它/fCPU CLK_CCOConfig(CLK_OUTPUT_OTHERS);13 启用或关闭指定的外设时钟Void CLK_PeripheralClockConfig(CLK_Peripheral_TypeDef CLK_Peripheral,FunctionalState NewState)参数1:时钟安全系统检测标志参数2:启用CLK_ITConfig(CLK_IT_CSSD, ENABLE);参数1:时钟切换中断标志参数2:关闭CLK_ITConfig(CLK_IT_SWIF, DISABLE);14 配置系统时钟分频器Void CLK_SYSCLKConfig(CLK_Prescaler_TypeDef CLK_Prescale)参数1:内部高速振荡器1分频CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);参数1:内部高速振荡器2分频CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV2);参数1:内部高速振荡器4分频CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV4);参数1:内部高速振荡器8分频CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV8);参数1:CPU时钟1分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);参数1:CPU时钟2分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2);参数1:CPU时钟4分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);参数1:CPU时钟8分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV8);参数1:CPU时钟16分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV16); 参数1:CPU时钟32分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV32); 参数1:CPU时钟64分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV64); 参数1:CPU时钟128分频CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV128);15 配置SWIM时钟分频器void CLK_SWIMConfig(CLK_SWIMDivider_TypeDef CLK_SWIMDivider)参数1:2分频CLK_SWIMConfig(CLK_SWIMDIVIDER_2);参数1:不分频CLK_SWIMConfig(CLK_SWIMDIVIDER_OTHER);16配置CAN时钟频率Void CLK_CANConfig((CLK_CANDivider_TypeDef CLK_CANDivider)参数1:时钟频率=HSE/1 CLK_CANConfig(CLK_CANDIVIDER_1); 参数1:时钟频率=HSE/2 CLK_CANConfig(CLK_CANDIVIDER_2); 参数1:时钟频率=HSE/3 CLK_CANConfig(CLK_CANDIVIDER_3); 参数1:时钟频率=HSE/4 CLK_CANConfig(CLK_CANDIVIDER_4); 参数1:时钟频率=HSE/5 CLK_CANConfig(CLK_CANDIVIDER_5); 参数1:时钟频率=HSE/6 CLK_CANConfig(CLK_CANDIVIDER_6); 参数1:时钟频率=HSE/7 CLK_CANConfig(CLK_CANDIVIDER_7); 参数1:时钟频率=HSE/8 CLK_CANConfig(CLK_CANDIVIDER_8);17 启用时钟安全系统Void CLK_ClockSercuritySystemEnable(void)18 清除时钟切换忙标志Void CLK_SYSCLKEmergencyClear(void)19 修正内部高速振荡器频率Void CLK_AdjustHSICalibrationValue(CLK_HSITrimValue_TypeDef CLK_HSITrimValue)参数1:校准值为0 CLK_AdjustHSICalibrationValue(CLK_HSITRIMV ALUE_0);参数1:校准值为1 CLK_AdjustHSICalibrationValue(CLK_HSITRIMV ALUE_1);参数1:校准值为2 CLK_AdjustHSICalibrationValue(CLK_HSITRIMV ALUE_2);参数1:校准值为3 CLK_AdjustHSICalibrationValue(CLK_HSITRIMV ALUE_3);参数1:校准值为4 CLK_AdjustHSICalibrationValue(CLK_HSITRIMV ALUE_4);参数1:校准值为5 CLK_AdjustHSICalibrationValue(CLK_HSITRIMV ALUE_5);参数1:校准值为6 CLK_AdjustHSICalibrationValue(CLK_HSITRIMV ALUE_6);参数1:校准值为7 CLK_AdjustHSICalibrationValue(CLK_HSITRIMV ALUE_7);20 获得系统时钟频率u32 CLK_GetClockFreq()21 获得系统时钟源CLK_GetSYSCLKSource(void)22 获得时钟标志状态CLK_GetFlagStatus(CLK_FLAG_TypeDef CLK_FLAG)参数1:内部低速振荡器就绪标志位CLK_GetFlagStatus(CLK_FLAG_LSIRDY); 参数1:内部高速振荡器就绪标志位CLK_GetFlagStatus(CLK_FLAG_HSIRDY); 参数1:外部高速振荡器就绪标志位CLK_GetFlagStatus(CLK_FLAG_HSERDY); 参数1:时钟切换中断标志位CLK_GetFlagStatus(CLK_FLAG_SWIF);参数1:时钟切换忙标志位CCLK_GetFlagStatus(CLK_FLAG_SWBSY); 参数1:时钟安全系统检测标志位CLK_GetFlagStatus(CLK_FLAG_CSSD);参数1:辅助振荡器开关状态位CLK_GetFlagStatus(CLK_FLAG_AUX);参数1:时钟输出忙标志位CLK_GetFlagStatus(CLK_FLAG_CCOBSY); 参数1:时钟输出就绪标志位CLK_GetFlagStatus(CLK_FLAG_CCORDY);23 获得时钟中断标志状态CLK_GetITStatus(CLK_IT_TypeDef CLK_IT)参数1:时钟安全系统监测标志CLK_GetITStatus(CLK_IT_CSSD);参数1:时钟切换中断标志CLK_GetITStatus(CLK_IT_SWIF);24 清除中断标志状态Void CLK_ClearITPendingBit(CLK_IT_ TypeDef CLK_IT);参数1:时钟安全系统检测标志CLK_ClearITPendingBit(CLK_IT_CSSD); 参数1:时钟切换终端标志CLK_ClearITPendingBit(CLK_IT_SWIF);。

闹钟代码

闹钟代码

(3)abc键的判断OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲LEDBuf1 equ 50h ; 显示缓冲Hour equ 40hMinute equ 41hSecond equ 42hC100us equ 43hHour1 equ 44hMinute1 equ 45hSecond1 equ 46hSPK equ P3.6 ;扬声器接P3.6口Tick equ 10000T100us equ 256-50Num equ 70hljmp Start ;跳入主程序org 000bh ;定时器中断0入口地址jmp T0Intorg 001bh ;定时器中断1入口地址T0Int:push PSWpush ACCmov a, C100us+1jnz Goondec C100usGoon:dec C100us+1mov a, C100usorl a, C100us+1jnz Exitmov C100us, #high(Tick)mov C100us+1, #low(Tick)inc Secondmov a, Secondcjne a, #60, Exitmov Second, #0inc Minutemov a, Minutecjne a, #60, Exitmov Minute, #0inc Hourmov a, Hourcjne a, #24, Exitmov Hour, #0Exit:pop ACCpop PSWretiDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDisplayLED: ;幌允境绦?mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #6KLoop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh; 没有键按下, 返回0ffhsjmp Exit1Goon1:mov r1, a ; 键值= 列X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值mov r1, #4loopc:rrc a ; 移位找出所在行jc Exit1inc r2 ; r2 = r2+ 行值djnz r1, LoopcExit1:mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retToLED:mov dptr, #LEDMapmovc a, @a+dptrretisplayLED1:mov r0, #LEDBuf1mov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示DisplayLED1:mov r0, #LEDBuf1mov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop1:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loop1retdsloop:call jsloopcall sfmretjsloop :t1p: call TestKey ; 有键入?jz t1p ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at2p: call TestKey ; 有键入?jz t2p ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Hour1,at3p: call TestKey ; 有键入?jz t3p ; 无键入, 继续显示call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at4p: call TestKey ; 有键入?jz t4p ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Minute1,at5p: call TestKey ; 有键入?jz t5pcall GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at6p: call TestKey ; 有键入?jz t6p ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Second1,aretsfm:mov a, Hourmov b, #10div abcall ToLEDmov LEDBuf, a;将小时分开两位来显示mov a, bcall ToLEDorl a, #80h; (;)mov LEDBuf+1, amov a, Minutemov b, #10div abcall ToLED;将分钟分开两位来显示mov LEDBuf+2, amov a, bcall ToLEDorl a, #80h;()mov LEDBuf+3, amov a, Secondmov b, #10div abcall ToLED;将秒钟分开两位来显示mov LEDBuf+4, amov a, bcall ToLEDmov LEDBuf+5, aretjjloop :t1: call TestKey ; 有键入?jz t1 ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at2: call TestKey ; 有键入?jz t2 ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Hour,at3: call TestKey ; 有键入?jz t3 ; 无键入, 继续显示call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at4: call TestKey ; 有键入?jz t4 ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Minute,at5: call TestKey ; 有键入?jz t5call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at6: call TestKey ; 有键入?jz t6 ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Second,aretxxloop: call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 显示键码cjne a,#77h, yyloop ;判断A键是否被按下mov r4,#1call jjloopcall bjloopretyyloop:call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 显示键码cjne a,#39h, MLoop;判断c键是否被按下call dsloopcall bjloopretStart: MOV SP,#50Hmov r4,#0mov TMOD, #02h ;(02h)模式2, 定时器mov TH0, #T100usmov TL0, #T100usmov IE, #10000010b;EA=1, IT0 = 1, #10001010bMOV TH1,#0D8HMOV TL1,#0EFH;MOV TMOD,#10Hmov Hour, #0;;#09 ;(#0)mov Minute, #0mov Second, #0mov C100us, #high(Tick)mov C100us+1, #low(Tick)setb TR0 ; 启动定时器0MLoop:Call sfmcall DisplayLED ;调用显示程序call xxloopbjloop:call DisplayLED ; 显示call TestKey ; 有键入?jz bjLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 显示键码call ToLEDcjne a,#7ch,bjloop;判断B键是否被按下call sfmzzloop:mov a,#60;对当前输入的时间和计时时间进行比较cjne a,50h,rrrmov a,61hcjne a,51h,rrrmov a,62hcjne a,52h,rrrmov a,63hcjne a,53h,rrrmov a,64hcjne a,54h,rrrmov a,65hcjne a,55h,rrr;call MUSIC0 ;相等即调用音乐程序mov r4,#0rrr: ljmp MLoop ;不相等调用显示程序End(2)附件OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲LEDBuf1 equ 50h ; 显示缓冲Hour equ 40hMinute equ 41hSecond equ 42hC100us equ 43hHour1 equ 44hMinute1 equ 45hSecond1 equ 46hSPK equ P3.6 ;扬声器接P3.6口Tick equ 10000T100us equ 256-50Num equ 70hljmp Start ;跳入主程序org 000bh ;定时器中断0入口地址jmp T0Intorg 001bh ;定时器中断1入口地址T0Int:push PSWpush ACCmov a, C100us+1jnz Goondec C100usGoon:dec C100us+1mov a, C100usorl a, C100us+1jnz Exitmov C100us, #high(Tick)mov C100us+1, #low(Tick)inc Secondmov a, Secondcjne a, #60, Exitmov Second, #0inc Minutemov a, Minutecjne a, #60, Exitmov Minute, #0inc Hourmov a, Hourcjne a, #24, Exitmov Hour, #0Exit:pop ACCpop PSWretiDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDisplayLED: ;幌允境绦?mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #6KLoop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh; 没有键按下, 返回0ffhsjmp Exit1Goon1:mov r1, a ; 键值= 列X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值mov r1, #4loopc:rrc a ; 移位找出所在行jc Exit1inc r2 ; r2 = r2+ 行值djnz r1, LoopcExit1:mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retToLED:mov dptr, #LEDMapmovc a, @a+dptrretisplayLED1:mov r0, #LEDBuf1mov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示DisplayLED1:mov r0, #LEDBuf1mov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop1:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1mov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loop1retdsloop:call jsloopcall sfmretjsloop :t1p: call TestKey ; 有键入?jz t1p ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at2p: call TestKey ; 有键入?jz t2p ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Hour1,at3p: call TestKey ; 有键入?jz t3p ; 无键入, 继续显示call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at4p: call TestKey ; 有键入?jz t4p ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Minute1,at5p: call TestKey ; 有键入?jz t5pcall GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at6p: call TestKey ; 有键入?jz t6p ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Second1,aretsfm:mov a, Hourmov b, #10div abcall ToLEDmov LEDBuf, a;将小时分开两位来显示mov a, bcall ToLEDorl a, #80h; (;)mov LEDBuf+1, amov a, Minutemov b, #10div abcall ToLED;将分钟分开两位来显示mov LEDBuf+2, amov a, bcall ToLEDorl a, #80h;()mov LEDBuf+3, amov a, Secondmov b, #10div abcall ToLED;将秒钟分开两位来显示mov LEDBuf+4, amov a, bcall ToLEDmov LEDBuf+5, aretjjloop :t1: call TestKey ; 有键入?jz t1 ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at22: call TestKey ; 有键入?jz t22 ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Hour,at3: call TestKey ; 有键入?jz t3 ; 无键入, 继续显示call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at4: call TestKey ; 有键入?jz t4 ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Minute,at5: call TestKey ; 有键入?jz t5call GetKeyanl a, #0fh ; 显示键码mov b, #10MUL abmov b,at6: call TestKey ; 有键入?jz t6 ; 无键入, 继续显?call GetKeyanl a, #0fh ; 显示键码add a,bmov Second,aretxxloop: call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 显示键码cjne a,#77h, yyloop ;判断A键是否被按下mov r4,#1call jjloopcall bjloopretyyloop:call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 显示键码cjne a,#39h, MLoop;判断c键是否被按下call dsloopcall bjloopretStart: MOV SP,#50Hmov r4,#0mov TMOD, #02h ;(02h)模式2, 定时器mov TH0, #T100usmov TL0, #T100usmov IE, #10000010b;EA=1, IT0 = 1, #10001010bMOV TH1,#0D8HMOV TL1,#0EFH;MOV TMOD,#10Hmov Hour, #0;;#09 ;(#0)mov Minute, #0mov Second, #0mov C100us, #high(Tick)mov C100us+1, #low(Tick)setb TR0 ; 启动定时器0MLoop:Call sfmcall DisplayLED ;调用显示程序call xxloopbjloop:call DisplayLED ; 显示call TestKey ; 有键入?jz bjLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 显示键码call ToLEDcjne a,#7ch,bjloop;判断B键是否被按下call sfmzzloop:mov a,#60;对当前输入的时间和计时时间进行比较cjne a,50h,rrrmov a,61hcjne a,51h,rrrmov a,62hcjne a,52h,rrrmov a,63hcjne a,53h,rrrmov a,64hcjne a,54h,rrrmov a,65hcjne a,55h,rrr;call MUSIC0 ;相等即调用音乐程序mov r4,#0rrr: ljmp MLoop ;不相等调用显示程序end。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
set_c=1;
}
}
//**********************校时函数****************************//
void adjust_times(void)
{
if(ok==0)
{
display(days);
if(lr==0)ud=&A;
unsigned char days[8];//存放当前日期
unsigned char T1=100;//200x10ms=1s秒计算
unsigned char T2=0;//20x10ms=200ms
unsigned char c=0;//用于记录闹钟个数
unsigned char hour=8,minute,second;
unsigned char hour_[5],minute_[5],second_[5]={1,2,3,4,5};
unsigned char sec_time[8];
unsigned char clocks[5][8];//可存5个闹钟信息
unsigned char times[8];//存放当前时间
run=0;
sec1=0;
sec2=0;
esc=0;
}
}
//**********************闹钟设置****************************//
void set_clock(void)
{
unsigned char i,j;
display(times);
if(lr==0)ud=&G;//指针指向G
if(lr==1)ud=&H;
if(lr==3)ud=&I;
if(lr==4)ud=&J;
if(lr==6)ud=&K;
if(lr==7)ud=&L;
times[lr]=duan_ma[*ud];//*ud即是ud所指变量的当前值
void second_clock(void)
{
if(sec1==999)sec1=999;
sec_time[0]=0x00;
sec_time[1]=0x00;
sec_time[2]=0x00;
sec_time[3]=duan_ma[sec1/100];
sec_time[4]=duan_ma[sec1%100/10];
{
G=hour/10;H=hour%10;
I=minute/10;J=minute%10;
_Bool run;//控制秒表
_Bool up;//加
_Bool down;//减
_Bool left;//左移
_Bool right;//右移
_Bool set;//设置闹钟
_Bool adjust;//调整时间
_Bool ok;//确定
_Bool esc;//取消或删除
_Bool duan @PE_ODR:7; //PE6作为段锁存
void keyscan(void);//键盘扫描函数
void set_clock(void);//设置闹钟
void adjust_times(void);//
void clock_display(void);//闹钟显示函数
void alarm(void);
void second_clock(void);
sec_time[5]=sec_duan_ma[sec1%10];
sec_time[6]=duan_ma[sec2/10];//小数位
sec_time[7]=duan_ma[sec2%10]; //小数位
display(sec_time);
if(esc==1)
{
left=0;
void time_process(void);//时间处理函数
void times_bi_duan_ma(unsigned char,unsigned char,unsigned char);
void days_bi_duan_ma(int,unsigned char,unsigned char);
main()
{
GPIO_initial();
TIM2_initial();
leapyear(year);
while(1)
{
time_process();
alarm();
if(T2==0)//消抖,延时100ms
keyscan();
if(hour==0&minute==0&second==0)
int sec1,sec2;//用于秒表的变量
unsigned char leapyear(int b);//闰年判断
void TIM2_initial(void);//初始化定时器
void GPIO_initial(void);//初始化I/O引脚
void display(unsigned char x[8]);//时间显示函数
unsigned char month=12,day=12;int year=2011;
unsigned char *ud;//ud加减指针
unsigned char lr;//记录指针所指位
char A,B,C,D,E,F,G,H,I,J,K,L;
int T3=0,T4=0;//其他定时,闹钟显示和蜂鸣器
//************************************//
unsigned char month_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char wei_ma[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//显示位码
off=1;
if(hour==5&minute==0&second==0)
off=0;
if(set==0&adjust==0&left==0&right==0&ok==0&off==1)
{
PB_ODR=0xff;//不显示时间,省电模式
wei=1;
wei=0;
{
c_alarm=0;
T4=1500;
}
}
}
//********************时间处理函数**************************//
void time_process(void)
{
if(second>=60) //秒到60,分钟加1
second_clock();
else if(right==1) //闹钟显示
{
check_clock=0;
clock_display();
}
else if(tab==0)
{
times_bi_duan_ma(hour,minute,second);
if(ok==1)
{
hour_[c]=G*10+H;
minute_[c]=I*10+J;
second_[c]=K*10+L;
if(c==4)c=0;
else c++;
set=0;
ud=0;
lr=0;
right=0;
left=0;
ok=0;
if(lr==0)ud=&G;
if(lr==1)ud=&H;
if(lr==3)ud=&I;
if(lr==4)ud=&J;
if(lr==6)ud=&K;
if(lr==7)ud=&L;
times[lr]=duan_ma[*ud];
}
if(esc==1&ok==1)
else month++;
}
else day++;
}
}
}
}
//*******************时间数据的转换*************************//
void times_bi_duan_ma(unsigned char hour,unsigned char minute,unsigned char second)
unsigned char duan_ma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极显示段码
unsigned char sec_duan_ma[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
{
year=2000+A*10+B;
month=C*10+D;
day=E*10+F;
hour=G*10+H;
minute=I*10+J;
second=K*10+L;
ok=0;
esc=0;
lr=0;
ud=0;
adjust=0;
T1=100;
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s105c6.h"
相关文档
最新文档