avr单片机led数码管六位动态显示时分秒c语言程序,AVR单片机控制8段LED数码管同时显示 - AVR单片机8位数码管显示的程序实现(两种方法介绍)...
AVR單片機控制8段LED數碼管同時顯示
這是一個簡單的供單片機入門學習者練習用的8段LED數碼管控制匯編程序,控制一個兩位的數碼管同時顯示字符(動態刷新)。用AVR- Studio-4 開發,在AVR單片機Atmega48上調試通過。學習者可以舉一反三應用到其他類型的單片機芯片。
arget : M48 ;
Crystal: 8.0000Mhz
.include “m48def.inc”
.org $0000 rjmp _main
.org $0020
_port_init:; 端口初始化
clr R2
out 0x5,R2 PortB清零
ldi R24,255
out 0x4,R24 定義PortB為輸出
out 0x8,R2 PortC清零
ldi R24,3
out 0x7,R24 定義PortC.0,Portc.1為輸出
ret
_tabs:;字形定義
.dw 192 0xC0,“0”
.dw 249 0xF9,“1”
.dw 164 0xA4,“2”
.dw 176 0xB0,“3”
.dw 153 0x99,“4”
.dw 146 0x92,“5”
.dw 130 0x82,“6”
.dw 248 0xF8,“7”
.dw 128 0x80,“8”
.dw 152 0x98,“9”
.dw 136 0x88,“A”
.dw 131 0x83,“B”
.dw 198 0xC6,“C”
.dw 161 0xA1,“D”
.dw 134 0x86,“E”
.dw 142 0x8E,“F”
.dw 255 0xFF,“8.”
_delay_1ms: 延時子程
ldi R16,1
ldi R17,0
L3:
subi R16,255 加1操作
sbci R17,255
cpi R16,232 0xE8
ldi R30,3 0x3E8 = 1000
cpc R17,R30
brlo L3 未達1000繼續
ret
_delay:
push r21
push r20
push r17 入口:r16,r17裝的是延時參數
push r16
movw R10,R16 將r16,r17的內容裝入r10,r11
clr R20
clr R21
L8:
rcall _delay_1ms
subi R20,255 加1操作
sbci R21,255
cp R20,R10 與指定延時參數比較
cpc R21,R11
brlo L8 未達指定延時參數繼續
pop r16
pop r17
pop r20
pop r21
ret
_led_display:
push R20 寄存器r20入棧,r20中帶入字符表的索引
ldi R24,2
mul R24,R20 將r20中的值乘2,結果在r0中
movw R30,R0 將r0的值賦給r30,作為偏移量
ldi R24,low(_tabs<<1) 獲取字符表基地址
ldi R25,high(_tabs<<1)
add R30,R24 偏移量+基地址構成z指針
adc R31,R25
lpm R20,Z+0 取字型送入r20 out 0x5,R20 字型送PortB,輸出 ldi R22,0 循環100次計數寄存器r22清零
L10:
ldi R20,1 r20用于8LED數碼管輸出位控制,初始為1
L12:
out 0x8,R20 將8LED數碼管位控制輸出到端口PortC ldi R16,10 延時參數低位
ldi R17,0 延時參數高位
rcall _delay 調延時子程
inc R20 移位r20,準備顯示另一位
cpi R20,3 判兩位是否顯示完
brlo L12 未顯示完兩位,繼續
inc R22 r22加1
cpi R22,100 判是否已計滿100 brlo L10 未計滿則繼續
pop R20 r20出棧 ret _main:
clr R20 初始化計數寄存器r20 rcall _port_init 初始化端口
L17:
cpi R20,16 比較循環計數
brne L21 未顯示完16個字符繼續
clr R20 從新開始
L21:
rcall _led_display 顯示字符
inc R20 計數值加1
rjmp L17 返回
ret
總結
以上是生活随笔為你收集整理的avr单片机led数码管六位动态显示时分秒c语言程序,AVR单片机控制8段LED数码管同时显示 - AVR单片机8位数码管显示的程序实现(两种方法介绍)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易语言mysql乱码_分享一个解决MyS
- 下一篇: sendencpac文件能删吗_“手机刷