📄 7281.lst
字号:
(0107) CLR(BC7281_PORT,CLK_7281);//delay_7281(US); //产生一个周期为20US的脉冲
00B9 98DF CBI 0x1B,7
(0108) SET(BC7281_PORT,CLK_7281);
00BA 9ADF SBI 0x1B,7
(0109)
(0110) delay_7281(2*US);
00BB E004 LDI R16,4
00BC E010 LDI R17,0
00BD D067 RCALL _delay_7281
00BE 9543 INC R20
00BF 3048 CPI R20,0x8
00C0 F368 BCS 0x00AE
(0111) }
(0112)
(0113) //CLR(BC7281_PORT,CLK_7281);
(0114) // SET(BC7281_PORT,CLK_7281);
(0115)
(0116) SET(BC7281_PORT,DAT_7281);
00C1 9ADE SBI 0x1B,6
(0117)
(0118) delay_7281(6*US);
00C2 E00C LDI R16,0xC
00C3 E010 LDI R17,0
00C4 D060 RCALL _delay_7281
00C5 940E012C CALL pop_gset2
00C7 9508 RET
_receive_byte:
bit_counter --> R20
in_byte --> R22
00C8 940E0135 CALL push_gset2
(0119) }
(0120)
(0121)
(0122)
(0123)
(0124)
(0125)
(0126) unsigned char receive_byte(void)
(0127) {
(0128) unsigned char bit_counter, in_byte; //产生一个脉冲
(0129) SET(BC7281_PORT,DAT_7281);delay_7281(US); //为高电平
00CA 9ADE SBI 0x1B,6
00CB E002 LDI R16,2
00CC E010 LDI R17,0
00CD D057 RCALL _delay_7281
(0130) SET(BC7281_PORT,CLK_7281);delay_7281(US); //为高电平
00CE 9ADF SBI 0x1B,7
00CF E002 LDI R16,2
00D0 E010 LDI R17,0
00D1 D053 RCALL _delay_7281
(0131) SET(BC7281_DDR,CLK_7281); //CLK为输出,PB1内部上拉有效
00D2 9AD7 SBI 0x1A,7
(0132) CLR(BC7281_DDR,DAT_7281); //DAT为输入
00D3 98D6 CBI 0x1A,6
(0133) CLR(BC7281_PORT,CLK_7281); delay_7281(US);
00D4 98DF CBI 0x1B,7
00D5 E002 LDI R16,2
00D6 E010 LDI R17,0
00D7 D04D RCALL _delay_7281
(0134) SET(BC7281_PORT,CLK_7281);delay_7281(US);
00D8 9ADF SBI 0x1B,7
00D9 E002 LDI R16,2
00DA E010 LDI R17,0
00DB D049 RCALL _delay_7281
(0135) while (RDAT_7281){}; //等待数据线变为低电平
00DC 98D6 CBI 0x1A,6
00DD B229 IN R2,0x19
00DE 2433 CLR R3
00DF FC26 SBRC R2,6
00E0 CFFB RJMP 0x00DC
(0136) CLR(BC7281_PORT,CLK_7281); delay_7281(US);
00E1 98DF CBI 0x1B,7
00E2 E002 LDI R16,2
00E3 E010 LDI R17,0
00E4 D040 RCALL _delay_7281
(0137) SET(BC7281_PORT,CLK_7281);delay_7281(US);
00E5 9ADF SBI 0x1B,7
00E6 E002 LDI R16,2
00E7 E010 LDI R17,0
00E8 D03C RCALL _delay_7281
(0138) for (bit_counter=0;bit_counter<8;bit_counter++) //接收八位数据
00E9 2744 CLR R20
00EA C015 RJMP 0x0100
(0139) {
(0140) delay_7281(2*US);
00EB E004 LDI R16,4
00EC E010 LDI R17,0
00ED D037 RCALL _delay_7281
(0141) in_byte=in_byte*2;
00EE E082 LDI R24,2
00EF 9F86 MUL R24,R22
00F0 2D60 MOV R22,R0
(0142) if (RDAT_7281) {in_byte=in_byte|0x01; }
00F1 98D6 CBI 0x1A,6
00F2 B389 IN R24,0x19
00F3 7480 ANDI R24,0x40
00F4 3480 CPI R24,0x40
00F5 F409 BNE 0x00F7
00F6 6061 ORI R22,1
(0143) CLR(BC7281_PORT,CLK_7281); delay_7281(US);
00F7 98DF CBI 0x1B,7
00F8 E002 LDI R16,2
00F9 E010 LDI R17,0
00FA D02A RCALL _delay_7281
(0144) SET(BC7281_PORT,CLK_7281);delay_7281(US);
00FB 9ADF SBI 0x1B,7
00FC E002 LDI R16,2
00FD E010 LDI R17,0
00FE D026 RCALL _delay_7281
00FF 9543 INC R20
0100 3048 CPI R20,0x8
0101 F348 BCS 0x00EB
(0145) }
(0146) delay_7281(2*US);
0102 E004 LDI R16,4
0103 E010 LDI R17,0
0104 D020 RCALL _delay_7281
(0147) return(in_byte); /////////键盘返回值
0105 2F06 MOV R16,R22
0106 940E012C CALL pop_gset2
0108 9508 RET
_write728x:
write_data --> R20
reg_add --> R22
0109 940E0135 CALL push_gset2
010B 2F42 MOV R20,R18
010C 2F60 MOV R22,R16
(0148) }
(0149) void write728x(unsigned char reg_add, unsigned char write_data)
(0150) {
(0151) send_byte(reg_add);
010D 2F06 MOV R16,R22
010E DF76 RCALL _send_byte
(0152) send_byte(write_data);
010F 2F04 MOV R16,R20
0110 DF74 RCALL _send_byte
0111 940E012C CALL pop_gset2
0113 9508 RET
_read728x:
reg_add --> R20
0114 940E0137 CALL push_gset1
0116 2F40 MOV R20,R16
(0153) }
(0154) unsigned char read728x(unsigned char reg_add)
(0155) {
(0156) send_byte(reg_add|0x80);
0117 2F04 MOV R16,R20
0118 6800 ORI R16,0x80
0119 DF6B RCALL _send_byte
(0157) return(receive_byte());
011A DFAD RCALL _receive_byte
011B 940E013A CALL pop_gset1
011D 9508 RET
(0158) }
(0159)
(0160)
(0161)
(0162)
(0163)
(0164)
(0165) /*#pragma interrupt_handler int1:3 //声明_int0( )为中断处理
(0166) while(RDAT_7281==0){}; //如果数据线为高电平则BC7281空闲
(0167) key_number=read728x(0x13);
(0168) write728x(0x15,(key_number&0xf0)/16); //在第0位以HEX方式显示键码的低四位
(0169) write728x(0x15,0x10+(key_number&0x0f)); //在第1位以HEX方式显示键码的高四位
(0170) }
(0171) */
(0172)
(0173)
(0174)
(0175) void BC7281_init(void)
(0176) {
(0177)
(0178) delay_7281(2*US);
_BC7281_init:
011E E004 LDI R16,4
011F E010 LDI R17,0
0120 D004 RCALL _delay_7281
(0179) write728x(0x12,0x80); //写控制寄存器。开扫描,CPU未读数据时只有第一个按键有效
0121 E820 LDI R18,0x80
0122 E102 LDI R16,0x12
0123 DFE5 RCALL _write728x
0124 9508 RET
(0180) // CLR(DDRD,3); //PD2口输出无效
(0181) // SET(PORTD,3);
(0182) //SET(BC7281_PORT,CLK_7281); //IO上拉有效
(0183) //SET(BC7281_PORT,DAT_7281);
(0184) // CLR(BC7281_DDR,CLK_7281);
(0185) //CLR(BC7281_DDR,DAT_7281);
(0186) // SET(MCUCR,ISC11); //INT1 的产生异步中断请求
(0187) //CLR(MCUCR,ISC10);
(0188) // SET(GICR,INT1); //开INT1中断
(0189) // SREG=SREG|0x80; //开全
(0190) // while(1){}
(0191) }
(0192)
(0193)
(0194)
(0195)
(0196)
(0197)
(0198) void delay_7281(unsigned int dt)//延时(dt+2)us (晶振为4MHZ)P195
(0199) {
(0200) for(;dt>0;--dt){};
FILE: <library>
_delay_7281:
dt --> R16
0125 C002 RJMP 0x0128
0126 5001 SUBI R16,1
0127 4010 SBCI R17,0
0128 3000 CPI R16,0
0129 0701 CPC R16,R17
012A F7D9 BNE 0x0126
012B 9508 RET
pop_gset2:
012C E0E2 LDI R30,2
012D 940C013B JMP pop
push_gset5:
012F 92FA ST R15,-Y
0130 92EA ST R14,-Y
push_gset4:
0131 92DA ST R13,-Y
0132 92CA ST R12,-Y
push_gset3:
0133 92BA ST R11,-Y
0134 92AA ST R10,-Y
push_gset2:
0135 937A ST R23,-Y
0136 936A ST R22,-Y
push_gset1:
0137 935A ST R21,-Y
0138 934A ST R20,-Y
0139 9508 RET
pop_gset1:
013A E0E1 LDI R30,1
pop:
013B 9149 LD R20,Y+
013C 9159 LD R21,Y+
013D FDE0 SBRC R30,0
013E 9508 RET
013F 9169 LD R22,Y+
0140 9179 LD R23,Y+
0141 FDE1 SBRC R30,1
0142 9508 RET
0143 90A9 LD R10,Y+
0144 90B9 LD R11,Y+
0145 FDE2 SBRC R30,2
0146 9508 RET
0147 90C9 LD R12,Y+
0148 90D9 LD R13,Y+
0149 FDE3 SBRC R30,3
014A 9508 RET
014B 90E9 LD R14,Y+
014C 90F9 LD R15,Y+
014D 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -