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

📄 7281.lst

📁 基于ATmega16的BC7281键盘显示源码,拿过来就 可以用
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002A E5CF      LDI	R28,0x5F
    002B E0D4      LDI	R29,4
    002C BFCD      OUT	0x3D,R28
    002D BFDE      OUT	0x3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	Y+0,R16
    0032 2400      CLR	R0
    0033 E6E0      LDI	R30,0x60
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 36E0      CPI	R30,0x60
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	Z+0,R16
    003C E5E4      LDI	R30,0x54
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E4      CPI	R30,0x54
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 940E004B  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
FILE: H:\bbi项目源程序\bc7281键盘显示\16键显\7281.C
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) 
(0004) #define MHZ 8
(0005) #define US MHZ/4    //以4MHZ为基本单位,典型延时时间为(dt+2)us(晶振为1MHZ)P195P195]。
(0006) #define SET(a,b) a|=(1<<b) 
(0007) #define CLR(a,b) a&=~(1<<b)
(0008) #define CPL(a,b) a^=(1<<b)
(0009) #define CHK(a,b) (a&(1<<b)==(1<<b))
(0010) #define BC7281_PORT 	   PORTA
(0011) #define BC7281_DDR 		   DDRA
(0012) #define BC7281_PIN 		   PINA
(0013) #define INT_7281  2
(0014) #define DAT_7281  		   6
(0015) #define CLK_7281  		   7
(0016) #define RDAT_7281 (CLR(BC7281_DDR,DAT_7281),(BC7281_PIN&(1<<DAT_7281))==(1<<DAT_7281))//定义PC0口为数据口
(0017) 
(0018) 
(0019) 
(0020) void main()
(0021) {
(0022) 
(0023)      unsigned char key_number;
(0024)      BC7281_init();
_main:
  key_number           --> R20
    004B D0D2      RCALL	_BC7281_init
    004C C036      RJMP	0x0083
(0025)      while(1)
(0026) { 
(0027) 
(0028) 
(0029)    if(!((PIND&0x04)==0x04))
    004D B220      IN	R2,0x10
    004E 2433      CLR	R3
    004F FC22      SBRC	R2,2
    0050 C028      RJMP	0x0079
(0030)     {
(0031)     key_number=read728x(0x13);	 /////读键值    
    0051 E103      LDI	R16,0x13
    0052 E010      LDI	R17,0
    0053 D0C0      RCALL	_read728x
    0054 2F40      MOV	R20,R16
(0032)      if(key_number<0x0A)
    0055 300A      CPI	R16,0xA
    0056 F480      BCC	0x0067
(0033)    {  write728x(0x15,0x00+(key_number&0x0f));  //在第0位以HEX方式显示键码的低四位
    0057 2F24      MOV	R18,R20
    0058 2733      CLR	R19
    0059 702F      ANDI	R18,0xF
    005A 7030      ANDI	R19,0
    005B E105      LDI	R16,0x15
    005C E010      LDI	R17,0
    005D D0AB      RCALL	_write728x
(0034)    write728x(0x15,0x10+(key_number&0xf0));//在第1位以HEX方式显示键码的高四位   
    005E 2F24      MOV	R18,R20
    005F 2733      CLR	R19
    0060 7F20      ANDI	R18,0xF0
    0061 7030      ANDI	R19,0
    0062 5F20      SUBI	R18,0xF0
    0063 4F3F      SBCI	R19,0xFF
    0064 E105      LDI	R16,0x15
    0065 E010      LDI	R17,0
    0066 D0A2      RCALL	_write728x
(0035)  
(0036)  
(0037)   
(0038)   } 
(0039)   
(0040) 
(0041)  if(key_number==0x0f)
    0067 304F      CPI	R20,0xF
    0068 F481      BNE	0x0079
(0042)    {
(0043) write728x(0x15,0x00+(key_number&0x0f));   //在第0位以HEX方式显示键码的低四位
    0069 2F24      MOV	R18,R20
    006A 2733      CLR	R19
    006B 702F      ANDI	R18,0xF
    006C 7030      ANDI	R19,0
    006D E105      LDI	R16,0x15
    006E E010      LDI	R17,0
    006F D099      RCALL	_write728x
(0044) write728x(0x15,0x10+(key_number&0xf0)); //在第1位以HEX方式显示键码的高四位    
    0070 2F24      MOV	R18,R20
    0071 2733      CLR	R19
    0072 7F20      ANDI	R18,0xF0
    0073 7030      ANDI	R19,0
    0074 5F20      SUBI	R18,0xF0
    0075 4F3F      SBCI	R19,0xFF
    0076 E105      LDI	R16,0x15
    0077 E010      LDI	R17,0
    0078 D090      RCALL	_write728x
(0045)  } 
(0046)  
(0047)    }
(0048) write728x(0x15,(0x60+(0x01))); 
    0079 E621      LDI	R18,0x61
    007A E030      LDI	R19,0
    007B E105      LDI	R16,0x15
    007C E010      LDI	R17,0
    007D D08B      RCALL	_write728x
(0049) write728x(0x15,(0x70+(0x00)));                         
    007E E720      LDI	R18,0x70
    007F E030      LDI	R19,0
    0080 E105      LDI	R16,0x15
    0081 E010      LDI	R17,0
    0082 D086      RCALL	_write728x
    0083 CFC9      RJMP	0x004D
    0084 9508      RET
_send_byte:
  bit_counter          --> R20
  send_byte            --> R22
    0085 940E0135  CALL	push_gset2
    0087 2F60      MOV	R22,R16
(0050)        }
(0051) }
(0052) 
(0053) void send_byte(unsigned char send_byte)
(0054) {
(0055) 	unsigned char bit_counter;
(0056)     SET(BC7281_PORT,DAT_7281);  //为低电平
    0088 9ADE      SBI	0x1B,6
(0057) 	SET(BC7281_DDR,CLK_7281);   //CLK为输出,PB1内部上拉有效	
    0089 9AD7      SBI	0x1A,7
(0058) 	CLR(BC7281_DDR,DAT_7281);   //DAT为输入
    008A 98D6      CBI	0x1A,6
(0059) 	
(0060) 		   
(0061) 	SET(PORTA,CLK_7281);  //为高电平
    008B 9ADF      SBI	0x1B,7
(0062) 	
(0063) 	CLR(BC7281_PORT,CLK_7281);		   
    008C 98DF      CBI	0x1B,7
(0064) 			
(0065) 	delay_7281(US);
    008D E002      LDI	R16,2
    008E E010      LDI	R17,0
    008F D095      RCALL	_delay_7281
(0066) 	
(0067) 	SET(BC7281_PORT,CLK_7281);
    0090 9ADF      SBI	0x1B,7
(0068) 	
(0069) 	delay_7281(US);
    0091 E002      LDI	R16,2
    0092 E010      LDI	R17,0
    0093 D091      RCALL	_delay_7281
(0070) 	do {
(0071) 	
(0072) 	CLR(BC7281_PORT,CLK_7281); 
    0094 98DF      CBI	0x1B,7
(0073) 	//delay_7281(US);
(0074) 	SET(BC7281_PORT,CLK_7281);
    0095 9ADF      SBI	0x1B,7
(0075) 	
(0076) 	delay_7281(2*US);
    0096 E004      LDI	R16,4
    0097 E010      LDI	R17,0
    0098 D08C      RCALL	_delay_7281
(0077) 	
(0078) 	} while (RDAT_7281);	//CPU向BC7281发一系列的脉冲信号,直到DAT为低电平
    0099 98D6      CBI	0x1A,6
    009A B229      IN	R2,0x19
    009B 2433      CLR	R3
    009C FC26      SBRC	R2,6
    009D CFF6      RJMP	0x0094
(0079) 	CLR(BC7281_PORT,CLK_7281);//delay_7281(US);  	 // 要在15us内发一脉冲信号
    009E 98DF      CBI	0x1B,7
(0080) 	SET(BC7281_PORT,CLK_7281);
    009F 9ADF      SBI	0x1B,7
(0081) 	
(0082) 	delay_7281(US);
    00A0 E002      LDI	R16,2
    00A1 E010      LDI	R17,0
    00A2 D082      RCALL	_delay_7281
(0083) 	
(0084) 	
(0085) 	while (!RDAT_7281); 				  //等待数据线变为高电平
    00A3 98D6      CBI	0x1A,6
    00A4 B389      IN	R24,0x19
    00A5 7480      ANDI	R24,0x40
    00A6 3480      CPI	R24,0x40
    00A7 F7D9      BNE	0x00A3
(0086) 		
(0087) 	SET(BC7281_DDR,DAT_7281);   //pa6  DAT为输出并延时
    00A8 9AD6      SBI	0x1A,6
(0088) 	
(0089) 	delay_7281(US);
    00A9 E002      LDI	R16,2
    00AA E010      LDI	R17,0
    00AB D079      RCALL	_delay_7281
(0090) 	
(0091) 	for (bit_counter=0;bit_counter<8;bit_counter++)			   //写八位
    00AC 2744      CLR	R20
    00AD C011      RJMP	0x00BF
(0092) 	{ 
(0093) 	   
(0094) 	    delay_7281(3*US);	
    00AE E006      LDI	R16,6
    00AF E010      LDI	R17,0
    00B0 D074      RCALL	_delay_7281
(0095) 		
(0096) 		if ((send_byte&0x80)==0)
    00B1 FD67      SBRC	R22,7
    00B2 C002      RJMP	0x00B5
(0097) 		{CLR(BC7281_PORT,DAT_7281);//从高位写起
    00B3 98DE      CBI	0x1B,6
(0098) 		
(0099) 		}   
    00B4 C001      RJMP	0x00B6
(0100) 		else
(0101) 		{
(0102) 		SET(BC7281_PORT,DAT_7281);
    00B5 9ADE      SBI	0x1B,6
(0103) 				          }
(0104) 		send_byte=send_byte*2;	  ///左移
    00B6 E082      LDI	R24,2
    00B7 9F86      MUL	R24,R22
    00B8 2D60      MOV	R22,R0
(0105) 		
(0106) 				 					  

⌨️ 快捷键说明

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