📄 7281.lis
字号:
.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 + -