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

📄 4x4key.lst

📁 16个单片机c语言实验程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
Interrupt Vectors
    00000 940C 002A JMP	__start|__text_start

Program Code (text area)
__start|__text_start:
    0002A E5CF      LDI	R28,0x5F
    0002B E0D4      LDI	R29,4
    0002C BFCD      OUT	0x3D,R28
    0002D BFDE      OUT	0x3E,R29
    0002E 51CE      SUBI	R28,0x1E
    0002F 40D0      SBCI	R29,0
    00030 EA0A      LDI	R16,0xAA
    00031 8308      ST	Y,R16
    00032 2400      CLR	R0
    00033 E6E0      LDI	R30,0x60
    00034 E0F0      LDI	R31,0
    00035 E010      LDI	R17,0
    00036 36E3      CPI	R30,0x63
    00037 07F1      CPC	R31,R17
    00038 F011      BEQ	0x003B
    00039 9201      ST	Z+,R0
    0003A CFFB      RJMP	0x0036
    0003B 8300      ST	Z,R16
    0003C E5E4      LDI	R30,0x54
    0003D E0F0      LDI	R31,0
    0003E E6A0      LDI	R26,0x60
    0003F E0B0      LDI	R27,0
    00040 E010      LDI	R17,0
    00041 E000      LDI	R16,0
    00042 BF0B      OUT	0x3B,R16
    00043 35E4      CPI	R30,0x54
    00044 07F1      CPC	R31,R17
    00045 F021      BEQ	0x004A
    00046 95C8      LPM
    00047 9631      ADIW	R30,1
    00048 920D      ST	X+,R0
    00049 CFF9      RJMP	0x0043
    0004A 940E 01C5 CALL	_main
_exit:
    0004C 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
    0004D C002      RJMP	0x0050
    0004E 5001      SUBI	R16,1
    0004F 4010      SBCI	R17,0
    00050 E081      LDI	R24,1
    00051 E090      LDI	R25,0
    00052 1780      CP	R24,R16
    00053 0791      CPC	R25,R17
    00054 F3C8      BCS	0x004E
    00055 9508      RET
_sendbyte:
  tem                  --> R10
  i                    --> R22
  byte                 --> R20
    00056 940E 0205 CALL	push_xgsetF00C
    00058 2F40      MOV	R20,R16
(0010)     {
(0011)     }
(0012) }
(0013) //写74hc595函数
(0014) void sendbyte(uchar byte)
(0015) {    
(0016)    uchar i,tem; 
(0017)    byte=encoder(byte);       //译码
    00059 2F04      MOV	R16,R20
    0005A 2711      CLR	R17
    0005B D018      RCALL	_encoder
    0005C 2F40      MOV	R20,R16
(0018)    for(i=0;i<8;i++)          
    0005D 2766      CLR	R22
    0005E C00C      RJMP	0x006B
(0019)         {
(0020)          PORTA&=~(1<<clk);
    0005F 98D9      CBI	0x1B,1
(0021)          tem=(byte&0x80);
    00060 2F84      MOV	R24,R20
    00061 7880      ANDI	R24,0x80
    00062 2EA8      MOV	R10,R24
(0022) 		 if(tem==0)
    00063 2388      TST	R24
    00064 F411      BNE	0x0067
(0023) 		   {
(0024) 		   PORTA&=~(1<<dat);
    00065 98DB      CBI	0x1B,3
(0025) 		   }
    00066 C001      RJMP	0x0068
(0026) 		   else
(0027) 		   {
(0028) 		   PORTA|=(1<<dat);
    00067 9ADB      SBI	0x1B,3
(0029) 		   }
(0030)          byte=byte<<1;
    00068 0F44      LSL	R20
(0031)          PORTA|=(1<<clk);
    00069 9AD9      SBI	0x1B,1
    0006A 9563      INC	R22
    0006B 3068      CPI	R22,0x8
    0006C F390      BCS	0x005F
(0032)          }
(0033)          PORTA&=~(1<<rclk);
    0006D 98DA      CBI	0x1B,2
(0034) 		 s_ms(100);
    0006E E604      LDI	R16,0x64
    0006F E010      LDI	R17,0
    00070 DFDC      RCALL	_s_ms
(0035)          PORTA|=(1<<rclk);         
    00071 9ADA      SBI	0x1B,2
    00072 940C 020C JMP	pop_xgsetF00C
_encoder:
  code                 --> R20
  num                  --> R16
    00074 940E 01FB CALL	push_xgsetF000
FILE: E:\16实验程序\4x4键盘\encoder.h
(0001) //数码管译码函数
(0002) uchar encoder(uchar num)
(0003) {
(0004) uchar code;
(0005) switch(num)
    00076 2F60      MOV	R22,R16
    00077 2777      CLR	R23
    00078 3060      CPI	R22,0
    00079 0767      CPC	R22,R23
    0007A F129      BEQ	0x00A0
    0007B 3061      CPI	R22,1
    0007C E0E0      LDI	R30,0
    0007D 077E      CPC	R23,R30
    0007E F119      BEQ	0x00A2
    0007F 3062      CPI	R22,2
    00080 E0E0      LDI	R30,0
    00081 077E      CPC	R23,R30
    00082 F109      BEQ	0x00A4
    00083 3063      CPI	R22,3
    00084 E0E0      LDI	R30,0
    00085 077E      CPC	R23,R30
    00086 F0F9      BEQ	0x00A6
    00087 3064      CPI	R22,4
    00088 E0E0      LDI	R30,0
    00089 077E      CPC	R23,R30
    0008A F0E9      BEQ	0x00A8
    0008B 3065      CPI	R22,5
    0008C E0E0      LDI	R30,0
    0008D 077E      CPC	R23,R30
    0008E F0D9      BEQ	0x00AA
    0008F 3066      CPI	R22,6
    00090 E0E0      LDI	R30,0
    00091 077E      CPC	R23,R30
    00092 F0C9      BEQ	0x00AC
    00093 3067      CPI	R22,7
    00094 E0E0      LDI	R30,0
    00095 077E      CPC	R23,R30
    00096 F0B9      BEQ	0x00AE
    00097 3068      CPI	R22,0x8
    00098 E0E0      LDI	R30,0
    00099 077E      CPC	R23,R30
    0009A F0A9      BEQ	0x00B0
    0009B 3069      CPI	R22,0x9
    0009C E0E0      LDI	R30,0
    0009D 077E      CPC	R23,R30
    0009E F099      BEQ	0x00B2
    0009F C013      RJMP	0x00B3
(0006) {
(0007)   case 0x00:
(0008)   code=0xc0;break;
    000A0 EC40      LDI	R20,0xC0
    000A1 C011      RJMP	0x00B3
(0009)   case 0x01:
(0010)   code=0xf9;break;
    000A2 EF49      LDI	R20,0xF9
    000A3 C00F      RJMP	0x00B3
(0011)   case 0x02:
(0012)   code=0xa4;break;
    000A4 EA44      LDI	R20,0xA4
    000A5 C00D      RJMP	0x00B3
(0013)   case 0x03:
(0014)   code=0xb0;break;
    000A6 EB40      LDI	R20,0xB0
    000A7 C00B      RJMP	0x00B3
(0015)   case 0x04:
(0016)   code=0x99;break;
    000A8 E949      LDI	R20,0x99
    000A9 C009      RJMP	0x00B3
(0017)   case 0x05:
(0018)   code=0x92;break;
    000AA E942      LDI	R20,0x92
    000AB C007      RJMP	0x00B3
(0019)   case 0x06:
(0020)   code=0x82;break;
    000AC E842      LDI	R20,0x82
    000AD C005      RJMP	0x00B3
(0021)   case 0x07:
(0022)   code=0xf8;break;
    000AE EF48      LDI	R20,0xF8
    000AF C003      RJMP	0x00B3
(0023)   case 0x08:
(0024)   code=0x80;break;
    000B0 E840      LDI	R20,0x80
    000B1 C001      RJMP	0x00B3
(0025)   case 0x09:
(0026)   code=0x90;break;
    000B2 E940      LDI	R20,0x90
(0027)   }
(0028)   return(code);
    000B3 2F04      MOV	R16,R20
    000B4 940C 0200 JMP	pop_xgsetF000
_key_value:
  i                    --> Y,+1
  tem2                 --> R10
  rem                  --> R20
  tem1                 --> R22
    000B6 940E 0205 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;                      //不清零会返回一个不可预知的值
    000B8 2744      CLR	R20
(0006) DDRB=0xf0;                  //B口高四位输出 低四位输入
    000B9 EF80      LDI	R24,0xF0
    000BA BB87      OUT	0x17,R24
(0007) PORTB=0x0f;                 //输入有上拉电阻 输出低电平
    000BB E08F      LDI	R24,0xF
    000BC BB88      OUT	0x18,R24
(0008) s_ms(1);
    000BD E001      LDI	R16,1
    000BE E010      LDI	R17,0
    000BF DF8D      RCALL	_s_ms
(0009) tem1=PINB;                  //读取端口B
    000C0 B366      IN	R22,0x16
(0010) tem1=tem1&0x0f;
    000C1 706F      ANDI	R22,0xF
(0011) if(tem1!=0x0f)              //判断是否有键被按下
    000C2 306F      CPI	R22,0xF
    000C3 F0A1      BEQ	0x00D8
(0012)   {
(0013)   s_ms(200);                  //延时
    000C4 EC08      LDI	R16,0xC8
    000C5 E010      LDI	R17,0
    000C6 DF86      RCALL	_s_ms
(0014)   tem2=PINB;                //读取端口B
    000C7 B2A6      IN	R10,0x16
(0015)  tem2=tem2&0x0f;
    000C8 2D8A      MOV	R24,R10
    000C9 708F      ANDI	R24,0xF
    000CA 2EA8      MOV	R10,R24
(0016)   if(tem1==tem2)            //判断是否为干扰
    000CB 1768      CP	R22,R24
    000CC F459      BNE	0x00D8
(0017)     {
(0018) 	DDRB=0x0f;              //B口高四位输入 低四位输出
    000CD E08F      LDI	R24,0xF
    000CE BB87      OUT	0x17,R24
(0019) 	PORTB=0xf0;             //反相输出
    000CF EF80      LDI	R24,0xF0
    000D0 BB88      OUT	0x18,R24
(0020) 	s_ms(50);                  //换向后要延时
    000D1 E302      LDI	R16,0x32
    000D2 E010      LDI	R17,0
    000D3 DF79      RCALL	_s_ms
(0021) 	rem=PINB;               //读取端口B
    000D4 B346      IN	R20,0x16
(0022) 	rem=rem&0xf0;           //取高四位 
    000D5 7F40      ANDI	R20,0xF0
(0023) 	rem=rem+tem1;           //合并
    000D6 0F46      ADD	R20,R22
(0024) 	rem=~rem;               //反向输出
    000D7 9540      COM	R20
(0025) 	//do                    //判断按键是否被释放
(0026) 	//{
(0027)     // PORTB=0xf0;
(0028) 	//s_ms(200);
(0029) 	//}
(0030)     //while(PINB!=0xf0);
(0031) 	}
(0032)   }
(0033) return(rem);
    000D8 2F04      MOV	R16,R20
    000D9 940C 020C JMP	pop_xgsetF00C
_disa:
  data                 --> R10
    000DB 92AA      ST	-Y,R10
    000DC 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;
    000DD E614      LDI	R17,0x64
    000DE 2D0A      MOV	R16,R10
    000DF 940E 01D5 CALL	div8u
    000E1 9300 0060 STS	a3,R16
(0011) a2=(data-a3*100)/10;
    000E3 2F10      MOV	R17,R16
    000E4 E604      LDI	R16,0x64
    000E5 0301      MULSU	R16,R17
    000E6 2D0A      MOV	R16,R10
    000E7 1900      SUB	R16,R0
    000E8 E01A      LDI	R17,0xA
    000E9 940E 01D5 CALL	div8u
    000EB 9300 0061 STS	a2,R16
(0012) a1=(data-a3*100-a2*10);
    000ED 9110 0060 LDS	R17,a3
    000EF E604      LDI	R16,0x64
    000F0 0301      MULSU	R16,R17
    000F1 2C2A      MOV	R2,R10
    000F2 1820      SUB	R2,R0
    000F3 9110 0061 LDS	R17,a2
    000F5 E00A      LDI	R16,0xA
    000F6 0301      MULSU	R16,R17
    000F7 1820      SUB	R2,R0
    000F8 9220 0062 STS	a1,R2
    000FA 90A9      LD	R10,Y+
    000FB 9508      RET
_disp:
  bb                   --> R12
  aa                   --> R10
    000FC 940E 01F6 CALL	push_xgset003C
    000FE 2EA0      MOV	R10,R16
(0013) }
(0014) 
(0015) void disp(uchar aa)
(0016) {
(0017) uint bb=0;
    000FF 24CC      CLR	R12
    00100 24DD      CLR	R13
(0018) DDRA=0xff;      //初始化端口A
    00101 EF8F      LDI	R24,0xFF
    00102 BB8A      OUT	0x1A,R24
(0019) PORTA=0xff;
    00103 BB8B      OUT	0x1B,R24
(0020) 	  disa(aa);//提取aa的各位
    00104 2D0A      MOV	R16,R10
    00105 DFD5      RCALL	_disa
(0021)       sendbyte(a1);//数码管1
    00106 9100 0062 LDS	R16,a1
    00108 DF4D      RCALL	_sendbyte
(0022) 	  PORTA=0X1F;
    00109 E18F      LDI	R24,0x1F
    0010A BB8B      OUT	0x1B,R24
(0023) 	  //PORTA&=~(1<<ls138a);
(0024) 	  //PORTA&=~(1<<ls138b);
(0025) 	  //PORTA&=~(1<<ls138c);
(0026) 	  s_ms(600);             
    0010B E508      LDI	R16,0x58
    0010C E012      LDI	R17,2
    0010D DF3F      RCALL	_s_ms
(0027) 	  sendbyte(a2);//数码管2
    0010E 9100 0061 LDS	R16,a2
    00110 DF45      RCALL	_sendbyte
(0028) 	  PORTA=0X9F;
    00111 E98F      LDI	R24,0x9F
    00112 BB8B      OUT	0x1B,R24
(0029) 	  //PORTA|=(1<<ls138a);
(0030) 	  //PORTA&=~(1<<ls138b);
(0031) 	  //PORTA&=~(1<<ls138c);
(0032) 	  s_ms(600);       
    00113 E508      LDI	R16,0x58
    00114 E012      LDI	R17,2

⌨️ 快捷键说明

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