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

📄 7281.lis

📁 基于ATmega16的BC7281键盘显示源码,拿过来就 可以用
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module _7281.C
                        .area text(rom, con, rel)
 0000                   .dbfile H:\bbi项目源程序\bc7281键盘显示\16键显\7281.C
 0000                   .dbfunc e main _main fV
 0000           ;     key_number -> R20
                        .even
 0000           _main::
 0000                   .dbline -1
 0000                   .dbline 21
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; 
 0000           ; #define MHZ 8
 0000           ; #define US MHZ/4    //以4MHZ为基本单位,典型延时时间为(dt+2)us(晶振为1MHZ)P195P195]。
 0000           ; #define SET(a,b) a|=(1<<b) 
 0000           ; #define CLR(a,b) a&=~(1<<b)
 0000           ; #define CPL(a,b) a^=(1<<b)
 0000           ; #define CHK(a,b) (a&(1<<b)==(1<<b))
 0000           ; #define BC7281_PORT      PORTA
 0000           ; #define BC7281_DDR               DDRA
 0000           ; #define BC7281_PIN               PINA
 0000           ; #define INT_7281  2
 0000           ; #define DAT_7281                 6
 0000           ; #define CLK_7281                 7
 0000           ; #define RDAT_7281 (CLR(BC7281_DDR,DAT_7281),(BC7281_PIN&(1<<DAT_7281))==(1<<DAT_7281))//定义PC0口为数据口
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; void main()
 0000           ; {
 0000                   .dbline 24
 0000           ; 
 0000           ;      unsigned char key_number;
 0000           ;      BC7281_init();
 0000 D2D0              xcall _BC7281_init
 0002 36C0              xjmp L3
 0004           L2:
 0004                   .dbline 26
 0004           ;      while(1)
 0004           ; { 
 0004                   .dbline 29
 0004           ; 
 0004           ; 
 0004           ;    if(!((PIND&0x04)==0x04))
 0004 20B2              in R2,0x10
 0006 3324              clr R3
 0008 22FC              sbrc R2,2
 000A 28C0              rjmp L5
 000C                   .dbline 30
 000C           ;     {
 000C                   .dbline 31
 000C           ;     key_number=read728x(0x13);         /////读键值    
 000C 03E1              ldi R16,19
 000E 10E0              ldi R17,0
 0010 C0D0              xcall _read728x
 0012 402F              mov R20,R16
 0014                   .dbline 32
 0014           ;      if(key_number<0x0A)
 0014 0A30              cpi R16,10
 0016 80F4              brsh L7
 0018                   .dbline 33
 0018           ;    {  write728x(0x15,0x00+(key_number&0x0f));  //在第0位以HEX方式显示键码的低四位
 0018                   .dbline 33
 0018 242F              mov R18,R20
 001A 3327              clr R19
 001C 2F70              andi R18,15
 001E 3070              andi R19,0
 0020 05E1              ldi R16,21
 0022 10E0              ldi R17,0
 0024 ABD0              xcall _write728x
 0026                   .dbline 34
 0026           ;    write728x(0x15,0x10+(key_number&0xf0));//在第1位以HEX方式显示键码的高四位   
 0026 242F              mov R18,R20
 0028 3327              clr R19
 002A 207F              andi R18,240
 002C 3070              andi R19,0
 002E 205F              subi R18,240  ; offset = 16
 0030 3F4F              sbci R19,255
 0032 05E1              ldi R16,21
 0034 10E0              ldi R17,0
 0036 A2D0              xcall _write728x
 0038                   .dbline 38
 0038           ;  
 0038           ;  
 0038           ;   
 0038           ;   } 
 0038           L7:
 0038                   .dbline 41
 0038           ;   
 0038           ; 
 0038           ;  if(key_number==0x0f)
 0038 4F30              cpi R20,15
 003A 81F4              brne L9
 003C                   .dbline 42
 003C           ;    {
 003C                   .dbline 43
 003C           ; write728x(0x15,0x00+(key_number&0x0f));   //在第0位以HEX方式显示键码的低四位
 003C 242F              mov R18,R20
 003E 3327              clr R19
 0040 2F70              andi R18,15
 0042 3070              andi R19,0
 0044 05E1              ldi R16,21
 0046 10E0              ldi R17,0
 0048 99D0              xcall _write728x
 004A                   .dbline 44
 004A           ; write728x(0x15,0x10+(key_number&0xf0)); //在第1位以HEX方式显示键码的高四位    
 004A 242F              mov R18,R20
 004C 3327              clr R19
 004E 207F              andi R18,240
 0050 3070              andi R19,0
 0052 205F              subi R18,240  ; offset = 16
 0054 3F4F              sbci R19,255
 0056 05E1              ldi R16,21
 0058 10E0              ldi R17,0
 005A 90D0              xcall _write728x
 005C                   .dbline 45
 005C           ;  } 
 005C           L9:
 005C                   .dbline 47
 005C           ;  
 005C           ;    }
 005C           L5:
 005C                   .dbline 48
 005C 21E6              ldi R18,97
 005E 30E0              ldi R19,0
 0060 05E1              ldi R16,21
 0062 10E0              ldi R17,0
 0064 8BD0              xcall _write728x
 0066                   .dbline 49
 0066 20E7              ldi R18,112
 0068 30E0              ldi R19,0
 006A 05E1              ldi R16,21
 006C 10E0              ldi R17,0
 006E 86D0              xcall _write728x
 0070                   .dbline 50
 0070           L3:
 0070                   .dbline 25
 0070 C9CF              xjmp L2
 0072           X0:
 0072                   .dbline -2
 0072           L1:
 0072                   .dbline 0 ; func end
 0072 0895              ret
 0074                   .dbsym r key_number 20 c
 0074                   .dbend
 0074                   .dbfunc e send_byte _send_byte fV
 0074           ;    bit_counter -> R20
 0074           ;      send_byte -> R22
                        .even
 0074           _send_byte::
 0074 0E940000          xcall push_gset2
 0078 602F              mov R22,R16
 007A                   .dbline -1
 007A                   .dbline 54
 007A           ; write728x(0x15,(0x60+(0x01))); 
 007A           ; write728x(0x15,(0x70+(0x00)));                         
 007A           ;        }
 007A           ; }
 007A           ; 
 007A           ; void send_byte(unsigned char send_byte)
 007A           ; {
 007A                   .dbline 56
 007A           ;       unsigned char bit_counter;
 007A           ;     SET(BC7281_PORT,DAT_7281);  //为低电平
 007A DE9A              sbi 0x1b,6
 007C                   .dbline 57
 007C           ;       SET(BC7281_DDR,CLK_7281);   //CLK为输出,PB1内部上拉有效        
 007C D79A              sbi 0x1a,7
 007E                   .dbline 58
 007E           ;       CLR(BC7281_DDR,DAT_7281);   //DAT为输入
 007E D698              cbi 0x1a,6
 0080                   .dbline 61
 0080           ;       
 0080           ;                  
 0080           ;       SET(PORTA,CLK_7281);  //为高电平
 0080 DF9A              sbi 0x1b,7
 0082                   .dbline 63
 0082           ;       
 0082           ;       CLR(BC7281_PORT,CLK_7281);                 
 0082 DF98              cbi 0x1b,7
 0084                   .dbline 65
 0084           ;                       
 0084           ;       delay_7281(US);
 0084 02E0              ldi R16,2
 0086 10E0              ldi R17,0
 0088 95D0              xcall _delay_7281
 008A                   .dbline 67
 008A           ;       
 008A           ;       SET(BC7281_PORT,CLK_7281);
 008A DF9A              sbi 0x1b,7
 008C                   .dbline 69
 008C           ;       
 008C           ;       delay_7281(US);
 008C 02E0              ldi R16,2
 008E 10E0              ldi R17,0
 0090 91D0              xcall _delay_7281
 0092           L12:
 0092                   .dbline 70
 0092           ;       do {
 0092                   .dbline 72
 0092           ;       
 0092           ;       CLR(BC7281_PORT,CLK_7281); 
 0092 DF98              cbi 0x1b,7
 0094                   .dbline 74
 0094           ;       //delay_7281(US);
 0094           ;       SET(BC7281_PORT,CLK_7281);
 0094 DF9A              sbi 0x1b,7
 0096                   .dbline 76
 0096           ;       
 0096           ;       delay_7281(2*US);
 0096 04E0              ldi R16,4
 0098 10E0              ldi R17,0
 009A 8CD0              xcall _delay_7281
 009C                   .dbline 78
 009C           L13:
 009C                   .dbline 78
 009C           ;       
 009C           ;       } while (RDAT_7281);    //CPU向BC7281发一系列的脉冲信号,直到DAT为低电平
 009C D698              cbi 0x1a,6
 009E 29B2              in R2,0x19
 00A0 3324              clr R3
 00A2 26FC              sbrc R2,6
 00A4 F6CF              rjmp L12
 00A6                   .dbline 79
 00A6           ;       CLR(BC7281_PORT,CLK_7281);//delay_7281(US);      // 要在15us内发一脉冲信号
 00A6 DF98              cbi 0x1b,7
 00A8                   .dbline 80
 00A8           ;       SET(BC7281_PORT,CLK_7281);
 00A8 DF9A              sbi 0x1b,7
 00AA                   .dbline 82
 00AA           ;       
 00AA           ;       delay_7281(US);
 00AA 02E0              ldi R16,2
 00AC 10E0              ldi R17,0
 00AE 82D0              xcall _delay_7281
 00B0           L15:
 00B0                   .dbline 85
 00B0           L16:
 00B0                   .dbline 85
 00B0           ;       
 00B0           ;       
 00B0           ;       while (!RDAT_7281);                               //等待数据线变为高电平
 00B0 D698              cbi 0x1a,6
 00B2 89B3              in R24,0x19
 00B4 8074              andi R24,64
 00B6 8034              cpi R24,64
 00B8 D9F7              brne L15
 00BA                   .dbline 87
 00BA           ;               
 00BA           ;       SET(BC7281_DDR,DAT_7281);   //pa6  DAT为输出并延时
 00BA D69A              sbi 0x1a,6
 00BC                   .dbline 89
 00BC           ;       
 00BC           ;       delay_7281(US);
 00BC 02E0              ldi R16,2
 00BE 10E0              ldi R17,0
 00C0 79D0              xcall _delay_7281
 00C2                   .dbline 91
 00C2           ;       
 00C2           ;       for (bit_counter=0;bit_counter<8;bit_counter++)                    //写八位
 00C2 4427              clr R20
 00C4 11C0              xjmp L21
 00C6           L18:
 00C6                   .dbline 92
 00C6           ;       { 
 00C6                   .dbline 94
 00C6           ;          
 00C6           ;           delay_7281(3*US);   
 00C6 06E0              ldi R16,6
 00C8 10E0              ldi R17,0
 00CA 74D0              xcall _delay_7281
 00CC                   .dbline 96
 00CC           ;               
 00CC           ;               if ((send_byte&0x80)==0)
 00CC 67FD              sbrc R22,7
 00CE 02C0              rjmp L22
 00D0                   .dbline 97
 00D0           ;               {CLR(BC7281_PORT,DAT_7281);//从高位写起
 00D0                   .dbline 97
 00D0 DE98              cbi 0x1b,6
 00D2                   .dbline 99
 00D2           ;               
 00D2           ;               }   
 00D2 01C0              xjmp L23
 00D4           L22:
 00D4                   .dbline 101
 00D4           ;               else
 00D4           ;               {
 00D4                   .dbline 102
 00D4           ;               SET(BC7281_PORT,DAT_7281);
 00D4 DE9A              sbi 0x1b,6
 00D6                   .dbline 103
 00D6           ;                                         }
 00D6           L23:
 00D6                   .dbline 104
 00D6 82E0              ldi R24,2
 00D8 869F              mul R24,R22
 00DA 602D              mov R22,R0
 00DC                   .dbline 107
 00DC DF98              cbi 0x1b,7
 00DE                   .dbline 108
 00DE DF9A              sbi 0x1b,7
 00E0                   .dbline 110
 00E0 04E0              ldi R16,4
 00E2 10E0              ldi R17,0
 00E4 67D0              xcall _delay_7281
 00E6                   .dbline 111
 00E6           L19:
 00E6                   .dbline 91
 00E6 4395              inc R20
 00E8           L21:
 00E8                   .dbline 91
 00E8 4830              cpi R20,8
 00EA 68F3              brlo L18
 00EC                   .dbline 116
 00EC           ;               send_byte=send_byte*2;    ///左移
 00EC           ;               

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -