;; 7セグメントLED八の字回転点灯+"1234567890" ;; "0"までいったら表示順を逆転する ;; 表示はダイナミック表示 ;; ;*************************************************************** ;*  デバイスの定義ファイルのインクルード * ;*************************************************************** ; .include "m88def.inc" ; ;*************************************************************** ;*    レジスターにシンボル名を定義    * ;*************************************************************** ; .def d_data =r0 .def temp =r16 .def cnt1 =r17 .def cnt2 =r18 .def cnt0 =r19 .def fb_flag =r20 .def dcnt =r21 .def LED0 =r22 .def LED1 =r23 ; ; ;*************************************************************** ;*    7seg-LED表示用データを定義     * ;*************************************************************** ; ; 7segment-LED .equ seg_a = 0b11110111 .equ seg_b = 0b11011111 .equ seg_c = 0b11111011 .equ seg_d = 0b10111111 .equ seg_e = 0b11111110 .equ seg_f = 0b11111101 .equ seg_g = 0b11101111 ; .equ degR0 = seg_a & seg_b & seg_c & seg_d & seg_e & seg_f .equ degR1 = seg_b & seg_c .equ degR2 = seg_a & seg_b & seg_d & seg_e & seg_g .equ degR3 = seg_a & seg_b & seg_c & seg_d & seg_g .equ degR4 = seg_b & seg_c & seg_f & seg_g .equ degR5 = seg_a & seg_c & seg_d & seg_f & seg_g .equ degR6 = seg_a & seg_c & seg_d & seg_e & seg_f & seg_g .equ degR7 = seg_a & seg_b & seg_c .equ degR8 = seg_a & seg_b & seg_c & seg_d & seg_e & seg_f & seg_g .equ degR9 = seg_a & seg_b & seg_c & seg_f & seg_g ; .equ degL0 = seg_a & seg_b & seg_c & seg_d & seg_e & seg_f .equ degL1 = seg_e & seg_f .equ degL2 = seg_a & seg_c & seg_d & seg_f & seg_g .equ degL3 = seg_a & seg_d & seg_e & seg_f & seg_g .equ degL4 = seg_b & seg_e & seg_f & seg_g .equ degL5 = seg_a & seg_b & seg_d & seg_e & seg_g .equ degL6 = seg_a & seg_c & seg_d & seg_e & seg_b & seg_g .equ degL7 = seg_a & seg_e & seg_f .equ degL8 = seg_a & seg_b & seg_c & seg_d & seg_e & seg_f & seg_g .equ degL9 = seg_a & seg_b & seg_e & seg_f & seg_g ; ; .equ n_data=18 ; n_data=データの個数 .equ on_time=5 ; LEDをONにする割合(on_time/10) ; ; ;*************************************************************** ;* ベクトルエリア * ;*************************************************************** .cseg ; プログラムエリア開始 rjmp reset ; reset vector reti ; INT0 vector reti ; INT1 vector reti ; PCINT0 reti ; PCINT1 reti ; PCINT2 reti ; WDT reti ; Timer2 COMPA reti ; Timer2 COMPB reti ; Timer2 overflow reti ; Timer1 capture reti ; Timer1 COMPA reti ; Timer1 COMPB reti ; Timer1 overflow reti ; Timer0 COMPA reti ; Timer0 COMPB reti ; Timer0 overflow reti ; SPI STC reti ; USART/Rx complete reti ; USART/ Data register empty reti ; USART/Tx complete reti ; ADC reti ; EEPROM EE_RDY reti ; Analog comparator reti ; TWI reti ; SPM_RDY ; ; ;*************************************************************** ;* リセットルーチン             * ;*************************************************************** reset: ldi temp,high(RAMEND) out SPH,temp ; set stuck pointer ldi temp,low(RAMEND) out SPL,temp ; set stuck pointer ldi temp,$F0 out DDRD,temp ; set portD to output ldi temp,$FF out DDRB,temp ; set portD to output out DDRC,temp ; PC0-PC5 output out PORTC,temp ; PC0-PC5 = 1, LED off ldi fb_flag,1 ; ; ;*************************************************************** ;* メインプログラム * ;* * ;* 500 m 秒 間隔で表示を切り換える * ;* * ;*************************************************************** ; main: ldi XH,high(led_dataR*2) ;1桁目表示データアドレスHigh ldi XL,low(led_dataR*2) ;1桁目表示データアドレスLow ldi YH,high(led_dataL*2) ;2桁目表示データアドレスHigh ldi YL,low(led_dataL*2) ;2桁目表示データアドレスLow ; loop_1: ldi dcnt,50 movw ZL,XL lpm ; Zレジスターの示すFlashメモリー上のデータをロード mov LED0,d_data ; 1桁目データ movw ZL,YL lpm mov LED1,d_data loop_2: out PORTB,LED0 ; 1桁目表示データ sbi PORTC,1 cbi PORTC,0 ldi cnt0,on_time ; on_time delay rcall delay1x ; 1*x msec delay ; out PORTB,LED1 ; 2桁目表示データ sbi PORTC,0 cbi PORTC,1 ldi cnt0,on_time ; on_time delay rcall delay1x dec dcnt brne loop_2 ; ; 表示データ・ポインタの変更 ; and fb_flag,fb_flag ; sbis fb_flag,0 breq loop_rev ; rjmp loop_rev adiw XL,1 ; 前進表示 adiw YL,1 cpi XL,low(led_dataL*2) ; cpi XL,low(led_dataR*2)+n_data brne loop_1 loop_rev: ;後退表示 ldi fb_flag,0 sbiw XL,1 sbiw YL,1 cpi XL,low(led_dataR*2)-1 brne loop_1 ldi fb_flag,1 ; rjmp main ; ; ;*************************************************************** ;* 1 * cn0 m sec. ディレイ ルーチン * ;* * ;* dl2: 5 clock * 200回 - 1 = 999 clock * ;* dl1: (dl2 + 4 clock) * 8 回 - 1 + 5 + 3 = 8,031 clock * ;* * ;*************************************************************** ; ; delay1x: ;1*x msec delay (x=cnt0) ldi cnt1,8 dlx1: ldi cnt2,200 dlx2: nop nop dec cnt2 brne dlx2 dec cnt1 brne dlx1 dec cnt0 brne delay1x ret ; ; ;*************************************************************** ;*  表示データを書き込む   * ;* データはワード単位(偶数個)が良い  * ;*************************************************************** ; ; led_dataR: .db seg_a,seg_f,seg_g,seg_c,seg_d,seg_e,seg_g,seg_b .db degR1,degR2,degR3,degR4,degR5,degR6,degR7,degR8,degR9,degR0 led_dataL: .db seg_a,seg_b,seg_g,seg_e,seg_d,seg_c,seg_g,seg_f .db degL1,degL2,degL3,degL4,degL5,degL6,degL7,degL8,degL9,degL0