简易带1/100 秒的24 小时制时钟

发布者:明月昊天最新更新时间:2017-12-20 来源: eefocus关键字:1/100  24小时制  时钟 手机看文章 扫描二维码
随时随地手机看文章

;********************************************************  
;AVR汇编程序实例 简易带1/100秒的24小时制时钟 
;简易带1/100秒的24小时制时钟 
;MEGA16 4MHz  
;******************************************************** 


.include "m16de.inc"      ;引用器件I/O配置文件 


;定义程序中使用的变量名(在寄存器空间)  
.def count      =   r18   ;循环计数单元  
.def position      =   r19   ;LED显示位指针,取值为0-7  
.def p_temp       =   r20   ;LED显示位选,其值取反由PC口输出  
.def count_10ms   =   r21      ;10ms计数单元  
.def flag_2ms      =   r22   ;2ms到标志  
.def temp         =   r23   ;临时变量  
.def temp1      =   r24      ;临时变量  
.def int      =   r25   ;临时变量(中断中使用) 

;中断向量区定义,flash空间$0000-$0045  
.org $000 
   rjmp reset      ;复位处理  
   nop 
   reti         ;INT0 Handler  
   nop  
   reti         ;INT1 Handler  
   nop  
   reti         ;Timer2 Compare Handler  
   nop  
   reti         ;Timer2 Overflow Handler  
   nop  
   reti         ;Timer1 Capture Handler  
   nop  
   reti         ;Timer1 CompareA Handler  
   nop  
   reti         ;Timer1 CompareB Handler  
   nop  
   rjmp time1_ovf ;Timer1 Overflow Handler  
   nop 
   reti         ;Timer0 Overflow Handler  
   nop  
   reti         ;SPI Transfer Complete Handler  
   nop  
   reti         ;USART RX Complete Handler  
   nop  
   reti         ;USART UDR Empty Handler  
   nop  
   reti         ;USART TX Complete Handler  
   nop  
   reti         ;ADC Conversion Complete Handler  
   nop  
   reti         ;E2PROM Ready Handler  
   nop  
   reti         ;Analog Comparator Handler  
   nop  
   reti         ;Two-wire Serial Interface Handler  
   nop  
   reti         ;INT2  Handler   
   nop  
   reti         ;Timer0 Comp  Handler   
   nop 
   reti         ;SPM Ready Handler  
   nop      

;程序开始  
.org $02A  
reset:   
   ldi r16,high(RAMEND)      ;设置堆栈指针高位  
   out sph,r16  
   ldi r16,low(RAMEND)      ;设置堆栈指针低位  
   out spl,r16  
     
   ser temp           
   out ddra,temp            ;设置PORTA为输出,段码输出  
   out ddrc,temp            ;设置PORTC为输出,位码控制  
   out portc,temp         ;PORTC输出$FF, 无显示 

   ldi position,0x00         ;段位初始化为1/100秒低位  
   ldi p_temp,0x01         ;LED第1位亮 

;初始化时钟时间为11:59:55:00  
   ldi xl,low(time_buff)      ;  
   ldi xh,high(time_buff)      ;X寄存器取得时钟单元首指针  
   ldi temp,0x00  
   st  x+,temp            ;1/100秒 = 00  
   ldi temp,55  
   st  x+,temp            ;秒 = 55  
   ldi temp,59  
   st  x+,temp            ;分 = 59  
   ldi temp,11  
   st  x,temp            ;时 = 11 

   ldi temp,0xff           ;T1初始化,每隔2ms中断一次  
   out tcnt1h,temp  
   ldi temp,0x83 
   out tcnt1l,temp  
   clr temp  
   out tCCr1a,temp  
   ldi temp,0x03            ;16M,64分频 2ms  
   out tccr1b,temp  
   ldi temp,0x04  
   out timsk,temp         ;允许T1溢出中断  
   sei                  ;全局中断允许 

;主程序  
main:  
   cpi flag_2ms,0x01         ;判2ms到否  
   brne main               ;No,转main循环  
   clr flag_2ms            ;到,请2ms标志  
   rcall display            ;调用LED显示时间(动态扫描显示一位)  
d_10ms_ok:  
   cpi count_10ms,0x05      ;判10ms到否  
   brne main               ;No,转main循环  
   clr count_10ms         ;10ms到,清零10ms计数器  
   rcall time_add         ;调用时间加10ms调整  
   rcall put_t2d            ;将新时间值放入显示缓冲单元  
   rjmp main               ;转main循环 

;LED动态扫描显示子程序,2ms执行一次,一次点亮一位,8位循环  
display:  
   clr r0  
   ser temp               ;temp = 0x11111111  
   out portc,temp         ;关显示,去消影和拖尾作用  
   ldi yl,low(display_buff)  
   ldi yh,high(display_buff)   ;Y寄存器取得显示缓冲单元首指针  
   add yl,position         ;加上要显示的位值  
   adc yh,r0               ;加上低位进位  
   ld temp,y               ;temp中为要显示的数字  
     
   clr r0  
   ldi zl,low(led_7 * 2)  
   ldi zh,high(led_7 * 2)      ;Z寄存器取得7段码组的首指针  
   add zl,temp            ;加上要显示的数字  
   adc zh,r0               ;加上低位进位     
   lpm               ;读对应七段码到R0中  
   out porta,r0            ;LED段码输出 

   mov r0,p_temp  
   com r0,  
   out portc,r0         ;输出位控制字,完成LED一位的显示  
     
   inc position         ;调整到下一次显示位  
   lsl p_temp  
   cpi position,0x08  
   brne display_ret  
   ldi position,0x00  
   ldi p_temp,0x01  
display_ret:  
   ret 

;时钟时间调整,加0.01秒  
time_add:  
      ldi xl,low(time_buff)   ;  
      ldi xh,high(time_buff)   ;X寄存器为时钟单元首指针  
      rcall dhm3         ;ms单元加1调整  
      cpi temp,100      ;  
      brne   time_add_ret   ;未到100ms返回  
      rcall dhm         ;秒单元加1调整  
      cpi temp,60  
      brne   time_add_ret   ;未到60秒返回  
      rcall dhm         ;分单元加1调整  
      cpi temp,60  
      brne time_add_ret      ;未到60分返回  
      rcall dhm         ;时单元加1调整  
      cpi temp,24  
      brne time_add_ret         ;未到24时返回  
      clr temp  
      st x,temp            ;到24时,时单元清另  
time_add_ret:  
      ret 

;低段时间清零,高段时间加1  
dhm:  clr temp         ;当前时段清零  
dhm1: st  x+,temp         ;当前时段清零,X寄存器指针加一  
dhm3: ld  temp,x         ;取出新时段数据  
      inc temp             ;加一   
dhm2: st x,temp         ;并将调整结果送回  
      ret 

;将时钟单元数据送LED显示缓冲单元中  
put_t2d:  
   ldi xl,low(time_buff)      ;  
   ldi xh,high(time_buff)      ;X寄存器时钟单元首指针  
   ldi yl,low(display_buff)  
   ldi yh,high(display_buff)   ;Y寄存器显示缓冲单元首指针  
   ldi count,4            ;循环次数 = 4  
loop:  
   clr temp1 
   ld   temp,x+            ;读一个时间单元  
loop1: 
   cpi temp,10 
   brlo loop2              ;<10转 
   inc temp1 
   subi temp,10             
   rjmp loop1 
loop2: 
   st y+,temp            ;写入2个显示单元  
   st y+,temp1         ;低位BCD码在前,高位在后  
   dec   count  
   brne   loop         ;4个时间单元->8个显示单元  
   ret 

;T1时钟溢出中断服务  
time1_ovf:  
   in int,sreg  
   push int            ;保护状态寄存器  
     
   ldi int,0xff         ;T1初始值设定,2ms中断一次  
   out tcnt1h,int  
   ldi int,0x83  
   out tcnt1l,int  
     
   inc count_10ms         ;10ms计数器加一  
   ldi flag_2ms,0x01         ;置2ms标志到  
     
pop int  
   out sreg,   int         ;恢复状态寄存器  
   reti                  ;中断返回        
     
.CSEG               ;LED七段码表,定义在Flash程序空间  
led_7:               ;7段码表  
.db 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07  
.db 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71    

;字 PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 共阴极 共阳极  
;   h   g   f   E   d   c   b   a        
;0   0   0   1   1   1   1   1   1   3FH      C0H  
;1   0   0   0   0   0   1   1   0   06H      F9H  
;2   0   1   0   1   1   0   1   1   5BH      A4H  
;3   0   1   0   0   1   1   1   1   4FH      B0H  
;4   0   1   1   0   0   1   1   0   66H      99H  
;5   0   1   1   0   1   1   0   1   6DH      92H  
;6   0   1   1   1   1   1   0   1   7DH      82H  
;7   0   0   0   0   0   1   1   1   07H      F8H  
;8   0   1   1   1   1   1   1   1   7FH      80H  
;9   0   1   1   0   1   1   1   1   6FH      90H  
;A   0   1   1   1   0   1   1   1   77H      88H  
;b   0   1   1   1   1   1   0   0   7CH      83H  
;C   0   0   1   1   1   0   0   1   39H      C6H  
;d   0   1   0   1   1   1   1   0   5EH      A1H  
;E   0   1   1   1   1   0   0   1   79H      86H  
;F   0   1   1   1   0   0   0   1   71H      8EH 

.DSEG            ;定义程序中使用的变量位置(在RAM空间)  
.ORG     $0100  
display_buff:         ;LED显示缓冲区,8个字节  
.BYTE   0x00         ;LED 1 位显示内容  
.BYTE   0x00         ;LED 2 位显示内容  
.BYTE   0x00         ;LED 3 位显示内容  
.BYTE   0x00         ;LED 4 位显示内容  
.BYTE   0x00         ;LED 5 位显示内容  
.BYTE   0x00         ;LED 6 位显示内容  
.BYTE   0x00         ;LED 7 位显示内容  
.BYTE   0x00         ;LED 8 位显示内容 

.org   $0108  
time_buff:         ;时钟数据缓冲区,4个字节  
.BYTE   0x00         ;1/100s单元  
.BYTE   0x00         ;秒单元  
.BYTE   0x00         ;分单元  
.BYTE   0x00         ;时单元  


关键字:1/100  24小时制  时钟 引用地址:简易带1/100 秒的24 小时制时钟

上一篇:AVR并口ISP下载器
下一篇:用 Atmega8 实现D触发锁存器的功能

推荐阅读最新更新时间:2024-03-16 15:50

STM32入门-STM32时钟系统,时钟初始化配置函数
  在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main。那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使用库函数编写的LED程序,在system_stm32f10x.c文件中可以找到SystemInit()函数,SystemInit()代码如下:   void SystemInit (void)   {   /* Reset the RCC clock configuration to the default reset state(for debug purpose) /   / Set HSION bit /   RCC- CR
[单片机]
C8051F120与RS422总线的时钟同步技术
   引 言   由于指令的速度不断加快,单片机在各个方面的性能大为提高,比如多个单片机之间的时钟同步。Silicon Labs公司的C8051F系列单片机的执行速度最高可以达到100MIPS,这使得更高精度的时钟同步成为可能。时钟同步是一个在多单片机相互配合时经常遇到的问题,主要有两种同步方式——绝对同步和相对同步。绝对同步是指各个控制器和一个标准的时间进行同步,比如北京时间、华盛顿时间等等;而相对时钟同步是指各个单片机和一个相对稳定的时钟进行同步,与外界的时间没有联系。本文主要针对RS422总线组成的网络的高精度时钟同步问题,提出了一种相对时钟同步解决方案。    1 整体框架结构   RS422网络中,多个单片机的连接
[单片机]
可工作于32~175Mbps的时钟和数据恢复芯片SY87700L及其应用
    摘要: SY87700L是MICREL公司推出的一种完整的、可将数据速率从32~175Mbps的NRZ数据流中进行恢复的反相不归零时钟恢复和数据重定时电路芯片,可广泛应用于SONET/SDH/ATM、高速英特网和其它所有的175Mbps以下速率结构的应用场合。文中介绍了SY87700L的主要特点、引脚功能、工作原理和应用电路。     关键词: 时钟恢复 数据重定时 SONET SDH ATM SY87700L 1 概述 SY87700L是MICREL公司不久前推出的一款完整的、可将数据速率从32~175Mbps的NRZ数据流中进行恢复的时钟恢复和数据重定时反相不归零电路芯片。SY87700L器件
[应用]
PCF8563时钟+AT24C02+LCD12864显示时钟程序
//aa 00 47 13 25 63 00 04 04 //秒 分 时 日 星期和月(最高3位0-6,代表1-7) #include intrins.h #include AT89x52.h #include hc LCD dot.h //点阵库 #define Uchar unsigned char #define Uint unsigned int #define SomeNOP(); _nop_();_nop_();_nop_(); /*LCD驱动要用到的一些口线定意*/ #define LCDPORT P0 sbit D_I = P3^7; sbit R_W = P3^6; sbit E = P3^5
[单片机]
对MSP430F5438的时钟及uart配置
对MSP430F5438的时钟及uart配置 在使用的过程中,一直认为比较简单,也一直没有深究,忽然这几天卡壳了,出现问题是操作UART发送出的数据给232显示,并不是想得到的数据。这里涉及了两个地方,一是时钟配置,二是对UART的配置。 时钟配置 需求:考虑到功耗及使用场景,MCLK=2M,SMCLK=1M,ACLK=32768 P7SEL |= BIT0 + BIT1; //开XT1 __bis_SR_register( SCG0 ); // Disable the FLL control loop UCSCTL0 = 0x0000; // Set low
[单片机]
MSP430单片机:时钟系统(UCS 模块)
UCS 模块最多含有 5 个时钟源: XT1CLK :低频 / 高频振荡器,可以使用低频 32768HZ 晶振和外部振荡器或者通过外部输入源输入 4MHZ~32MHZ 时钟。 VLOCLK :内部低消耗,低频振荡器。典型值为 12KHZ 。 REFOCLK :内部低频振荡器,典型值为 32768HZ ,作为 FLL 基准源。 DCOCLK :内部数字控制振荡器 (DCO) 可以通过 FLL 来稳定。 XT2CLK :可选择的高频振荡器,可以使用标准晶振,振荡器或者外部时钟源输 4MHZ~40MHZ 。 外部:XT1CLK XT2CLK 内部: VLOCLK REFOCLK DCOCLK UCS 模块可以产生三个时钟信号供
[单片机]
MSP430单片机:<font color='red'>时钟</font>系统(UCS 模块)
XMEGA128学习笔记6-实时时钟RTC
Xmega128的RTC实际上就是16位定时器,它的框图如图所示。时钟来源有两种:1是32KHZ,2是1KHZ。能够通过10位预分频,进一步得到低速频率。图中Period表示周期,也就是最多计数值。Compare是比较值,匹配时能够触发中断。今天我就用RTC的匹配中断功能,进行1s报警闪烁LED0。 第一步:打开CVARV,新建一个工程,首先使能低级中断: 第二步:设置LED0端口输出。 第三步:选择时钟源,开启RTC比较中断。 第四步:生成代码,编译下载。 在RTC匹配中断函数中加入以下代码: // RTC compare interrupt service routine interrupt voi
[单片机]
XMEGA128学习笔记6-实时<font color='red'>时钟</font>RTC
单片机编程技巧-功能强大的时钟中断
功能强大的时钟中断   在单片机 程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。   下面以6MHz时钟的AT89C51系统为例,说明时钟中断的应用。   定时器初值与中断周期 时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved