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

📄 7281.s

📁 基于ATmega16的BC7281键盘显示源码,拿过来就 可以用
💻 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 + -