📄 display_led.lst
字号:
_switch_hang:
byTemp --> R20
hang --> R16
0195 D070 RCALL push_gset1
(0139) }
(0140) }
(0141) /************************************************
(0142) 函 数 名: switch_hang ()
(0143) 功 能: 选行操作,控制138的输入
(0144) 输入参数: /
(0145) 输出参数: /
(0146) 描 述: /
(0147) ***********************************************/
(0148) void switch_hang (uchar hang) //选行操作
(0149) {
(0150) uchar byTemp;
(0151) byTemp = PORTD & 0xF0;
0196 B342 IN R20,0x12
0197 7F40 ANDI R20,0xF0
(0152) if (hang < 8)
0198 3008 CPI R16,0x8
0199 F428 BCC 0x019F
(0153) {
(0154) PORTD = byTemp + 0x08 + hang; //D=1
019A 2F84 MOV R24,R20
019B 5F88 SUBI R24,0xF8
019C 0F80 ADD R24,R16
019D BB82 OUT 0x12,R24
(0155) }
019E C004 RJMP 0x01A3
(0156) else
(0157) {
(0158) PORTD = byTemp + hang - 0x08; //D=0
019F 2F84 MOV R24,R20
01A0 0F80 ADD R24,R16
01A1 5088 SUBI R24,0x8
01A2 BB82 OUT 0x12,R24
(0159) }
01A3 D065 RCALL pop_gset1
01A4 9508 RET
_Display:
i --> R20
mov_no --> R22
01A5 D05E RCALL push_gset2
01A6 01B8 MOVW R22,R16
(0160) }
(0161) /************************************************
(0162) 函 数 名: Display()
(0163) 功 能: 动态扫描LED显示函数
(0164) 输入参数: /
(0165) 输出参数: /
(0166) 描 述: 共16行,每行连续送4个字节的数据,两个字节为第2个汉字,后两个为第1个汉字。
(0167) ***********************************************/
(0168) void Display (uint mov_no) //动态显示函数
(0169) {
(0170) uchar i;
(0171) for(i=0;i<8;i++) //上面8行
01A7 2744 CLR R20
01A8 C015 RJMP 0x01BE
(0172) {
(0173) PORTD |= (1<<PD7); //OE=1,关闭输出,消隐
01A9 9A97 SBI 0x12,7
(0174) switch_hang (i); //选行操作
01AA 2F04 MOV R16,R20
01AB DFE9 RCALL _switch_hang
(0175)
(0176) InputByte ((mov_no+mov_no),(0b10000000>>i)); //起始列和需要送显示的行
01AC 2F24 MOV R18,R20
01AD 2733 CLR R19
01AE E800 LDI R16,0x80
01AF E010 LDI R17,0
01B0 D044 RCALL asr16
01B1 2F20 MOV R18,R16
01B2 018B MOVW R16,R22
01B3 0F06 ADD R16,R22
01B4 1F17 ADC R17,R23
01B5 DFC2 RCALL _InputByte
(0177)
(0178) PORTD |= (1<<PD5); //RCLK=1,并行输出锁存器
01B6 9A95 SBI 0x12,5
(0179) NOP();
01B7 0000 NOP
(0180) PORTD &= ~(1<<PD5); //RCLK=0
01B8 9895 CBI 0x12,5
(0181) //DelaymS(1); //消隐的时间,调节亮度用
(0182) PORTD &= ~(1<<PD7); //OE=0,数据输出
01B9 9897 CBI 0x12,7
(0183) DelaymS(2); //行显示的时间
01BA E002 LDI R16,2
01BB E010 LDI R17,0
01BC DFA8 RCALL _DelaymS
01BD 9543 INC R20
01BE 3048 CPI R20,0x8
01BF F348 BCS 0x01A9
(0184) }
(0185) for(i=0;i<8;i++) //下面8行
01C0 2744 CLR R20
01C1 C018 RJMP 0x01DA
(0186) {
(0187) PORTD |= (1<<PD7); //OE=1,关闭输出,消隐
01C2 9A97 SBI 0x12,7
(0188) switch_hang (i+7); //选行操作
01C3 2F04 MOV R16,R20
01C4 5F09 SUBI R16,0xF9
01C5 DFCF RCALL _switch_hang
(0189)
(0190) InputByte ((mov_no+mov_no+1),(0b10000000>>i)); //起始列和需要送显示的行
01C6 2F24 MOV R18,R20
01C7 2733 CLR R19
01C8 E800 LDI R16,0x80
01C9 E010 LDI R17,0
01CA D02A RCALL asr16
01CB 2F20 MOV R18,R16
01CC 018B MOVW R16,R22
01CD 0F06 ADD R16,R22
01CE 1F17 ADC R17,R23
01CF 5F0F SUBI R16,0xFF
01D0 4F1F SBCI R17,0xFF
01D1 DFA6 RCALL _InputByte
(0191)
(0192) PORTD |= (1<<PD5); //RCLK=1,并行输出锁存器
01D2 9A95 SBI 0x12,5
(0193) NOP();
01D3 0000 NOP
(0194) PORTD &= ~(1<<PD5); //RCLK=0
01D4 9895 CBI 0x12,5
(0195) //DelaymS(1); //消隐的时间,调节亮度用
(0196) PORTD &= ~(1<<PD7); //OE=0,数据输出
01D5 9897 CBI 0x12,7
(0197) DelaymS(2); //行显示的时间
01D6 E002 LDI R16,2
01D7 E010 LDI R17,0
01D8 DF8C RCALL _DelaymS
01D9 9543 INC R20
01DA 3048 CPI R20,0x8
01DB F330 BCS 0x01C2
01DC D01F RCALL pop_gset2
01DD 9508 RET
(0198) }
(0199) }
(0200) //*****************主程序**********************************
(0201) void main (void)
(0202) {
(0203) uint i;
(0204) uchar j;
(0205) DelaymS(100);
_main:
i --> R20
j --> R22
01DE E604 LDI R16,0x64
01DF E010 LDI R17,0
01E0 DF84 RCALL _DelaymS
(0206) Init_Port(); //初始化
01E1 DF91 RCALL _Init_Port
01E2 C010 RJMP 0x01F3
(0207)
(0208) while (1)
(0209)
(0210) for (i=0;i<272;i++)
01E3 2744 CLR R20
01E4 2755 CLR R21
01E5 C009 RJMP 0x01EF
(0211) {
(0212) for (j=0;j<7;j++) //移动的速度
01E6 2766 CLR R22
01E7 C003 RJMP 0x01EB
(0213) Display (i); //动态显示函数
FILE: <library>
01E8 018A MOVW R16,R20
01E9 DFBB RCALL _Display
01EA 9563 INC R22
01EB 3067 CPI R22,7
01EC F3D8 BCS 0x01E8
01ED 5F4F SUBI R20,0xFF
01EE 4F5F SBCI R21,0xFF
01EF 3140 CPI R20,0x10
01F0 E0E1 LDI R30,1
01F1 075E CPC R21,R30
01F2 F398 BCS 0x01E6
01F3 CFEF RJMP 0x01E3
01F4 9508 RET
asr16:
01F5 2322 TST R18
01F6 F021 BEQ 0x01FB
01F7 9515 ASR R17
01F8 9507 ROR R16
01F9 952A DEC R18
01FA CFFA RJMP asr16
01FB 9508 RET
pop_gset2:
01FC E0E2 LDI R30,2
01FD C00C RJMP pop
push_gset5:
01FE 92FA ST R15,-Y
01FF 92EA ST R14,-Y
push_gset4:
0200 92DA ST R13,-Y
0201 92CA ST R12,-Y
push_gset3:
0202 92BA ST R11,-Y
0203 92AA ST R10,-Y
push_gset2:
0204 937A ST R23,-Y
0205 936A ST R22,-Y
push_gset1:
0206 935A ST R21,-Y
0207 934A ST R20,-Y
0208 9508 RET
pop_gset1:
0209 E0E1 LDI R30,1
pop:
020A 9149 LD R20,Y+
020B 9159 LD R21,Y+
020C FDE0 SBRC R30,0
020D 9508 RET
020E 9169 LD R22,Y+
020F 9179 LD R23,Y+
0210 FDE1 SBRC R30,1
0211 9508 RET
0212 90A9 LD R10,Y+
0213 90B9 LD R11,Y+
0214 FDE2 SBRC R30,2
0215 9508 RET
0216 90C9 LD R12,Y+
0217 90D9 LD R13,Y+
0218 FDE3 SBRC R30,3
0219 9508 RET
021A 90E9 LD R14,Y+
021B 90F9 LD R15,Y+
021C 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -