📄 7281.s
字号:
.module _7281.C
.area text(rom, con, rel)
.dbfile H:\bbi项目源程序\bc7281键盘显示\16键显\7281.C
.dbfunc e main _main fV
; key_number -> R20
.even
_main::
.dbline -1
.dbline 21
; #include <iom16v.h>
; #include <macros.h>
;
; #define MHZ 8
; #define US MHZ/4 //以4MHZ为基本单位,典型延时时间为(dt+2)us(晶振为1MHZ)P195P195]。
; #define SET(a,b) a|=(1<<b)
; #define CLR(a,b) a&=~(1<<b)
; #define CPL(a,b) a^=(1<<b)
; #define CHK(a,b) (a&(1<<b)==(1<<b))
; #define BC7281_PORT PORTA
; #define BC7281_DDR DDRA
; #define BC7281_PIN PINA
; #define INT_7281 2
; #define DAT_7281 6
; #define CLK_7281 7
; #define RDAT_7281 (CLR(BC7281_DDR,DAT_7281),(BC7281_PIN&(1<<DAT_7281))==(1<<DAT_7281))//定义PC0口为数据口
;
;
;
; void main()
; {
.dbline 24
;
; unsigned char key_number;
; BC7281_init();
xcall _BC7281_init
xjmp L3
L2:
.dbline 26
; while(1)
; {
.dbline 29
;
;
; if(!((PIND&0x04)==0x04))
in R2,0x10
clr R3
sbrc R2,2
rjmp L5
.dbline 30
; {
.dbline 31
; key_number=read728x(0x13); /////读键值
ldi R16,19
ldi R17,0
xcall _read728x
mov R20,R16
.dbline 32
; if(key_number<0x0A)
cpi R16,10
brsh L7
.dbline 33
; { write728x(0x15,0x00+(key_number&0x0f)); //在第0位以HEX方式显示键码的低四位
.dbline 33
mov R18,R20
clr R19
andi R18,15
andi R19,0
ldi R16,21
ldi R17,0
xcall _write728x
.dbline 34
; write728x(0x15,0x10+(key_number&0xf0));//在第1位以HEX方式显示键码的高四位
mov R18,R20
clr R19
andi R18,240
andi R19,0
subi R18,240 ; offset = 16
sbci R19,255
ldi R16,21
ldi R17,0
xcall _write728x
.dbline 38
;
;
;
; }
L7:
.dbline 41
;
;
; if(key_number==0x0f)
cpi R20,15
brne L9
.dbline 42
; {
.dbline 43
; write728x(0x15,0x00+(key_number&0x0f)); //在第0位以HEX方式显示键码的低四位
mov R18,R20
clr R19
andi R18,15
andi R19,0
ldi R16,21
ldi R17,0
xcall _write728x
.dbline 44
; write728x(0x15,0x10+(key_number&0xf0)); //在第1位以HEX方式显示键码的高四位
mov R18,R20
clr R19
andi R18,240
andi R19,0
subi R18,240 ; offset = 16
sbci R19,255
ldi R16,21
ldi R17,0
xcall _write728x
.dbline 45
; }
L9:
.dbline 47
;
; }
L5:
.dbline 48
ldi R18,97
ldi R19,0
ldi R16,21
ldi R17,0
xcall _write728x
.dbline 49
ldi R18,112
ldi R19,0
ldi R16,21
ldi R17,0
xcall _write728x
.dbline 50
L3:
.dbline 25
xjmp L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r key_number 20 c
.dbend
.dbfunc e send_byte _send_byte fV
; bit_counter -> R20
; send_byte -> R22
.even
_send_byte::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 54
; write728x(0x15,(0x60+(0x01)));
; write728x(0x15,(0x70+(0x00)));
; }
; }
;
; void send_byte(unsigned char send_byte)
; {
.dbline 56
; unsigned char bit_counter;
; SET(BC7281_PORT,DAT_7281); //为低电平
sbi 0x1b,6
.dbline 57
; SET(BC7281_DDR,CLK_7281); //CLK为输出,PB1内部上拉有效
sbi 0x1a,7
.dbline 58
; CLR(BC7281_DDR,DAT_7281); //DAT为输入
cbi 0x1a,6
.dbline 61
;
;
; SET(PORTA,CLK_7281); //为高电平
sbi 0x1b,7
.dbline 63
;
; CLR(BC7281_PORT,CLK_7281);
cbi 0x1b,7
.dbline 65
;
; delay_7281(US);
ldi R16,2
ldi R17,0
xcall _delay_7281
.dbline 67
;
; SET(BC7281_PORT,CLK_7281);
sbi 0x1b,7
.dbline 69
;
; delay_7281(US);
ldi R16,2
ldi R17,0
xcall _delay_7281
L12:
.dbline 70
; do {
.dbline 72
;
; CLR(BC7281_PORT,CLK_7281);
cbi 0x1b,7
.dbline 74
; //delay_7281(US);
; SET(BC7281_PORT,CLK_7281);
sbi 0x1b,7
.dbline 76
;
; delay_7281(2*US);
ldi R16,4
ldi R17,0
xcall _delay_7281
.dbline 78
L13:
.dbline 78
;
; } while (RDAT_7281); //CPU向BC7281发一系列的脉冲信号,直到DAT为低电平
cbi 0x1a,6
in R2,0x19
clr R3
sbrc R2,6
rjmp L12
.dbline 79
; CLR(BC7281_PORT,CLK_7281);//delay_7281(US); // 要在15us内发一脉冲信号
cbi 0x1b,7
.dbline 80
; SET(BC7281_PORT,CLK_7281);
sbi 0x1b,7
.dbline 82
;
; delay_7281(US);
ldi R16,2
ldi R17,0
xcall _delay_7281
L15:
.dbline 85
L16:
.dbline 85
;
;
; while (!RDAT_7281); //等待数据线变为高电平
cbi 0x1a,6
in R24,0x19
andi R24,64
cpi R24,64
brne L15
.dbline 87
;
; SET(BC7281_DDR,DAT_7281); //pa6 DAT为输出并延时
sbi 0x1a,6
.dbline 89
;
; delay_7281(US);
ldi R16,2
ldi R17,0
xcall _delay_7281
.dbline 91
;
; for (bit_counter=0;bit_counter<8;bit_counter++) //写八位
clr R20
xjmp L21
L18:
.dbline 92
; {
.dbline 94
;
; delay_7281(3*US);
ldi R16,6
ldi R17,0
xcall _delay_7281
.dbline 96
;
; if ((send_byte&0x80)==0)
sbrc R22,7
rjmp L22
.dbline 97
; {CLR(BC7281_PORT,DAT_7281);//从高位写起
.dbline 97
cbi 0x1b,6
.dbline 99
;
; }
xjmp L23
L22:
.dbline 101
; else
; {
.dbline 102
; SET(BC7281_PORT,DAT_7281);
sbi 0x1b,6
.dbline 103
; }
L23:
.dbline 104
ldi R24,2
mul R24,R22
mov R22,R0
.dbline 107
cbi 0x1b,7
.dbline 108
sbi 0x1b,7
.dbline 110
ldi R16,4
ldi R17,0
xcall _delay_7281
.dbline 111
L19:
.dbline 91
inc R20
L21:
.dbline 91
cpi R20,8
brlo L18
.dbline 116
; send_byte=send_byte*2; ///左移
;
;
; CLR(BC7281_PORT,CLK_7281);//delay_7281(US); //产生一个周期为20US的脉冲
; SET(BC7281_PORT,CLK_7281);
;
; delay_7281(2*US);
; }
;
; //CLR(BC7281_PORT,CLK_7281);
; // SET(BC7281_PORT,CLK_7281);
;
; SET(BC7281_PORT,DAT_7281);
sbi 0x1b,6
.dbline 118
;
; delay_7281(6*US);
ldi R16,12
ldi R17,0
xcall _delay_7281
.dbline -2
L11:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r bit_counter 20 c
.dbsym r send_byte 22 c
.dbend
.dbfunc e receive_byte _receive_byte fc
; bit_counter -> R20
; in_byte -> R22
.even
_receive_byte::
xcall push_gset2
.dbline -1
.dbline 127
; }
;
;
;
;
;
;
; unsigned char receive_byte(void)
; {
.dbline 129
; unsigned char bit_counter, in_byte; //产生一个脉冲
; SET(BC7281_PORT,DAT_7281);delay_7281(US); //为高电平
sbi 0x1b,6
.dbline 129
ldi R16,2
ldi R17,0
xcall _delay_7281
.dbline 130
; SET(BC7281_PORT,CLK_7281);delay_7281(US); //为高电平
sbi 0x1b,7
.dbline 130
ldi R16,2
ldi R17,0
xcall _delay_7281
.dbline 131
; SET(BC7281_DDR,CLK_7281); //CLK为输出,PB1内部上拉有效
sbi 0x1a,7
.dbline 132
; CLR(BC7281_DDR,DAT_7281); //DAT为输入
cbi 0x1a,6
.dbline 133
; CLR(BC7281_PORT,CLK_7281); delay_7281(US);
cbi 0x1b,7
.dbline 133
ldi R16,2
ldi R17,0
xcall _delay_7281
.dbline 134
; SET(BC7281_PORT,CLK_7281);delay_7281(US);
sbi 0x1b,7
.dbline 134
ldi R16,2
ldi R17,0
xcall _delay_7281
L25:
.dbline 135
.dbline 135
L26:
.dbline 135
; while (RDAT_7281){}; //等待数据线变为低电平
cbi 0x1a,6
in R2,0x19
clr R3
sbrc R2,6
rjmp L25
.dbline 135
.dbline 136
; CLR(BC7281_PORT,CLK_7281); delay_7281(US);
cbi 0x1b,7
.dbline 136
ldi R16,2
ldi R17,0
xcall _delay_7281
.dbline 137
; SET(BC7281_PORT,CLK_7281);delay_7281(US);
sbi 0x1b,7
.dbline 137
ldi R16,2
ldi R17,0
xcall _delay_7281
.dbline 138
; for (bit_counter=0;bit_counter<8;bit_counter++) //接收八位数据
clr R20
xjmp L31
L28:
.dbline 139
; {
.dbline 140
; delay_7281(2*US);
ldi R16,4
ldi R17,0
xcall _delay_7281
.dbline 141
; in_byte=in_byte*2;
ldi R24,2
mul R24,R22
mov R22,R0
.dbline 142
; if (RDAT_7281) {in_byte=in_byte|0x01; }
cbi 0x1a,6
in R24,0x19
andi R24,64
cpi R24,64
brne L32
.dbline 142
.dbline 142
ori R22,1
.dbline 142
L32:
.dbline 143
cbi 0x1b,7
.dbline 143
ldi R16,2
ldi R17,0
xcall _delay_7281
.dbline 144
sbi 0x1b,7
.dbline 144
ldi R16,2
ldi R17,0
xcall _delay_7281
.dbline 145
L29:
.dbline 138
inc R20
L31:
.dbline 138
cpi R20,8
brlo L28
.dbline 146
; CLR(BC7281_PORT,CLK_7281); delay_7281(US);
; SET(BC7281_PORT,CLK_7281);delay_7281(US);
; }
; delay_7281(2*US);
ldi R16,4
ldi R17,0
xcall _delay_7281
.dbline 147
; return(in_byte); /////////键盘返回值
mov R16,R22
.dbline -2
L24:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r bit_counter 20 c
.dbsym r in_byte 22 c
.dbend
.dbfunc e write728x _write728x fV
; write_data -> R20
; reg_add -> R22
.even
_write728x::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 150
; }
; void write728x(unsigned char reg_add, unsigned char write_data)
; {
.dbline 151
; send_byte(reg_add);
mov R16,R22
xcall _send_byte
.dbline 152
; send_byte(write_data);
mov R16,R20
xcall _send_byte
.dbline -2
L34:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r write_data 20 c
.dbsym r reg_add 22 c
.dbend
.dbfunc e read728x _read728x fc
; reg_add -> R20
.even
_read728x::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 155
; }
; unsigned char read728x(unsigned char reg_add)
; {
.dbline 156
; send_byte(reg_add|0x80);
mov R16,R20
ori R16,128
xcall _send_byte
.dbline 157
; return(receive_byte());
xcall _receive_byte
.dbline -2
L35:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r reg_add 20 c
.dbend
.dbfunc e BC7281_init _BC7281_init fV
.even
_BC7281_init::
.dbline -1
.dbline 176
; }
;
;
;
;
;
;
; /*#pragma interrupt_handler int1:3 //声明_int0( )为中断处理
; while(RDAT_7281==0){}; //如果数据线为高电平则BC7281空闲
; key_number=read728x(0x13);
; write728x(0x15,(key_number&0xf0)/16); //在第0位以HEX方式显示键码的低四位
; write728x(0x15,0x10+(key_number&0x0f)); //在第1位以HEX方式显示键码的高四位
; }
; */
;
;
;
; void BC7281_init(void)
; {
.dbline 178
;
; delay_7281(2*US);
ldi R16,4
ldi R17,0
xcall _delay_7281
.dbline 179
; write728x(0x12,0x80); //写控制寄存器。开扫描,CPU未读数据时只有第一个按键有效
ldi R18,128
ldi R16,18
xcall _write728x
.dbline -2
L36:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_7281 _delay_7281 fV
; dt -> R16,R17
.even
_delay_7281::
.dbline -1
.dbline 199
; // CLR(DDRD,3); //PD2口输出无效
; // SET(PORTD,3);
; //SET(BC7281_PORT,CLK_7281); //IO上拉有效
; //SET(BC7281_PORT,DAT_7281);
; // CLR(BC7281_DDR,CLK_7281);
; //CLR(BC7281_DDR,DAT_7281);
; // SET(MCUCR,ISC11); //INT1 的产生异步中断请求
; //CLR(MCUCR,ISC10);
; // SET(GICR,INT1); //开INT1中断
; // SREG=SREG|0x80; //开全
; // while(1){}
; }
;
;
;
;
;
;
; void delay_7281(unsigned int dt)//延时(dt+2)us (晶振为4MHZ)P195
; {
.dbline 200
xjmp L41
L38:
.dbline 200
.dbline 200
L39:
.dbline 200
subi R16,1
sbci R17,0
L41:
.dbline 200
; for(;dt>0;--dt){};
cpi R16,0
cpc R16,R17
brne L38
X1:
.dbline 200
.dbline -2
L37:
.dbline 0 ; func end
ret
.dbsym r dt 16 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -