⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7281.lis

📁 基于ATmega16的BC7281键盘显示源码,拿过来就 可以用
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 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 + -