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

📄 keyboard.lis

📁 AVR单片机开发的键盘处理程序C源代码希望对单片机初学选手有点帮助
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module keyboard.c
                        .area lit(rom, con, rel)
 0000           _num_table::
 0000 3F06              .byte 63,6
 0002 5B4F              .byte 91,'O
 0004 666D              .byte 'f,'m
 0006 7D07              .byte 125,7
 0008 7F6F              .byte 127,'o
 000A 40                .byte 64
 000B                   .dbfile E:\AVRATM~1\key_board\keyboard.c
 000B                   .dbsym e num_table _num_table A[11:11]kc
                        .area text(rom, con, rel)
 0000                   .dbfile E:\AVRATM~1\key_board\keyboard.c
 0000                   .dbfunc e delay _delay fV
 0000           ;           time -> R16,R17
                        .even
 0000           _delay::
 0000                   .dbline -1
 0000                   .dbline 32
 0000           ; //ICC-AVR application builder : 2004-8-25 1:33
 0000           ; // Target : M16
 0000           ; // Crystal: 8.0000Mhz
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; #include <eeprom.h>
 0000           ; 
 0000           ; #define uchar unsigned char
 0000           ; #define uint unsigned int
 0000           ; #define ulong unsigned long
 0000           ; 
 0000           ; const uchar num_table[] = { 0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40 };
 0000           ; //自定义定时器
 0000           ; uint  delay_counter, scom_counter, key_counter;
 0000           ; //定义通讯缓存
 0000           ; #define SCOM_BUF_LEN 10
 0000           ; uchar tbuf[SCOM_BUF_LEN];
 0000           ; uchar rbuf[SCOM_BUF_LEN];
 0000           ; //显示缓存
 0000           ; uint l_des_speed, r_des_speed;
 0000           ; //键盘缓存
 0000           ; uint key_buf;
 0000           ; //子函数声明
 0000           ; void delay( uint time );
 0000           ; void master( uchar command, uchar* buf, uchar startP, uchar dataLen );
 0000           ; uint scan_key( void );
 0000           ; void display( void );
 0000           ; void error_handle( void );
 0000           ; 
 0000           ; /******************公共的底层函数区********************/
 0000           ; void delay( uint time )
 0000           ; {
 0000                   .dbline 33
 0000 2224              clr R2
 0002 3324              clr R3
 0004 30921F00          sts _delay_counter+1,R3
 0008 20921E00          sts _delay_counter,R2
 000C 01C0              xjmp L5
 000E           L2:
 000E                   .dbline 33
 000E                   .dbline 33
 000E A895              wdr
 0010                   .dbline 33
 0010           L3:
 0010                   .dbline 33
 0010           L5:
 0010                   .dbline 33
 0010           ;       for( delay_counter = 0; delay_counter < time; ) { WDR(); }
 0010 20901E00          lds R2,_delay_counter
 0014 30901F00          lds R3,_delay_counter+1
 0018 2016              cp R2,R16
 001A 3106              cpc R3,R17
 001C C0F3              brlo L2
 001E                   .dbline -2
 001E           L1:
 001E                   .dbline 0 ; func end
 001E 0895              ret
 0020                   .dbsym r time 16 i
 0020                   .dbend
 0020                   .dbfunc e scan_key _scan_key fi
 0020           ;     key_status -> R20,R21
                        .even
 0020           _scan_key::
 0020 0E940000          xcall push_gset1
 0024                   .dbline -1
 0024                   .dbline 37
 0024           ; }
 0024           ; 
 0024           ; uint scan_key( void )
 0024           ; {
 0024                   .dbline 38
 0024           ;       uint key_status = 0;
 0024 4427              clr R20
 0026 5527              clr R21
 0028                   .dbline 39
 0028           ;       PORTC = 0xF7;   //定义管脚输入输出状态
 0028 87EF              ldi R24,247
 002A 85BB              out 0x15,R24
 002C                   .dbline 40
 002C           ;       delay(1);
 002C 01E0              ldi R16,1
 002E 10E0              ldi R17,0
 0030 E7DF              xcall _delay
 0032                   .dbline 41
 0032           ;       if (!(PINC & 0x80))     key_status |= BIT(0);
 0032 9F99              sbic 0x13,7
 0034 01C0              rjmp L7
 0036                   .dbline 41
 0036 4160              ori R20,1
 0038           L7:
 0038                   .dbline 42
 0038           ;       if (!(PINC & 0x40))     key_status |= BIT(1); 
 0038 9E99              sbic 0x13,6
 003A 01C0              rjmp L9
 003C                   .dbline 42
 003C 4260              ori R20,2
 003E           L9:
 003E                   .dbline 43
 003E           ;       if (!(PINC & 0x20))     key_status |= BIT(2); 
 003E 9D99              sbic 0x13,5
 0040 01C0              rjmp L11
 0042                   .dbline 43
 0042 4460              ori R20,4
 0044           L11:
 0044                   .dbline 44
 0044           ;       if (!(PINC & 0x10))     key_status |= BIT(3); 
 0044 9C99              sbic 0x13,4
 0046 01C0              rjmp L13
 0048                   .dbline 44
 0048 4860              ori R20,8
 004A           L13:
 004A                   .dbline 45
 004A           ;       PORTC = 0xFB;
 004A 8BEF              ldi R24,251
 004C 85BB              out 0x15,R24
 004E                   .dbline 46
 004E           ;       delay(1);
 004E 01E0              ldi R16,1
 0050 10E0              ldi R17,0
 0052 D6DF              xcall _delay
 0054                   .dbline 47
 0054           ;       if (!(PINC & 0x80))     key_status |= BIT(4);
 0054 9F99              sbic 0x13,7
 0056 01C0              rjmp L15
 0058                   .dbline 47
 0058 4061              ori R20,16
 005A           L15:
 005A                   .dbline 48
 005A           ;       if (!(PINC & 0x40))     key_status |= BIT(5); 
 005A 9E99              sbic 0x13,6
 005C 01C0              rjmp L17
 005E                   .dbline 48
 005E 4062              ori R20,32
 0060           L17:
 0060                   .dbline 49
 0060           ;       if (!(PINC & 0x20))     key_status |= BIT(6); 
 0060 9D99              sbic 0x13,5
 0062 01C0              rjmp L19
 0064                   .dbline 49
 0064 4064              ori R20,64
 0066           L19:
 0066                   .dbline 50
 0066           ;       if (!(PINC & 0x10))     key_status |= BIT(7); 
 0066 9C99              sbic 0x13,4
 0068 01C0              rjmp L21
 006A                   .dbline 50
 006A 4068              ori R20,128
 006C           L21:
 006C                   .dbline 51
 006C           ;       PORTC = 0xFD;
 006C 8DEF              ldi R24,253
 006E 85BB              out 0x15,R24
 0070                   .dbline 52
 0070           ;       delay(1);
 0070 01E0              ldi R16,1
 0072 10E0              ldi R17,0
 0074 C5DF              xcall _delay
 0076                   .dbline 53
 0076           ;       if (!(PINC & 0x80))     key_status |= BIT(8);
 0076 9F99              sbic 0x13,7
 0078 01C0              rjmp L23
 007A                   .dbline 53
 007A 5160              ori R21,1
 007C           L23:
 007C                   .dbline 54
 007C           ;       if (!(PINC & 0x40))     key_status |= BIT(9); 
 007C 9E99              sbic 0x13,6
 007E 01C0              rjmp L25
 0080                   .dbline 54
 0080 5260              ori R21,2
 0082           L25:
 0082                   .dbline 55
 0082           ;       if (!(PINC & 0x20))     key_status |= BIT(10); 
 0082 9D99              sbic 0x13,5
 0084 01C0              rjmp L27
 0086                   .dbline 55
 0086 5460              ori R21,4
 0088           L27:
 0088                   .dbline 56
 0088           ;       if (!(PINC & 0x10))     key_status |= BIT(11); 
 0088 9C99              sbic 0x13,4
 008A 01C0              rjmp L29
 008C                   .dbline 56
 008C 5860              ori R21,8
 008E           L29:
 008E                   .dbline 57
 008E           ;       PORTC = 0xFE;
 008E 8EEF              ldi R24,254
 0090 85BB              out 0x15,R24
 0092                   .dbline 58
 0092           ;       delay(1);
 0092 01E0              ldi R16,1
 0094 10E0              ldi R17,0
 0096 B4DF              xcall _delay
 0098                   .dbline 59
 0098           ;       if (!(PINC & 0x80))     key_status |= BIT(12);
 0098 9F99              sbic 0x13,7
 009A 01C0              rjmp L31
 009C                   .dbline 59
 009C 5061              ori R21,16
 009E           L31:
 009E                   .dbline 60
 009E           ;       if (!(PINC & 0x40))     key_status |= BIT(13); 
 009E 9E99              sbic 0x13,6
 00A0 01C0              rjmp L33
 00A2                   .dbline 60
 00A2 5062              ori R21,32
 00A4           L33:
 00A4                   .dbline 61
 00A4           ;       if (!(PINC & 0x20))     key_status |= BIT(14); 
 00A4 9D99              sbic 0x13,5
 00A6 01C0              rjmp L35
 00A8                   .dbline 61
 00A8 5064              ori R21,64
 00AA           L35:
 00AA                   .dbline 62
 00AA           ;       if (!(PINC & 0x10))     key_status |= BIT(15); 
 00AA 9C99              sbic 0x13,4
 00AC 01C0              rjmp L37
 00AE                   .dbline 62
 00AE 5068              ori R21,128
 00B0           L37:
 00B0                   .dbline 63
 00B0           ;       PORTC = 0xF0;
 00B0 80EF              ldi R24,240
 00B2 85BB              out 0x15,R24
 00B4                   .dbline 64
 00B4           ;       DDRC  = 0x0F;
 00B4 8FE0              ldi R24,15
 00B6 84BB              out 0x14,R24
 00B8                   .dbline 65
 00B8           ;       PORTD |= BIT(PD2);
 00B8 929A              sbi 0x12,2
 00BA                   .dbline 66
 00BA           ;       DDRD &= ~BIT(PD2);
 00BA 8A98              cbi 0x11,2
 00BC                   .dbline 67
 00BC           ;       return key_status;
 00BC 8A01              movw R16,R20
 00BE                   .dbline -2
 00BE           L6:
 00BE 0E940000          xcall pop_gset1
 00C2                   .dbline 0 ; func end
 00C2 0895              ret
 00C4                   .dbsym r key_status 20 i
 00C4                   .dbend
 00C4                   .dbfunc e master _master fV
 00C4           ;              i -> R20
 00C4           ;        dataLen -> R22
 00C4           ;         startP -> R10
 00C4           ;            buf -> R18,R19
 00C4           ;        command -> R16
                        .even
 00C4           _master::
 00C4 0E940000          xcall push_gset3
 00C8 AE80              ldd R10,y+6
 00CA 6885              ldd R22,y+8
 00CC                   .dbline -1
 00CC                   .dbline 71
 00CC           ; }
 00CC           ; 
 00CC           ; void master( uchar command, uchar* buf, uchar startP, uchar dataLen )
 00CC           ; { 
 00CC                   .dbline 73
 00CC           ;       uchar i;
 00CC           ;       CLI();
 00CC F894              cli
 00CE                   .dbline 74
 00CE           ;       if ( command == 0x01 ){
 00CE 0130              cpi R16,1
 00D0 C1F4              brne L56
 00D2                   .dbline 74
 00D2           L42:
 00D2                   .dbline 75
 00D2           L43:
 00D2                   .dbline 75
 00D2           ;               while( !( UCSRA & BIT( UDRE ) ) );
 00D2 5D9B              sbis 0xb,5
 00D4 FECF              rjmp L42
 00D6                   .dbline 76
 00D6           ;               UDR = command;
 00D6 0CB9              out 0xc,R16
 00D8           L45:
 00D8                   .dbline 77
 00D8           L46:
 00D8                   .dbline 77
 00D8           ;               while( !( UCSRA & BIT( UDRE ) ) );
 00D8 5D9B              sbis 0xb,5
 00DA FECF              rjmp L45

⌨️ 快捷键说明

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