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

📄 显示模块2.lst

📁 一个LED特效显示程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    0180 E5CF      LDI	R28,0x5F
    0181 E0D4      LDI	R29,4
    0182 BFCD      OUT	0x3D,R28
    0183 BFDE      OUT	0x3E,R29
    0184 51CE      SUBI	R28,0x1E
    0185 40D0      SBCI	R29,0
    0186 EA0A      LDI	R16,0xAA
    0187 8308      STD	Y+0,R16
    0188 2400      CLR	R0
    0189 EFE8      LDI	R30,0xF8
    018A E0F2      LDI	R31,2
    018B E013      LDI	R17,3
    018C 30E3      CPI	R30,3
    018D 07F1      CPC	R31,R17
    018E F011      BEQ	0x0191
    018F 9201      ST	R0,Z+
    0190 CFFB      RJMP	0x018C
    0191 8300      STD	Z+0,R16
    0192 E6E7      LDI	R30,0x67
    0193 E0F0      LDI	R31,0
    0194 E6A0      LDI	R26,0x60
    0195 E0B0      LDI	R27,0
    0196 E012      LDI	R17,2
    0197 3FEF      CPI	R30,0xFF
    0198 07F1      CPC	R31,R17
    0199 F021      BEQ	0x019E
    019A 95C8      LPM
    019B 9631      ADIW	R30,1
    019C 920D      ST	R0,X+
    019D CFF9      RJMP	0x0197
    019E D27A      RCALL	_main
_exit:
    019F CFFF      RJMP	_exit
FILE: C:\DOCUME~1\fli\桌面\广告屏程序\disp_key.h
(0001) /*********************************************
(0002) *显示键盘头文件
(0003) *支持SPI显示键盘模块
(0004) 
(0005) 
(0006)      SPI接口显示键盘:
(0007)          PB0:    键盘	  
(0008)          PB1:    SCK
(0009) 		 PB2:    RCK
(0010) 		 PB3:    DATA
(0011) 
(0012) *********************************************/
(0013) 
(0014) 
(0015) /***************************************************
(0016)             头文件申明
(0017) ****************************************************/
(0018) //#include<iom16v.h>
(0019) //#include <macros.h>
(0020) 
(0021) //显示
(0022) const char DISCODE[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0023) 	  	   		 	  0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x63};
(0024) char  Disp_Buff[]={0,0,0,0,0,0,0,0};					  
(0025) char  disp_key_count =0;                       //LED扫描计数
(0026) int   disp_code =0;
(0027) unsigned int   time_count_sys =0;              //系统时间计数,1ms为单位
(0028) //按键
(0029) char  key_num =0;
(0030) char  old_key_num =0;
(0031) char  new_key_num =0;
(0032) char  key_buff[] ={0,0,0,0,0,0,0,0};      
(0033) int   key_down_time =1;
(0034) char  key_delay =0;
(0035) //基本全局变量
(0036) unsigned int delay_time_count =0;
(0037) //*****************************************************************************
(0038) //按键显示
(0039) void Disp_key_group(void);
(0040) void disp_bit(char disCodeIndex,char bitChoose);
(0041) void send_data_disp(unsigned char send_data);
(0042) void Key_num(void);
(0043) void delay(unsigned int n);
(0044) //****************************************
(0045) /*  ms精确延时函数  */
(0046) void delay(unsigned int n)
(0047) {//延时
(0048)   delay_time_count =n;
_delay:
  n                    --> R16
    01A0 9310007C  STS	delay_time_count+1,R17
    01A2 9300007B  STS	delay_time_count,R16
(0049)   while(delay_time_count >0);
    01A4 940E0534  CALL	0x534
    01A6 F7E9      BNE	0x01A4
    01A7 2033      TST	R3
    01A8 F7D9      BNE	0x01A4
    01A9 9508      RET
_disp_bit:
  bitChoose            --> R22
  disCodeIndex         --> R20
    01AA D2F5      RCALL	push_gset2
    01AB 2F62      MOV	R22,R18
    01AC 2F40      MOV	R20,R16
(0050) }
(0051) /*  显示函数  */
(0052) void disp_bit(char disCodeIndex,char bitChoose)     //按位显示
(0053) {
(0054)    PORTB &= 0B00000100;                              //RCK送底电平
    01AD B388      IN	R24,0x18
    01AE 7084      ANDI	R24,4
    01AF BB88      OUT	0x18,R24
(0055)    send_data_disp(bitChoose);                       //送位选
    01B0 2F06      MOV	R16,R22
    01B1 D00B      RCALL	_send_data_disp
(0056)    send_data_disp(DISCODE[disCodeIndex]);           //送段码
    01B2 E584      LDI	R24,0x54
    01B3 E090      LDI	R25,0
    01B4 940E053A  CALL	0x53A
    01B6 9104      LPM	R16,0(Z)
    01B7 D005      RCALL	_send_data_disp
(0057)    PORTB |= 0B11111011;                            //RCK送高电平
    01B8 B388      IN	R24,0x18
    01B9 6F8B      ORI	R24,0xFB
    01BA BB88      OUT	0x18,R24
    01BB D2DC      RCALL	pop_gset2
    01BC 9508      RET
_send_data_disp:
  count                --> R20
  send_data            --> R22
    01BD D2E2      RCALL	push_gset2
    01BE 2F60      MOV	R22,R16
(0058) }
(0059) void send_data_disp(unsigned char send_data)        //向595送数据串
(0060) {  
(0061)    unsigned char count;
(0062)    for(count =0;count<8;count++)
    01BF 2744      CLR	R20
    01C0 C012      RJMP	0x01D3
(0063)    {
(0064)       if(((send_data<<count)&0x80 )==0)
    01C1 2F06      MOV	R16,R22
    01C2 2F14      MOV	R17,R20
    01C3 D32A      RCALL	lsl8
    01C4 2F80      MOV	R24,R16
    01C5 7880      ANDI	R24,0x80
    01C6 F421      BNE	0x01CB
(0065) 	     PORTB &=0B11110111;     //送 data
    01C7 B388      IN	R24,0x18
    01C8 7F87      ANDI	R24,0xF7
    01C9 BB88      OUT	0x18,R24
    01CA C001      RJMP	0x01CC
(0066)       else
(0067) 	     PORTB |=0B00001000;
    01CB 9AC3      SBI	0x18,3
(0068) 	  PORTB |= 0B11111101;      //送SCK信号
    01CC B388      IN	R24,0x18
    01CD 6F8D      ORI	R24,0xFD
    01CE BB88      OUT	0x18,R24
(0069)       PORTB &= 0B00000010; 
    01CF B388      IN	R24,0x18
    01D0 7082      ANDI	R24,2
    01D1 BB88      OUT	0x18,R24
    01D2 9543      INC	R20
    01D3 3048      CPI	R20,0x8
    01D4 F360      BCS	0x01C1
    01D5 D2C2      RCALL	pop_gset2
    01D6 9508      RET
(0070)    }
(0071) }
(0072) /*  主显示,键值获取  */
(0073) void Disp_key_group(void)    //使用时只需对Disp_Buff[] 刷新。
(0074) {     
(0075)      disp_key_count++;
_Disp_key_group:
    01D7 91800068  LDS	R24,disp_key_count
    01D9 5F8F      SUBI	R24,0xFF
    01DA 93800068  STS	disp_key_count,R24
(0076) 	 if(disp_key_count>7)    //4个LED的板子(disp_key_count>3)
    01DC E087      LDI	R24,7
    01DD 90200068  LDS	R2,disp_key_count
    01DF 1582      CP	R24,R2
    01E0 F418      BCC	0x01E4
(0077) 	    disp_key_count =0;
    01E1 2422      CLR	R2
    01E2 92200068  STS	disp_key_count,R2
(0078) 	 disp_bit(Disp_Buff[disp_key_count],1 <<disp_key_count);
    01E4 91100068  LDS	R17,disp_key_count
    01E6 E001      LDI	R16,1
    01E7 D306      RCALL	lsl8
    01E8 2F20      MOV	R18,R16
    01E9 E680      LDI	R24,0x60
    01EA 940E0512  CALL	0x512
    01EC 8100      LDD	R16,Z+0
    01ED DFBC      RCALL	_disp_bit
(0079)      if((PINB & 1) ==0)
    01EE 99B0      SBIC	0x16,0
    01EF C006      RJMP	0x01F6
(0080) 	    key_buff[disp_key_count] =1;
    01F0 E780      LDI	R24,0x70
    01F1 940E0512  CALL	0x512
    01F3 E081      LDI	R24,1
    01F4 8380      STD	Z+0,R24
    01F5 C005      RJMP	0x01FB
(0081)      else 
(0082) 		key_buff[disp_key_count] =0;
    01F6 E780      LDI	R24,0x70
    01F7 940E0512  CALL	0x512
    01F9 2422      CLR	R2
    01FA 8220      STD	Z+0,R2
    01FB 9508      RET
_dec_hex_disp:
  temp                 --> R20
  i                    --> R22
    01FC D2A3      RCALL	push_gset2
(0083) }
(0084) void dec_hex_disp(void)
(0085) {/* 完整数以HEX显示  */
(0086)   unsigned char i;
(0087)   int temp;
(0088)   temp =disp_code;
    01FD 91400069  LDS	R20,disp_code
    01FF 9150006A  LDS	R21,disp_code+1
(0089)   for(i =0;i <7;i++)
    0201 2766      CLR	R22
    0202 C010      RJMP	0x0213
(0090) 	 Disp_Buff[i] =((temp>>i*4) &0x0f);
    0203 E084      LDI	R24,4
    0204 9F86      MUL	R24,R22
    0205 0190      MOVW	R18,R0
    0206 018A      MOVW	R16,R20
    0207 D289      RCALL	asr16
    0208 01C8      MOVW	R24,R16
    0209 708F      ANDI	R24,0xF
    020A 7090      ANDI	R25,0
    020B E6E0      LDI	R30,0x60
    020C E0F0      LDI	R31,0
    020D 2FA6      MOV	R26,R22
    020E 27BB      CLR	R27
    020F 0FAE      ADD	R26,R30
    0210 1FBF      ADC	R27,R31
    0211 938C      ST	R24,0(X)
    0212 9563      INC	R22
    0213 3067      CPI	R22,7
    0214 F370      BCS	0x0203
    0215 D282      RCALL	pop_gset2
    0216 9508      RET
(0091) }
(0092) /* 键值处理及去抖 */
(0093) void Key_num(void)
(0094) {
(0095)   char i;
(0096)   char j =0;
_Key_num:
  j                    --> R16
  i                    --> R18
    0217 2700      CLR	R16
(0097)   for(i =0;i <=7;i++)
    0218 2722      CLR	R18
    0219 C00D      RJMP	0x0227
(0098)   {
(0099)     if(key_buff[i] ==1)
    021A E780      LDI	R24,0x70
    021B E090      LDI	R25,0
    021C 2FE2      MOV	R30,R18
    021D 27FF      CLR	R31
    021E 0FE8      ADD	R30,R24
    021F 1FF9      ADC	R31,R25
    0220 8180      LDD	R24,Z+0
    0221 3081      CPI	R24,1
    0222 F419      BNE	0x0226
(0100) 	{
(0101) 	   new_key_num =(i);
    0223 9320006F  STS	new_key_num,R18
(0102) 	   j =1;//键盘缓冲区有键值标志
    0225 E001      LDI	R16,1
    0226 9523      INC	R18
    0227 E087      LDI	R24,7
    0228 1782      CP	R24,R18
    0229 F780      BCC	0x021A
(0103) 	}
(0104)   }
(0105)   if(j ==0 )
    022A 2300      TST	R16
    022B F419      BNE	0x022F
(0106)     new_key_num =0x0f;
    022C E08F      LDI	R24,0xF
    022D 9380006F  STS	new_key_num,R24
(0107)   if((old_key_num ==0x0f) && (new_key_num !=0x0f) && (key_delay ==0))//判断按键正按下
    022F 9180006E  LDS	R24,old_key_num
    0231 308F      CPI	R24,0xF
    0232 F461      BNE	0x023F
    0233 9180006F  LDS	R24,new_key_num
    0235 308F      CPI	R24,0xF
    0236 F041      BEQ	0x023F
    0237 9020007A  LDS	R2,key_delay
    0239 2022      TST	R2
    023A F421      BNE	0x023F
(0108)     key_num =new_key_num;
    023B 2E28      MOV	R2,R24
    023C 9220006D  STS	key_num,R2
    023E C029      RJMP	0x0268
(0109)   else if ((old_key_num !=0x0f) && (new_key_num ==old_key_num))//判断按键持续按下
    023F 9180006E  LDS	R24,old_key_num
    0241 308F      CPI	R24,0xF
    0242 F089      BEQ	0x0254
    0243 9030006F  LDS	R3,new_key_num
    0245 1638      CP	R3,R24
    0246 F469      BNE	0x0254
(0110)   {
(0111)      key_num =0x0f;//持续按键时不再给出键值,只给出空键值。   
    0247 E08F      LDI	R24,0xF
    0248 9380006D  STS	key_num,R24
(0112) 	 key_down_time++;//记录按键持续按下时间
    024A 91800078  LDS	R24,key_down_time
    024C 91900079  LDS	R25,key_down_time+1
    024E 9601      ADIW	R24,1
    024F 93900079  STS	key_down_time+1,R25
    0251 93800078  STS	key_down_time,R24
(0113)   }
    0253 C014      RJMP	0x0268
(0114)   else 
(0115)   {   
(0116) 	 if((old_key_num !=0x0f) && (new_key_num ==0x0f))
    0254 9180006E  LDS	R24,old_key_num
    0256 308F      CPI	R24,0xF
    0257 F081      BEQ	0x0268
    0258 9180006F  LDS	R24,new_key_num
    025A 308F      CPI	R24,0xF
    025B F461      BNE	0x0268
(0117)      {  
(0118)         key_num =0x0f;
    025C E08F      LDI	R24,0xF
    025D 9380006D  STS	key_num,R24
(0119) 	    key_down_time =0;//按键时间变量清零
    025F 2422      CLR	R2
    0260 2433      CLR	R3
    0261 92300079  STS	key_down_time+1,R3
    0263 92200078  STS	key_down_time,R2
(0120) 		key_delay=100;//去抖动延时100ms
    0265 E684      LDI	R24,0x64
    0266 9380007A  STS	key_delay,R24
(0121)      }
(0122)   }
(0123)   old_key_num =new_key_num;
    0268 9020006F  LDS	R2,new_key_num
    026A 9220006E  STS	old_key_num,R2
(0124)   if(key_delay >0)        //键盘去抖动延时变量
    026C 2422      CLR	R2
    026D 9030007A  LDS	R3,key_delay
    026F 1423      CP	R2,R3
    0270 F420      BCC	0x0275
(0125)       key_delay--;
    0271 2D83      MOV	R24,R3
    0272 5081      SUBI	R24,1
    0273 9380007A  STS	key_delay,R24
    0275 9508      RET
FILE: C:\DOCUME~1\fli\桌面\广告屏程序\display_board2.0.c
(0001) /*器件:AVR ATMEGA16、373缩存器、62256K扩展RAM
(0002) I/O定义:
(0003) SPI接口显示键盘:
(0004)          PB0:    键盘	  
(0005)          PB1:    RCK
(0006) 		 PB2:    SCK
(0007) 		 PB3:    DATA
(0008) SPI屏幕接口:
(0009)          PC7:    DATA
(0010) 		 PD3:    SCK
(0011) 		 PD4:    RCK
(0012) RAM:	
(0013)          PA0~7:  PC0~7   A0~A15地址线
(0014) 		 PC0~6:  DATA总线复用
(0015) 		 PD7:    ALE
(0016) 		 PD6:    WE
(0017) 		 PD5:    RE

⌨️ 快捷键说明

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