📄 7281.lis
字号:
00EC ;
00EC ; CLR(BC7281_PORT,CLK_7281);//delay_7281(US); //产生一个周期为20US的脉冲
00EC ; SET(BC7281_PORT,CLK_7281);
00EC ;
00EC ; delay_7281(2*US);
00EC ; }
00EC ;
00EC ; //CLR(BC7281_PORT,CLK_7281);
00EC ; // SET(BC7281_PORT,CLK_7281);
00EC ;
00EC ; SET(BC7281_PORT,DAT_7281);
00EC DE9A sbi 0x1b,6
00EE .dbline 118
00EE ;
00EE ; delay_7281(6*US);
00EE 0CE0 ldi R16,12
00F0 10E0 ldi R17,0
00F2 60D0 xcall _delay_7281
00F4 .dbline -2
00F4 L11:
00F4 0E940000 xcall pop_gset2
00F8 .dbline 0 ; func end
00F8 0895 ret
00FA .dbsym r bit_counter 20 c
00FA .dbsym r send_byte 22 c
00FA .dbend
00FA .dbfunc e receive_byte _receive_byte fc
00FA ; bit_counter -> R20
00FA ; in_byte -> R22
.even
00FA _receive_byte::
00FA 0E940000 xcall push_gset2
00FE .dbline -1
00FE .dbline 127
00FE ; }
00FE ;
00FE ;
00FE ;
00FE ;
00FE ;
00FE ;
00FE ; unsigned char receive_byte(void)
00FE ; {
00FE .dbline 129
00FE ; unsigned char bit_counter, in_byte; //产生一个脉冲
00FE ; SET(BC7281_PORT,DAT_7281);delay_7281(US); //为高电平
00FE DE9A sbi 0x1b,6
0100 .dbline 129
0100 02E0 ldi R16,2
0102 10E0 ldi R17,0
0104 57D0 xcall _delay_7281
0106 .dbline 130
0106 ; SET(BC7281_PORT,CLK_7281);delay_7281(US); //为高电平
0106 DF9A sbi 0x1b,7
0108 .dbline 130
0108 02E0 ldi R16,2
010A 10E0 ldi R17,0
010C 53D0 xcall _delay_7281
010E .dbline 131
010E ; SET(BC7281_DDR,CLK_7281); //CLK为输出,PB1内部上拉有效
010E D79A sbi 0x1a,7
0110 .dbline 132
0110 ; CLR(BC7281_DDR,DAT_7281); //DAT为输入
0110 D698 cbi 0x1a,6
0112 .dbline 133
0112 ; CLR(BC7281_PORT,CLK_7281); delay_7281(US);
0112 DF98 cbi 0x1b,7
0114 .dbline 133
0114 02E0 ldi R16,2
0116 10E0 ldi R17,0
0118 4DD0 xcall _delay_7281
011A .dbline 134
011A ; SET(BC7281_PORT,CLK_7281);delay_7281(US);
011A DF9A sbi 0x1b,7
011C .dbline 134
011C 02E0 ldi R16,2
011E 10E0 ldi R17,0
0120 49D0 xcall _delay_7281
0122 L25:
0122 .dbline 135
0122 .dbline 135
0122 L26:
0122 .dbline 135
0122 ; while (RDAT_7281){}; //等待数据线变为低电平
0122 D698 cbi 0x1a,6
0124 29B2 in R2,0x19
0126 3324 clr R3
0128 26FC sbrc R2,6
012A FBCF rjmp L25
012C .dbline 135
012C .dbline 136
012C ; CLR(BC7281_PORT,CLK_7281); delay_7281(US);
012C DF98 cbi 0x1b,7
012E .dbline 136
012E 02E0 ldi R16,2
0130 10E0 ldi R17,0
0132 40D0 xcall _delay_7281
0134 .dbline 137
0134 ; SET(BC7281_PORT,CLK_7281);delay_7281(US);
0134 DF9A sbi 0x1b,7
0136 .dbline 137
0136 02E0 ldi R16,2
0138 10E0 ldi R17,0
013A 3CD0 xcall _delay_7281
013C .dbline 138
013C ; for (bit_counter=0;bit_counter<8;bit_counter++) //接收八位数据
013C 4427 clr R20
013E 15C0 xjmp L31
0140 L28:
0140 .dbline 139
0140 ; {
0140 .dbline 140
0140 ; delay_7281(2*US);
0140 04E0 ldi R16,4
0142 10E0 ldi R17,0
0144 37D0 xcall _delay_7281
0146 .dbline 141
0146 ; in_byte=in_byte*2;
0146 82E0 ldi R24,2
0148 869F mul R24,R22
014A 602D mov R22,R0
014C .dbline 142
014C ; if (RDAT_7281) {in_byte=in_byte|0x01; }
014C D698 cbi 0x1a,6
014E 89B3 in R24,0x19
0150 8074 andi R24,64
0152 8034 cpi R24,64
0154 09F4 brne L32
0156 .dbline 142
0156 .dbline 142
0156 6160 ori R22,1
0158 .dbline 142
0158 L32:
0158 .dbline 143
0158 DF98 cbi 0x1b,7
015A .dbline 143
015A 02E0 ldi R16,2
015C 10E0 ldi R17,0
015E 2AD0 xcall _delay_7281
0160 .dbline 144
0160 DF9A sbi 0x1b,7
0162 .dbline 144
0162 02E0 ldi R16,2
0164 10E0 ldi R17,0
0166 26D0 xcall _delay_7281
0168 .dbline 145
0168 L29:
0168 .dbline 138
0168 4395 inc R20
016A L31:
016A .dbline 138
016A 4830 cpi R20,8
016C 48F3 brlo L28
016E .dbline 146
016E ; CLR(BC7281_PORT,CLK_7281); delay_7281(US);
016E ; SET(BC7281_PORT,CLK_7281);delay_7281(US);
016E ; }
016E ; delay_7281(2*US);
016E 04E0 ldi R16,4
0170 10E0 ldi R17,0
0172 20D0 xcall _delay_7281
0174 .dbline 147
0174 ; return(in_byte); /////////键盘返回值
0174 062F mov R16,R22
0176 .dbline -2
0176 L24:
0176 0E940000 xcall pop_gset2
017A .dbline 0 ; func end
017A 0895 ret
017C .dbsym r bit_counter 20 c
017C .dbsym r in_byte 22 c
017C .dbend
017C .dbfunc e write728x _write728x fV
017C ; write_data -> R20
017C ; reg_add -> R22
.even
017C _write728x::
017C 0E940000 xcall push_gset2
0180 422F mov R20,R18
0182 602F mov R22,R16
0184 .dbline -1
0184 .dbline 150
0184 ; }
0184 ; void write728x(unsigned char reg_add, unsigned char write_data)
0184 ; {
0184 .dbline 151
0184 ; send_byte(reg_add);
0184 062F mov R16,R22
0186 76DF xcall _send_byte
0188 .dbline 152
0188 ; send_byte(write_data);
0188 042F mov R16,R20
018A 74DF xcall _send_byte
018C .dbline -2
018C L34:
018C 0E940000 xcall pop_gset2
0190 .dbline 0 ; func end
0190 0895 ret
0192 .dbsym r write_data 20 c
0192 .dbsym r reg_add 22 c
0192 .dbend
0192 .dbfunc e read728x _read728x fc
0192 ; reg_add -> R20
.even
0192 _read728x::
0192 0E940000 xcall push_gset1
0196 402F mov R20,R16
0198 .dbline -1
0198 .dbline 155
0198 ; }
0198 ; unsigned char read728x(unsigned char reg_add)
0198 ; {
0198 .dbline 156
0198 ; send_byte(reg_add|0x80);
0198 042F mov R16,R20
019A 0068 ori R16,128
019C 6BDF xcall _send_byte
019E .dbline 157
019E ; return(receive_byte());
019E ADDF xcall _receive_byte
01A0 .dbline -2
01A0 L35:
01A0 0E940000 xcall pop_gset1
01A4 .dbline 0 ; func end
01A4 0895 ret
01A6 .dbsym r reg_add 20 c
01A6 .dbend
01A6 .dbfunc e BC7281_init _BC7281_init fV
.even
01A6 _BC7281_init::
01A6 .dbline -1
01A6 .dbline 176
01A6 ; }
01A6 ;
01A6 ;
01A6 ;
01A6 ;
01A6 ;
01A6 ;
01A6 ; /*#pragma interrupt_handler int1:3 //声明_int0( )为中断处理
01A6 ; while(RDAT_7281==0){}; //如果数据线为高电平则BC7281空闲
01A6 ; key_number=read728x(0x13);
01A6 ; write728x(0x15,(key_number&0xf0)/16); //在第0位以HEX方式显示键码的低四位
01A6 ; write728x(0x15,0x10+(key_number&0x0f)); //在第1位以HEX方式显示键码的高四位
01A6 ; }
01A6 ; */
01A6 ;
01A6 ;
01A6 ;
01A6 ; void BC7281_init(void)
01A6 ; {
01A6 .dbline 178
01A6 ;
01A6 ; delay_7281(2*US);
01A6 04E0 ldi R16,4
01A8 10E0 ldi R17,0
01AA 04D0 xcall _delay_7281
01AC .dbline 179
01AC ; write728x(0x12,0x80); //写控制寄存器。开扫描,CPU未读数据时只有第一个按键有效
01AC 20E8 ldi R18,128
01AE 02E1 ldi R16,18
01B0 E5DF xcall _write728x
01B2 .dbline -2
01B2 L36:
01B2 .dbline 0 ; func end
01B2 0895 ret
01B4 .dbend
01B4 .dbfunc e delay_7281 _delay_7281 fV
01B4 ; dt -> R16,R17
.even
01B4 _delay_7281::
01B4 .dbline -1
01B4 .dbline 199
01B4 ; // CLR(DDRD,3); //PD2口输出无效
01B4 ; // SET(PORTD,3);
01B4 ; //SET(BC7281_PORT,CLK_7281); //IO上拉有效
01B4 ; //SET(BC7281_PORT,DAT_7281);
01B4 ; // CLR(BC7281_DDR,CLK_7281);
01B4 ; //CLR(BC7281_DDR,DAT_7281);
01B4 ; // SET(MCUCR,ISC11); //INT1 的产生异步中断请求
01B4 ; //CLR(MCUCR,ISC10);
01B4 ; // SET(GICR,INT1); //开INT1中断
01B4 ; // SREG=SREG|0x80; //开全
01B4 ; // while(1){}
01B4 ; }
01B4 ;
01B4 ;
01B4 ;
01B4 ;
01B4 ;
01B4 ;
01B4 ; void delay_7281(unsigned int dt)//延时(dt+2)us (晶振为4MHZ)P195
01B4 ; {
01B4 .dbline 200
01B4 02C0 xjmp L41
01B6 L38:
01B6 .dbline 200
01B6 .dbline 200
01B6 L39:
01B6 .dbline 200
01B6 0150 subi R16,1
01B8 1040 sbci R17,0
01BA L41:
01BA .dbline 200
01BA ; for(;dt>0;--dt){};
01BA 0030 cpi R16,0
01BC 0107 cpc R16,R17
01BE D9F7 brne L38
01C0 X1:
01C0 .dbline 200
01C0 .dbline -2
01C0 L37:
01C0 .dbline 0 ; func end
01C0 0895 ret
01C2 .dbsym r dt 16 i
01C2 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -