新闻  |   论坛  |   博客  |   在线研讨会
一个用来测试avr-gcc的数字移位实验,采用avr-gcc编写
zhchxgh | 2009-07-04 01:30:02    阅读:1624   发布文章

一个用来测试avr-gcc的数字移位实验,采用avr-gcc编写
在hjavr上调试通过。
;*****************************************
;这是数字移位显示实验,
;程序运行的结果
;8个数码关循环显示"1" - "f","1." - "f."
;此外,本程序好用到了hj1.asm中的延时程序
;代码在hjavr学习开发系统上测试通过
;*****************************************

.include"8515def.inc" 
;包含文件要和"器件支持"相一致,否则可能出错
.org 0x00
rjmp main
.org 0x10
main:ldi r17,high(RAMEND) 
out SPH,r17 ;设置堆栈高位
ldi r17,low(RAMEND) 
out SPL,r17 ;设置堆栈低位
ldi r17,0xff ;设置端口方向为输出
out ddra,r17
out ddrc,r17 
out ddrd,r17
ldi r17,0 ;数据
out portd,r17
lf: ldi r16,0x01 ;位选
lp: push r16
ldi r16,0xcf ;延时参数
rcall delay
pop r16
rcall disprsg ;调用显示输出子程序
inc r17
rol r16 ;移位显示
brcs lf ;如果进位标志被设置重新执行循环
cpi r17,$1f ;否则顺序执行,检查显示数据
brne lp ;是否完成,如果没有完成继续循环
rjmp main ;否则,程序重新执行

; ********** 数码显示子程序
disprsg:
out porta,r16
ldi zh,high(tab_nu*2)
clr zl
add zl,r17
lpm 
out portc,r0
ret

; ********* 延时子程序 
delay: push r16 ;延时程序
l1: push r16
l2: dec r16
brne l2 
pop r16
dec r16
brne l1 
pop r16
dec r16
brne delay 
ret 
; ****************************************
; 这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推
.org 0x80
tab_nu: .db 0xc0 ,0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8 ; number 0 to 7 no dp..
.db 0x80 ,0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86,0x8e ; number 8 to f no dp..
.db 0x40 ,0x79, 0x24, 0x30, 0x19, 0x12, 0x02,0x78 ; number 0 to 7 with dp..
.db 0x00 ,0x10, 0x08, 0x03, 0x46, 0x21, 0x06,0x0e ; number 8 to f with dp..
.db 0x00 ,0x00,采用avr-gcc编写
在hjavr上调试通过。
;*****************************************
;这是数字移位显示实验,
;程序运行的结果
;8个数码关循环显示"1" - "f","1." - "f."
;此外,本程序好用到了hj1.asm中的延时程序
;代码在hjavr学习开发系统上测试通过
;*****************************************

.include"8515def.inc" 
;包含文件要和"器件支持"相一致,否则可能出错
.org 0x00
rjmp main
.org 0x10
main:ldi r17,high(RAMEND) 
out SPH,r17 ;设置堆栈高位
ldi r17,low(RAMEND) 
out SPL,r17 ;设置堆栈低位
ldi r17,0xff ;设置端口方向为输出
out ddra,r17
out ddrc,r17 
out ddrd,r17
ldi r17,0 ;数据
out portd,r17
lf: ldi r16,0x01 ;位选
lp: push r16
ldi r16,0xcf ;延时参数
rcall delay
pop r16
rcall disprsg ;调用显示输出子程序
inc r17
rol r16 ;移位显示
brcs lf ;如果进位标志被设置重新执行循环
cpi r17,$1f ;否则顺序执行,检查显示数据
brne lp ;是否完成,如果没有完成继续循环
rjmp main ;否则,程序重新执行

; ********** 数码显示子程序
disprsg:
out porta,r16
ldi zh,high(tab_nu*2)
clr zl
add zl,r17
lpm 
out portc,r0
ret

; ********* 延时子程序 
delay: push r16 ;延时程序
l1: push r16
l2: dec r16
brne l2 
pop r16
dec r16
brne l1 
pop r16
dec r16
brne delay 
ret 
; ****************************************
; 这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推
.org 0x80
tab_nu: .db 0xc0 ,0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8 ; number 0 to 7 no dp..
.db 0x80 ,0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86,0x8e ; number 8 to f no dp..
.db 0x40 ,0x79, 0x24, 0x30, 0x19, 0x12, 0x02,0x78 ; number 0 to 7 with dp..
.db 0x00 ,0x10, 0x08, 0x03, 0x46, 0x21, 0x06,0x0e ; number 8 to f with dp..
.db 0x00 ,0x00

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客