📄 display_led.s
字号:
; for (;i!=0;i--)
rjmp L5
L2:
.dbline 103
; {
.dbline 104
ldi R20,30
rjmp L9
L6:
.dbline 104
L7:
.dbline 104
dec R20
L9:
.dbline 104
tst R20
brne L6
.dbline 105
L3:
.dbline 102
subi R16,1
sbci R17,0
L5:
.dbline 102
cpi R16,0
cpc R16,R17
brne L2
X0:
.dbline -2
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r i 16 i
.dbend
.dbfunc e Init_Port _Init_Port fV
.even
_Init_Port::
.dbline -1
.dbline 115
; for (j=30;j!=0;j--);
; }
; }
; /************************************************
; 函 数 名: Init_port()
; 功 能: 单片机初始化函数
; 输入参数: /
; 输出参数: /
; 描 述: 相关口方向的设置等
; ***********************************************/
; void Init_Port(void)
; {
.dbline 116
; DDRD = 0xff; //PD口为推挽1输出
ldi R24,255
out 0x11,R24
.dbline 117
; PORTD = 0x00; //PD口初始值为0
clr R2
out 0x12,R2
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e InputByte _InputByte fV
; mid -> R20
; i -> R22
; hang_no -> R18
; lie_qishi -> R16,R17
.even
_InputByte::
rcall push_gset2
.dbline -1
.dbline 127
; }
; /************************************************
; 函 数 名: InputByte()
; 功 能: 串行写入32bit数据(一行)的函数
; 输入参数: lie_qishi(起始的列) ,hang_no(需要送第几行)
; 输出参数: /
; 描 述: DATA=PD4为数据端,SRCLK=PD6为时钟端,bit7在先,时钟上升沿写入。
; ***********************************************/
; void InputByte (uint lie_qishi,uchar hang_no)
; {
.dbline 129
; uchar i,mid;
; for(i=32;i>0;i--)
ldi R22,32
rjmp L15
L12:
.dbline 130
; {
.dbline 131
; mid = buf[lie_qishi +i+i] & hang_no; //操作的是hang_no位。
mov R2,R22
clr R3
movw R30,R16
add R30,R2
adc R31,R3
add R30,R2
adc R31,R3
ldi R24,<_buf
ldi R25,>_buf
add R30,R24
adc R31,R25
lpm R20,Z
and R20,R18
.dbline 132
; if(mid==0)
brne L16
.dbline 133
; PORTD |= (1<<PD4); //数据端输出0,共阳LED,所以取反码
sbi 0x12,4
rjmp L17
L16:
.dbline 135
; else
; PORTD &= ~(1<<PD4); //否则输出1
cbi 0x12,4
L17:
.dbline 136
sbi 0x12,6
.dbline 137
nop
.dbline 138
cbi 0x12,6
.dbline 139
L13:
.dbline 129
dec R22
L15:
.dbline 129
clr R2
cp R2,R22
brlo L12
.dbline -2
L11:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r mid 20 c
.dbsym r i 22 c
.dbsym r hang_no 18 c
.dbsym r lie_qishi 16 i
.dbend
.dbfunc e switch_hang _switch_hang fV
; byTemp -> R20
; hang -> R16
.even
_switch_hang::
rcall push_gset1
.dbline -1
.dbline 149
; PORTD |= (1<<PD6); //时钟置高,产生下降沿。
; NOP();
; PORTD &= ~(1<<PD6); //时钟置低
; }
; }
; /************************************************
; 函 数 名: switch_hang ()
; 功 能: 选行操作,控制138的输入
; 输入参数: /
; 输出参数: /
; 描 述: /
; ***********************************************/
; void switch_hang (uchar hang) //选行操作
; {
.dbline 151
; uchar byTemp;
; byTemp = PORTD & 0xF0;
in R20,0x12
andi R20,240
.dbline 152
; if (hang < 8)
cpi R16,8
brsh L19
.dbline 153
; {
.dbline 154
; PORTD = byTemp + 0x08 + hang; //D=1
mov R24,R20
subi R24,248 ; addi 8
add R24,R16
out 0x12,R24
.dbline 155
; }
rjmp L20
L19:
.dbline 157
.dbline 158
mov R24,R20
add R24,R16
subi R24,8
out 0x12,R24
.dbline 159
L20:
.dbline -2
L18:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r byTemp 20 c
.dbsym r hang 16 c
.dbend
.dbfunc e Display _Display fV
; i -> R20
; mov_no -> R22,R23
.even
_Display::
rcall push_gset2
movw R22,R16
.dbline -1
.dbline 169
; else
; {
; PORTD = byTemp + hang - 0x08; //D=0
; }
; }
; /************************************************
; 函 数 名: Display()
; 功 能: 动态扫描LED显示函数
; 输入参数: /
; 输出参数: /
; 描 述: 共16行,每行连续送4个字节的数据,两个字节为第2个汉字,后两个为第1个汉字。
; ***********************************************/
; void Display (uint mov_no) //动态显示函数
; {
.dbline 171
; uchar i;
; for(i=0;i<8;i++) //上面8行
clr R20
rjmp L25
L22:
.dbline 172
.dbline 173
sbi 0x12,7
.dbline 174
mov R16,R20
rcall _switch_hang
.dbline 176
mov R18,R20
clr R19
ldi R16,128
ldi R17,0
rcall asr16
mov R18,R16
movw R16,R22
add R16,R22
adc R17,R23
rcall _InputByte
.dbline 178
sbi 0x12,5
.dbline 179
nop
.dbline 180
cbi 0x12,5
.dbline 182
cbi 0x12,7
.dbline 183
ldi R16,2
ldi R17,0
rcall _DelaymS
.dbline 184
L23:
.dbline 171
inc R20
L25:
.dbline 171
cpi R20,8
brlo L22
.dbline 185
; {
; PORTD |= (1<<PD7); //OE=1,关闭输出,消隐
; switch_hang (i); //选行操作
;
; InputByte ((mov_no+mov_no),(0b10000000>>i)); //起始列和需要送显示的行
;
; PORTD |= (1<<PD5); //RCLK=1,并行输出锁存器
; NOP();
; PORTD &= ~(1<<PD5); //RCLK=0
; //DelaymS(1); //消隐的时间,调节亮度用
; PORTD &= ~(1<<PD7); //OE=0,数据输出
; DelaymS(2); //行显示的时间
; }
; for(i=0;i<8;i++) //下面8行
clr R20
rjmp L29
L26:
.dbline 186
.dbline 187
sbi 0x12,7
.dbline 188
mov R16,R20
subi R16,249 ; addi 7
rcall _switch_hang
.dbline 190
mov R18,R20
clr R19
ldi R16,128
ldi R17,0
rcall asr16
mov R18,R16
movw R16,R22
add R16,R22
adc R17,R23
subi R16,255 ; offset = 1
sbci R17,255
rcall _InputByte
.dbline 192
sbi 0x12,5
.dbline 193
nop
.dbline 194
cbi 0x12,5
.dbline 196
cbi 0x12,7
.dbline 197
ldi R16,2
ldi R17,0
rcall _DelaymS
.dbline 198
L27:
.dbline 185
inc R20
L29:
.dbline 185
cpi R20,8
brlo L26
.dbline -2
L21:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r mov_no 22 i
.dbend
.dbfunc e main _main fV
; i -> R20,R21
; j -> R22
.even
_main::
.dbline -1
.dbline 202
; {
; PORTD |= (1<<PD7); //OE=1,关闭输出,消隐
; switch_hang (i+7); //选行操作
;
; InputByte ((mov_no+mov_no+1),(0b10000000>>i)); //起始列和需要送显示的行
;
; PORTD |= (1<<PD5); //RCLK=1,并行输出锁存器
; NOP();
; PORTD &= ~(1<<PD5); //RCLK=0
; //DelaymS(1); //消隐的时间,调节亮度用
; PORTD &= ~(1<<PD7); //OE=0,数据输出
; DelaymS(2); //行显示的时间
; }
; }
; //*****************主程序**********************************
; void main (void)
; {
.dbline 205
; uint i;
; uchar j;
; DelaymS(100);
ldi R16,100
ldi R17,0
rcall _DelaymS
.dbline 206
; Init_Port(); //初始化
rcall _Init_Port
rjmp L32
L31:
.dbline 210
;
; while (1)
;
; for (i=0;i<272;i++)
clr R20
clr R21
rjmp L37
L34:
.dbline 211
; {
.dbline 212
; for (j=0;j<7;j++) //移动的速度
clr R22
rjmp L41
L38:
.dbline 213
movw R16,R20
rcall _Display
L39:
.dbline 212
inc R22
L41:
.dbline 212
cpi R22,7
brlo L38
.dbline 214
L35:
.dbline 210
subi R20,255 ; offset = 1
sbci R21,255
L37:
.dbline 210
cpi R20,16
ldi R30,1
cpc R21,R30
brlo L34
L32:
.dbline 208
rjmp L31
X1:
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -