该AVR的汇编程序选自《M128》,程序中体现了AVR汇编的基本特点,仅供大家参考。
该应用系统为一个带1/100秒的简易24小时制时钟,它在上电后能够自动从11时59分55秒00开始计时和显示时间。下图为简易时钟系统硬件电路图。
图 简易24小时时钟硬件原理图
系统使用8个LED数码管显示时、分、秒、1/100秒4个时段的数字,每个时段占用2个LED。显示方式采用动态扫描方式,ATmega128的PA口输出显示数字的7段码(注意:图中省缺了PA口连接到LED各段的8个限流电阻,阻值800欧左右),PC口用于控制8个LED的位选。ATmega128使用外部16MHz晶振(图中未画出)。
系统还使用ATmega128片内的计数/定时器T1,设计T1工作在定时溢出中断方式,定时间隔为2ms,即T1每2ms产生一次中断。5次中断得到10ms的时间间隔,此时时钟的1/100秒加1,并相应进行时、分、秒的调整。
LED动态扫描方式的设计如下:在每2ms的时间中,点亮8个LED中的一个,显示其相应的数字(PC口的输出只有一位为低电平,选通一个LED,保持2ms)。因此PC口的输出值为0b11111110,每隔2ms循环右移,到0b01111111时8个LED各点亮一次,时间为16ms。在1秒钟内,循环8个LED的次数为62.5(1000/16),是人眼的滞留时间(25次/秒)的2.5倍,保证了LED显示亮度均匀,无闪烁。在程序设计中,在各个LED转换和7段码输出时,关闭位选信号(PC输出0b11111111),消除了显示的拖尾现象(消影功能)。
T1的设计:T1为16位定时器,系统时钟为16M,采用其64分频后的时钟作为T1的计数信号(寄存器TCCR1B = 0x03),一个计数周期为4us,2ms需要计500个(0x01F4)。由于T1溢出中断发生在0xFFFF后下一个T1计数脉冲的到来(参见第二章关于定时器原理部分),因此T1的计数初始值为0xFE0C = 0xFFFF – 0x01F3(65535-499),即寄存器TCNT1的初值为0xFE0C。
3.8.2 AVR汇编源代码
该系统的汇编源代码如下,开发软件平台使用AVR Studio 4.08。
;********************************************************
;AVR汇编程序实例
;简易带1/100秒的24小时制时钟
;********************************************************
.include "m128def.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 temp_int = r25 ;临时变量(中断中使用)
;中断向量区定义,flash空间$0000-$0045
.org $0000
jmp reset ;复位处理
reti ;IRQ0 Handler
nop
reti ;IRQ1 Handler
nop
reti ;IRQ2 Handler
nop
reti ;IRQ3 Handler
nop
reti ;IRQ4 Handler
nop
reti ;IRQ5 Handler
nop
reti ;IRQ6 Handler
nop
reti ;IRQ7 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
jmp time1_ovf ;Timer1 Overflow Handler
reti ;Timer0 Compare Handler
nop
reti ;Timer0 Overflow Handler
nop
reti ;SPI Transfer Complete Handler
nop
reti ;USART0 RX Complete Handler
nop
reti ;USART0 UDR Empty Handler
nop
reti ;USART0 TX Complete Handler
nop
reti ;ADC Conversion Complete Handler
nop
reti ;E2PROM Ready Handler
nop
reti ;Analog Comparator Handler
nop
reti ;Timer1 CompareC Handler
nop
reti ;Timer3 Capture Handler
nop
reti ;Timer3 CompareA Handler
nop
reti ;Timer3 CompareB Handler
nop
reti ;Timer3 CompareC Handler
nop
reti ;Timer Overflow Handler
nop
reti ;USART1 RX Complete Handler
nop
reti ;USART1 UDR Empty Handler
nop
reti ;USART1 TX Complete Handler
nop
reti ;Two-wire Serial Interface Handler
nop
reti ;SPM Ready Handler
nop
;程序开始
.org $0046
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
上一篇:AVR单片机一些学习笔记
下一篇:最后一页
推荐阅读
史海拾趣
在电子设备的日益增多的背景下,用户对于高效、便捷的设备管理需求愈发强烈。Aten International凭借其对连接技术的深入理解,成功研发出KVM切换器,该产品能够实现对多台计算机的控制,大大提高了工作效率。随着技术的不断进步,Aten International的KVM切换器不断更新迭代,从最初的简单切换功能,发展到现在的智能管理、远程操控等高级功能,成为了电子行业的一大亮点。
随着市场竞争的加剧,ECC意识到只有不断创新才能保持领先地位。因此,公司加大了对研发的投入,引进了一批先进的研发设备和人才。经过数年的努力,ECC成功研发出了具有更高精度、更好性能的电子连接器,并推出了一系列新型电子元件。这些新产品不仅满足了客户日益增长的需求,还为公司带来了更多的市场份额。
为了确保产品质量和客户满意度,ECC建立了完善的质量管理体系。他们从原材料采购到生产、检测、包装等各个环节都制定了严格的质量标准。ECC还引入了先进的质量检测设备和方法,确保每一件产品都符合高标准的质量要求。此外,ECC还定期对员工进行质量培训,提高员工的质量意识和操作技能。这些措施使得ECC的产品在市场上赢得了良好的口碑和信誉。
在电子行业竞争日益激烈的背景下,ELM Technology Corporation展现出了卓越的市场拓展能力。公司管理层准确把握市场趋势,及时调整产品策略,积极拓展国内外市场。通过与国际知名企业的合作,ELM成功打入国际市场,其产品在多个国家和地区得到了广泛应用。同时,公司还积极寻求与国内企业的合作机会,共同推动电子行业的发展。
在电子行业竞争日益激烈的背景下,ELM Technology Corporation展现出了卓越的市场拓展能力。公司管理层准确把握市场趋势,及时调整产品策略,积极拓展国内外市场。通过与国际知名企业的合作,ELM成功打入国际市场,其产品在多个国家和地区得到了广泛应用。同时,公司还积极寻求与国内企业的合作机会,共同推动电子行业的发展。
Brainboxes一直注重与客户建立紧密的合作关系。公司深入了解客户的需求和应用场景,为其提供定制化的解决方案。此外,Brainboxes还积极参与工业连接领域的发展,与多家知名企业建立合作关系,共同推动行业的技术进步和应用创新。这种客户亲密度和工业连接能力使得Brainboxes在市场竞争中占据有利地位。
有调通过marvell wifi 8686 sdio接口驱动来讨论下??? 正在调sdio接口的wifi 8686驱动,sdio确认好的,读写寄存器,加载固件都没问题。有以下问题: 1. 我是直接把驱动放在bsp中编的,wince启动后自动加载wifi驱动, 并且这个wifi驱动会自行搜索热点。我的理解是wifi驱动加载固件启动完wifi芯片注册网络 ...… 查看全部问答∨ |
|
SESSION_POS_S *pTestpos1, *pTestpos2, *pTestpos3, *pPos; LIST *pMyList = NULL; int NodeIndex = 0; DPRINT("-------- lstAdd测试 -------\\n ...… 查看全部问答∨ |
|
用电位器输出一个电压值,从我watch窗口看到的ADCresult值都在变化,变化比较大。如0xabc0,b为都会能差4,帮忙分析一下可能那里设置不对。谢谢!… 查看全部问答∨ |
|
想请问你一下 那个ez430-rf2500为什么ed连上电池两个灯还是不闪。。ap的红灯在闪烁。。并且PC上温度只有一个ap温度显示。。就是说ed的没有反应。。好像是没有连接到网络。。后来又折腾了一下。。现在ap的红绿灯都在闪。。但是ed还是没反应。 ...… 查看全部问答∨ |
|
#include<reg51.h> // 包含51单片机寄存器定义的头文件unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0~9的段码unsigned char int_time ; //中断次数计数变量unsigned ...… 查看全部问答∨ |
module main ( ....); wire clk1MHz; // 产生1MHz的时钟波形 // 输入为20MHz的时钟 clock_divider instT1MHz &nb ...… 查看全部问答∨ |