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

📄 4x4key.lst

📁 4*4按键扫描程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
      2A E5CF      LDI	R28,0x5F
      2B E0D4      LDI	R29,4
      2C BFCD      OUT	0x3D,R28
      2D BFDE      OUT	0x3E,R29
      2E 51CE      SUBI	R28,0x1E
      2F 40D0      SBCI	R29,0
      30 EA0A      LDI	R16,0xAA
      31 8308      STD	Y+0,R16
      32 2400      CLR	R0
      33 E6E0      LDI	R30,0x60
      34 E0F0      LDI	R31,0
      35 E010      LDI	R17,0
      36 36E3      CPI	R30,0x63
      37 07F1      CPC	R31,R17
      38 F011      BEQ	0x003B
      39 9201      ST	R0,Z+
      3A CFFB      RJMP	0x0036
      3B 8300      STD	Z+0,R16
      3C E5E4      LDI	R30,0x54
      3D E0F0      LDI	R31,0
      3E E6A0      LDI	R26,0x60
      3F E0B0      LDI	R27,0
      40 E010      LDI	R17,0
      41 E000      LDI	R16,0
      42 BF0B      OUT	0x3B,R16
      43 35E4      CPI	R30,0x54
      44 07F1      CPC	R31,R17
      45 F021      BEQ	0x004A
      46 95C8      LPM
      47 9631      ADIW	R30,1
      48 920D      ST	R0,X+
      49 CFF9      RJMP	0x0043
      4A 940E 01C6 CALL	_main
_exit:
      4C CFFF      RJMP	_exit
FILE: E:\产品\开发板\光盘\16实验程序\4x4键盘\ch595.h
(0001) //向ch595写数据
(0002) #define clk  1
(0003) #define rclk 2
(0004) #define dat  3  
(0005) 
(0006) //延时函数
(0007) void s_ms(unsigned int t)
(0008) {
(0009)     for(;t>1;t--)
_s_ms:
  t                    --> R16
      4D C002      RJMP	0x0050
      4E 5001      SUBI	R16,1
      4F 4010      SBCI	R17,0
      50 E081      LDI	R24,1
      51 E090      LDI	R25,0
      52 1780      CP	R24,R16
      53 0791      CPC	R25,R17
      54 F3C8      BCS	0x004E
      55 9508      RET
_sendbyte:
  tem                  --> R10
  i                    --> R22
  byte                 --> R20
      56 940E 020E CALL	push_xgsetF00C
      58 2F40      MOV	R20,R16
(0010)     {
(0011)     }
(0012) }
(0013) //写74hc595函数
(0014) void sendbyte(uchar byte)
(0015) {    
(0016)    uchar i,tem; 
(0017)    byte=encoder(byte);       //译码
      59 2F04      MOV	R16,R20
      5A 2711      CLR	R17
      5B D018      RCALL	_encoder
      5C 2F40      MOV	R20,R16
(0018)    for(i=0;i<8;i++)          
      5D 2766      CLR	R22
      5E C00C      RJMP	0x006B
(0019)         {
(0020)          PORTA&=~(1<<clk);
      5F 98D9      CBI	0x1B,1
(0021)          tem=(byte&0x80);
      60 2F84      MOV	R24,R20
      61 7880      ANDI	R24,0x80
      62 2EA8      MOV	R10,R24
(0022) 		 if(tem==0)
      63 2388      TST	R24
      64 F411      BNE	0x0067
(0023) 		   {
(0024) 		   PORTA&=~(1<<dat);
      65 98DB      CBI	0x1B,3
(0025) 		   }
      66 C001      RJMP	0x0068
(0026) 		   else
(0027) 		   {
(0028) 		   PORTA|=(1<<dat);
      67 9ADB      SBI	0x1B,3
(0029) 		   }
(0030)          byte=byte<<1;
      68 0F44      LSL	R20
(0031)          PORTA|=(1<<clk);
      69 9AD9      SBI	0x1B,1
      6A 9563      INC	R22
      6B 3068      CPI	R22,0x8
      6C F390      BCS	0x005F
(0032)          }
(0033)          PORTA&=~(1<<rclk);
      6D 98DA      CBI	0x1B,2
(0034) 		 s_ms(100);
      6E E604      LDI	R16,0x64
      6F E010      LDI	R17,0
      70 DFDC      RCALL	_s_ms
(0035)          PORTA|=(1<<rclk);         
      71 9ADA      SBI	0x1B,2
      72 940C 0215 JMP	pop_xgsetF00C
_encoder:
  code                 --> R20
  num                  --> R16
      74 940E 0204 CALL	push_xgsetF000
FILE: E:\产品\开发板\光盘\16实验程序\4x4键盘\encoder.h
(0001) //数码管译码函数
(0002) uchar encoder(uchar num)
(0003) {
(0004) uchar code;
(0005) switch(num)
      76 2F60      MOV	R22,R16
      77 2777      CLR	R23
      78 3060      CPI	R22,0
      79 0767      CPC	R22,R23
      7A F129      BEQ	0x00A0
      7B 3061      CPI	R22,1
      7C E0E0      LDI	R30,0
      7D 077E      CPC	R23,R30
      7E F119      BEQ	0x00A2
      7F 3062      CPI	R22,2
      80 E0E0      LDI	R30,0
      81 077E      CPC	R23,R30
      82 F109      BEQ	0x00A4
      83 3063      CPI	R22,3
      84 E0E0      LDI	R30,0
      85 077E      CPC	R23,R30
      86 F0F9      BEQ	0x00A6
      87 3064      CPI	R22,4
      88 E0E0      LDI	R30,0
      89 077E      CPC	R23,R30
      8A F0E9      BEQ	0x00A8
      8B 3065      CPI	R22,5
      8C E0E0      LDI	R30,0
      8D 077E      CPC	R23,R30
      8E F0D9      BEQ	0x00AA
      8F 3066      CPI	R22,6
      90 E0E0      LDI	R30,0
      91 077E      CPC	R23,R30
      92 F0C9      BEQ	0x00AC
      93 3067      CPI	R22,7
      94 E0E0      LDI	R30,0
      95 077E      CPC	R23,R30
      96 F0B9      BEQ	0x00AE
      97 3068      CPI	R22,0x8
      98 E0E0      LDI	R30,0
      99 077E      CPC	R23,R30
      9A F0A9      BEQ	0x00B0
      9B 3069      CPI	R22,0x9
      9C E0E0      LDI	R30,0
      9D 077E      CPC	R23,R30
      9E F099      BEQ	0x00B2
      9F C013      RJMP	0x00B3
(0006) {
(0007)   case 0x00:
(0008)   code=0xc0;break;
      A0 EC40      LDI	R20,0xC0
      A1 C011      RJMP	0x00B3
(0009)   case 0x01:
(0010)   code=0xf9;break;
      A2 EF49      LDI	R20,0xF9
      A3 C00F      RJMP	0x00B3
(0011)   case 0x02:
(0012)   code=0xa4;break;
      A4 EA44      LDI	R20,0xA4
      A5 C00D      RJMP	0x00B3
(0013)   case 0x03:
(0014)   code=0xb0;break;
      A6 EB40      LDI	R20,0xB0
      A7 C00B      RJMP	0x00B3
(0015)   case 0x04:
(0016)   code=0x99;break;
      A8 E949      LDI	R20,0x99
      A9 C009      RJMP	0x00B3
(0017)   case 0x05:
(0018)   code=0x92;break;
      AA E942      LDI	R20,0x92
      AB C007      RJMP	0x00B3
(0019)   case 0x06:
(0020)   code=0x82;break;
      AC E842      LDI	R20,0x82
      AD C005      RJMP	0x00B3
(0021)   case 0x07:
(0022)   code=0xf8;break;
      AE EF48      LDI	R20,0xF8
      AF C003      RJMP	0x00B3
(0023)   case 0x08:
(0024)   code=0x80;break;
      B0 E840      LDI	R20,0x80
      B1 C001      RJMP	0x00B3
(0025)   case 0x09:
(0026)   code=0x90;break;
      B2 E940      LDI	R20,0x90
(0027)   }
(0028)   return(code);
      B3 2F04      MOV	R16,R20
      B4 940C 0209 JMP	pop_xgsetF000
_key_value:
  i                    --> Y,+1
  tem2                 --> R10
  rem                  --> R20
  tem1                 --> R22
      B6 940E 020E CALL	push_xgsetF00C
FILE: E:\产品\开发板\光盘\16实验程序\4x4键盘\key_value.h
(0001) //读键盘值 键盘在端口B
(0002) uchar key_value()
(0003) {
(0004) uchar tem1,tem2,rem,i;
(0005) rem=0;                      //不清零会返回一个不可预知的值
      B8 2744      CLR	R20
(0006) DDRB=0xf0;                  //B口高四位输出 低四位输入
      B9 EF80      LDI	R24,0xF0
      BA BB87      OUT	0x17,R24
(0007) PORTB=0x0f;                 //输入有上拉电阻 输出低电平
      BB E08F      LDI	R24,0xF
      BC BB88      OUT	0x18,R24
(0008) s_ms(1);
      BD E001      LDI	R16,1
      BE E010      LDI	R17,0
      BF DF8D      RCALL	_s_ms
(0009) tem1=PINB;                  //读取端口B
      C0 B366      IN	R22,0x16
(0010) tem1=tem1&0x0f;
      C1 706F      ANDI	R22,0xF
(0011) if(tem1!=0x0f)              //判断是否有键被按下
      C2 306F      CPI	R22,0xF
      C3 F0A1      BEQ	0x00D8
(0012)   {
(0013)   s_ms(200);                  //延时
      C4 EC08      LDI	R16,0xC8
      C5 E010      LDI	R17,0
      C6 DF86      RCALL	_s_ms
(0014)   tem2=PINB;                //读取端口B
      C7 B2A6      IN	R10,0x16
(0015)   tem2=tem2&0x0f;
      C8 2D8A      MOV	R24,R10
      C9 708F      ANDI	R24,0xF
      CA 2EA8      MOV	R10,R24
(0016)   if(tem1==tem2)            //判断是否为干扰
      CB 1768      CP	R22,R24
      CC F459      BNE	0x00D8
(0017)     {
(0018) 	DDRB=0x0f;              //B口高四位输入 低四位输出
      CD E08F      LDI	R24,0xF
      CE BB87      OUT	0x17,R24
(0019) 	PORTB=0xf0;             //反相输出
      CF EF80      LDI	R24,0xF0
      D0 BB88      OUT	0x18,R24
(0020) 	s_ms(50);                  //换向后要延时
      D1 E302      LDI	R16,0x32
      D2 E010      LDI	R17,0
      D3 DF79      RCALL	_s_ms
(0021) 	rem=PINB;               //读取端口B
      D4 B346      IN	R20,0x16
(0022) 	rem=rem&0xf0;           //取高四位 
      D5 7F40      ANDI	R20,0xF0
(0023) 	rem=rem+tem1;           //合并
      D6 0F46      ADD	R20,R22
(0024) 	rem=~rem;               //反向输出
      D7 9540      COM	R20
(0025) 	//do                    //判断按键是否被释放
(0026) 	//{
(0027)     // PORTB=0xf0;
(0028) 	//s_ms(200);
(0029) 	//}
(0030)     //while(PINB!=0xf0);
(0031) 	}
(0032)   }
(0033) return(rem);
      D8 2F04      MOV	R16,R20
      D9 940C 0215 JMP	pop_xgsetF00C
_disa:
  data                 --> R10
      DB 92AA      ST	R10,-Y
      DC 2EA0      MOV	R10,R16
FILE: E:\产品\开发板\光盘\16实验程序\4x4键盘\disp.h
(0001) //数码管显示子程序
(0002) 
(0003) #define ls138a 7
(0004) #define ls138b 6
(0005) #define ls138c 5
(0006) #define ls138en 4
(0007) uchar a1,a2,a3;
(0008) void disa(uchar data)
(0009) {
(0010) a3=data/100;
      DD E614      LDI	R17,0x64
      DE 2D0A      MOV	R16,R10
      DF 940E 01DE CALL	div8u
      E1 9300 0060 STS	a3,R16
(0011) a2=(data-a3*100)/10;
      E3 2E20      MOV	R2,R16
      E4 E684      LDI	R24,0x64
      E5 9D82      MUL	R24,R2
      E6 2D0A      MOV	R16,R10
      E7 1900      SUB	R16,R0
      E8 E01A      LDI	R17,0xA
      E9 940E 01DE CALL	div8u
      EB 9300 0061 STS	a2,R16
(0012) a1=(data-a3*100-a2*10);
      ED 9020 0060 LDS	R2,a3
      EF E684      LDI	R24,0x64
      F0 9D82      MUL	R24,R2
      F1 2C2A      MOV	R2,R10
      F2 1820      SUB	R2,R0
      F3 2E30      MOV	R3,R16
      F4 E08A      LDI	R24,0xA
      F5 9D83      MUL	R24,R3
      F6 1820      SUB	R2,R0
      F7 9220 0062 STS	a1,R2
      F9 90A9      LD	R10,Y+
      FA 9508      RET
_disp:
  bb                   --> R12
  aa                   --> R10
      FB 940E 01FF CALL	push_xgset003C
      FD 2EA0      MOV	R10,R16
(0013) }
(0014) 
(0015) void disp(uchar aa)
(0016) {
(0017) uint bb=0;
      FE 24CC      CLR	R12
      FF 24DD      CLR	R13
(0018) DDRA=0xff;      //初始化端口A
     100 EF8F      LDI	R24,0xFF
     101 BB8A      OUT	0x1A,R24
(0019) PORTA=0xff;
     102 BB8B      OUT	0x1B,R24
(0020) 	  disa(aa);//提取aa的各位
     103 2D0A      MOV	R16,R10
     104 DFD6      RCALL	_disa
(0021)       sendbyte(a1);//数码管1
     105 9100 0062 LDS	R16,a1
     107 DF4E      RCALL	_sendbyte
(0022) 	  PORTA&=~(1<<ls138a);
     108 98DF      CBI	0x1B,7
(0023) 	  PORTA&=~(1<<ls138b);
     109 98DE      CBI	0x1B,6
(0024) 	  PORTA&=~(1<<ls138c);
     10A 98DD      CBI	0x1B,5
(0025) 	  s_ms(600);             
     10B E508      LDI	R16,0x58
     10C E012      LDI	R17,2
     10D DF3F      RCALL	_s_ms
(0026) 	  sendbyte(a2);//数码管2
     10E 9100 0061 LDS	R16,a2
     110 DF45      RCALL	_sendbyte
(0027) 	  PORTA|=(1<<ls138a);
     111 9ADF      SBI	0x1B,7
(0028) 	  PORTA&=~(1<<ls138b);
     112 98DE      CBI	0x1B,6
(0029) 	  PORTA&=~(1<<ls138c);
     113 98DD      CBI	0x1B,5
(0030) 	  s_ms(600);       
     114 E508      LDI	R16,0x58
     115 E012      LDI	R17,2
     116 DF36      RCALL	_s_ms
(0031) 	  sendbyte(a3);//数码管3
     117 9100 0060 LDS	R16,a3
     119 DF3C      RCALL	_sendbyte
(0032) 	  PORTA&=~(1<<ls138a);
     11A 98DF      CBI	0x1B,7

⌨️ 快捷键说明

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