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

📄 7281.lst

📁 基于ATmega16的BC7281键盘显示源码,拿过来就 可以用
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0107) 		CLR(BC7281_PORT,CLK_7281);//delay_7281(US);	//产生一个周期为20US的脉冲
    00B9 98DF      CBI	0x1B,7
(0108) 		SET(BC7281_PORT,CLK_7281);
    00BA 9ADF      SBI	0x1B,7
(0109) 		
(0110) 		delay_7281(2*US);
    00BB E004      LDI	R16,4
    00BC E010      LDI	R17,0
    00BD D067      RCALL	_delay_7281
    00BE 9543      INC	R20
    00BF 3048      CPI	R20,0x8
    00C0 F368      BCS	0x00AE
(0111) 	 }
(0112) 	 
(0113)        //CLR(BC7281_PORT,CLK_7281);
(0114) 	 //  SET(BC7281_PORT,CLK_7281);
(0115) 	 
(0116) 	SET(BC7281_PORT,DAT_7281); 
    00C1 9ADE      SBI	0x1B,6
(0117) 	
(0118) 	delay_7281(6*US); 
    00C2 E00C      LDI	R16,0xC
    00C3 E010      LDI	R17,0
    00C4 D060      RCALL	_delay_7281
    00C5 940E012C  CALL	pop_gset2
    00C7 9508      RET
_receive_byte:
  bit_counter          --> R20
  in_byte              --> R22
    00C8 940E0135  CALL	push_gset2
(0119) }
(0120) 
(0121) 
(0122) 
(0123) 
(0124) 
(0125) 
(0126) unsigned char receive_byte(void)
(0127) {
(0128) 	unsigned char bit_counter, in_byte;							//产生一个脉冲
(0129) 	SET(BC7281_PORT,DAT_7281);delay_7281(US);					//为高电平
    00CA 9ADE      SBI	0x1B,6
    00CB E002      LDI	R16,2
    00CC E010      LDI	R17,0
    00CD D057      RCALL	_delay_7281
(0130) 	SET(BC7281_PORT,CLK_7281);delay_7281(US);					//为高电平
    00CE 9ADF      SBI	0x1B,7
    00CF E002      LDI	R16,2
    00D0 E010      LDI	R17,0
    00D1 D053      RCALL	_delay_7281
(0131) 	SET(BC7281_DDR,CLK_7281);					//CLK为输出,PB1内部上拉有效
    00D2 9AD7      SBI	0x1A,7
(0132) 	CLR(BC7281_DDR,DAT_7281);									//DAT为输入
    00D3 98D6      CBI	0x1A,6
(0133) 	CLR(BC7281_PORT,CLK_7281); delay_7281(US);
    00D4 98DF      CBI	0x1B,7
    00D5 E002      LDI	R16,2
    00D6 E010      LDI	R17,0
    00D7 D04D      RCALL	_delay_7281
(0134) 	SET(BC7281_PORT,CLK_7281);delay_7281(US);
    00D8 9ADF      SBI	0x1B,7
    00D9 E002      LDI	R16,2
    00DA E010      LDI	R17,0
    00DB D049      RCALL	_delay_7281
(0135) 	while (RDAT_7281){}; 				 					//等待数据线变为低电平
    00DC 98D6      CBI	0x1A,6
    00DD B229      IN	R2,0x19
    00DE 2433      CLR	R3
    00DF FC26      SBRC	R2,6
    00E0 CFFB      RJMP	0x00DC
(0136) 	CLR(BC7281_PORT,CLK_7281); delay_7281(US);
    00E1 98DF      CBI	0x1B,7
    00E2 E002      LDI	R16,2
    00E3 E010      LDI	R17,0
    00E4 D040      RCALL	_delay_7281
(0137) 	SET(BC7281_PORT,CLK_7281);delay_7281(US);
    00E5 9ADF      SBI	0x1B,7
    00E6 E002      LDI	R16,2
    00E7 E010      LDI	R17,0
    00E8 D03C      RCALL	_delay_7281
(0138) 	for (bit_counter=0;bit_counter<8;bit_counter++)				//接收八位数据
    00E9 2744      CLR	R20
    00EA C015      RJMP	0x0100
(0139) 	{ 
(0140) 		delay_7281(2*US); 
    00EB E004      LDI	R16,4
    00EC E010      LDI	R17,0
    00ED D037      RCALL	_delay_7281
(0141) 		in_byte=in_byte*2; 
    00EE E082      LDI	R24,2
    00EF 9F86      MUL	R24,R22
    00F0 2D60      MOV	R22,R0
(0142) 		if (RDAT_7281) {in_byte=in_byte|0x01; }
    00F1 98D6      CBI	0x1A,6
    00F2 B389      IN	R24,0x19
    00F3 7480      ANDI	R24,0x40
    00F4 3480      CPI	R24,0x40
    00F5 F409      BNE	0x00F7
    00F6 6061      ORI	R22,1
(0143) 		CLR(BC7281_PORT,CLK_7281); delay_7281(US);
    00F7 98DF      CBI	0x1B,7
    00F8 E002      LDI	R16,2
    00F9 E010      LDI	R17,0
    00FA D02A      RCALL	_delay_7281
(0144) 		SET(BC7281_PORT,CLK_7281);delay_7281(US);
    00FB 9ADF      SBI	0x1B,7
    00FC E002      LDI	R16,2
    00FD E010      LDI	R17,0
    00FE D026      RCALL	_delay_7281
    00FF 9543      INC	R20
    0100 3048      CPI	R20,0x8
    0101 F348      BCS	0x00EB
(0145) 	 }
(0146) 	delay_7281(2*US); 
    0102 E004      LDI	R16,4
    0103 E010      LDI	R17,0
    0104 D020      RCALL	_delay_7281
(0147) 	return(in_byte);	/////////键盘返回值
    0105 2F06      MOV	R16,R22
    0106 940E012C  CALL	pop_gset2
    0108 9508      RET
_write728x:
  write_data           --> R20
  reg_add              --> R22
    0109 940E0135  CALL	push_gset2
    010B 2F42      MOV	R20,R18
    010C 2F60      MOV	R22,R16
(0148) }    
(0149) void write728x(unsigned char reg_add, unsigned char write_data)
(0150) {
(0151) 	send_byte(reg_add); 
    010D 2F06      MOV	R16,R22
    010E DF76      RCALL	_send_byte
(0152) 	send_byte(write_data); 
    010F 2F04      MOV	R16,R20
    0110 DF74      RCALL	_send_byte
    0111 940E012C  CALL	pop_gset2
    0113 9508      RET
_read728x:
  reg_add              --> R20
    0114 940E0137  CALL	push_gset1
    0116 2F40      MOV	R20,R16
(0153) }
(0154) unsigned char read728x(unsigned char reg_add)
(0155) {
(0156) 	send_byte(reg_add|0x80); 
    0117 2F04      MOV	R16,R20
    0118 6800      ORI	R16,0x80
    0119 DF6B      RCALL	_send_byte
(0157) 	return(receive_byte()); 
    011A DFAD      RCALL	_receive_byte
    011B 940E013A  CALL	pop_gset1
    011D 9508      RET
(0158) }
(0159) 
(0160) 
(0161) 
(0162) 
(0163) 
(0164) 
(0165) /*#pragma interrupt_handler int1:3     //声明_int0( )为中断处理 
(0166) 	while(RDAT_7281==0){};     //如果数据线为高电平则BC7281空闲
(0167) 	key_number=read728x(0x13);
(0168) 	write728x(0x15,(key_number&0xf0)/16);   //在第0位以HEX方式显示键码的低四位
(0169) 	write728x(0x15,0x10+(key_number&0x0f));   //在第1位以HEX方式显示键码的高四位
(0170) }
(0171) */
(0172) 
(0173) 
(0174) 
(0175) 	void BC7281_init(void)
(0176) {	 
(0177) 
(0178)      delay_7281(2*US); 
_BC7281_init:
    011E E004      LDI	R16,4
    011F E010      LDI	R17,0
    0120 D004      RCALL	_delay_7281
(0179)      write728x(0x12,0x80);	//写控制寄存器。开扫描,CPU未读数据时只有第一个按键有效
    0121 E820      LDI	R18,0x80
    0122 E102      LDI	R16,0x12
    0123 DFE5      RCALL	_write728x
    0124 9508      RET
(0180) 	// CLR(DDRD,3);										//PD2口输出无效
(0181) 	// SET(PORTD,3);
(0182) 	 //SET(BC7281_PORT,CLK_7281);							//IO上拉有效
(0183) 	 //SET(BC7281_PORT,DAT_7281);
(0184) 	// CLR(BC7281_DDR,CLK_7281);
(0185) 	 //CLR(BC7281_DDR,DAT_7281);
(0186) 	// SET(MCUCR,ISC11);								//INT1 的产生异步中断请求
(0187) 	 //CLR(MCUCR,ISC10);
(0188) 	// SET(GICR,INT1);  									//开INT1中断
(0189) 	// SREG=SREG|0x80;									//开全
(0190) 	 // while(1){}
(0191) }
(0192) 
(0193) 
(0194) 
(0195) 
(0196) 
(0197) 
(0198) void delay_7281(unsigned int dt)//延时(dt+2)us    (晶振为4MHZ)P195
(0199) {
(0200) for(;dt>0;--dt){};
FILE: <library>
_delay_7281:
  dt                   --> R16
    0125 C002      RJMP	0x0128
    0126 5001      SUBI	R16,1
    0127 4010      SBCI	R17,0
    0128 3000      CPI	R16,0
    0129 0701      CPC	R16,R17
    012A F7D9      BNE	0x0126
    012B 9508      RET
pop_gset2:
    012C E0E2      LDI	R30,2
    012D 940C013B  JMP	pop
push_gset5:
    012F 92FA      ST	R15,-Y
    0130 92EA      ST	R14,-Y
push_gset4:
    0131 92DA      ST	R13,-Y
    0132 92CA      ST	R12,-Y
push_gset3:
    0133 92BA      ST	R11,-Y
    0134 92AA      ST	R10,-Y
push_gset2:
    0135 937A      ST	R23,-Y
    0136 936A      ST	R22,-Y
push_gset1:
    0137 935A      ST	R21,-Y
    0138 934A      ST	R20,-Y
    0139 9508      RET
pop_gset1:
    013A E0E1      LDI	R30,1
pop:
    013B 9149      LD	R20,Y+
    013C 9159      LD	R21,Y+
    013D FDE0      SBRC	R30,0
    013E 9508      RET
    013F 9169      LD	R22,Y+
    0140 9179      LD	R23,Y+
    0141 FDE1      SBRC	R30,1
    0142 9508      RET
    0143 90A9      LD	R10,Y+
    0144 90B9      LD	R11,Y+
    0145 FDE2      SBRC	R30,2
    0146 9508      RET
    0147 90C9      LD	R12,Y+
    0148 90D9      LD	R13,Y+
    0149 FDE3      SBRC	R30,3
    014A 9508      RET
    014B 90E9      LD	R14,Y+
    014C 90F9      LD	R15,Y+
    014D 9508      RET

⌨️ 快捷键说明

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