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

📄 写字库.lst

📁 一个LED特效显示程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
    004D E5CF      LDI	R28,0x5F
    004E E0D4      LDI	R29,4
    004F BFCD      OUT	0x3D,R28
    0050 BFDE      OUT	0x3E,R29
    0051 51CE      SUBI	R28,0x1E
    0052 40D0      SBCI	R29,0
    0053 EA0A      LDI	R16,0xAA
    0054 8308      STD	Y+0,R16
    0055 2400      CLR	R0
    0056 E9E3      LDI	R30,0x93
    0057 E0F0      LDI	R31,0
    0058 E010      LDI	R17,0
    0059 39EE      CPI	R30,0x9E
    005A 07F1      CPC	R31,R17
    005B F011      BEQ	0x005E
    005C 9201      ST	R0,Z+
    005D CFFB      RJMP	0x0059
    005E 8300      STD	Z+0,R16
    005F E6E7      LDI	R30,0x67
    0060 E0F0      LDI	R31,0
    0061 E6A0      LDI	R26,0x60
    0062 E0B0      LDI	R27,0
    0063 E010      LDI	R17,0
    0064 39EA      CPI	R30,0x9A
    0065 07F1      CPC	R31,R17
    0066 F021      BEQ	0x006B
    0067 95C8      LPM
    0068 9631      ADIW	R30,1
    0069 920D      ST	R0,X+
    006A CFF9      RJMP	0x0064
    006B D2A2      RCALL	_main
_exit:
    006C CFFF      RJMP	_exit
FILE: C:\DOCUME~1\fli\桌面\广告屏程序\写字库程序\disp_key.h
(0001) /*********************************************
(0002) *显示键盘头文件
(0003) *支持SPI显示键盘模块
(0004) 
(0005) 
(0006)      SPI接口显示键盘:
(0007)          PB0:    键盘	  
(0008)          PB1:    RCK
(0009) 		 PB2:    SCK
(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
    006D 9310007C  STS	delay_time_count+1,R17
    006F 9300007B  STS	delay_time_count,R16
(0049)   while(delay_time_count >0);
    0071 940E043B  CALL	0x43B
    0073 F7E9      BNE	0x0071
    0074 2033      TST	R3
    0075 F7D9      BNE	0x0071
    0076 9508      RET
_disp_bit:
  bitChoose            --> R22
  disCodeIndex         --> R20
    0077 D32B      RCALL	push_gset2
    0078 2F62      MOV	R22,R18
    0079 2F40      MOV	R20,R16
(0050) }
(0051) /*  显示函数  */
(0052) void disp_bit(char disCodeIndex,char bitChoose)     //按位显示
(0053) {
(0054)    PORTB &=0B11111101;                            //RCK送底电平
    007A B388      IN	R24,0x18
    007B 7F8D      ANDI	R24,0xFD
    007C BB88      OUT	0x18,R24
(0055)    send_data_disp(bitChoose);                       //送位选
    007D 2F06      MOV	R16,R22
    007E D00B      RCALL	_send_data_disp
(0056)    send_data_disp(DISCODE[disCodeIndex]);           //送段码
    007F E584      LDI	R24,0x54
    0080 E090      LDI	R25,0
    0081 2FE4      MOV	R30,R20
    0082 27FF      CLR	R31
    0083 0FE8      ADD	R30,R24
    0084 1FF9      ADC	R31,R25
    0085 9104      LPM	R16,0(Z)
    0086 D003      RCALL	_send_data_disp
(0057)    PORTB |=0B00000010;                          //RCK送高电平
    0087 9AC1      SBI	0x18,1
    0088 D312      RCALL	pop_gset2
    0089 9508      RET
_send_data_disp:
  count                --> R20
  send_data            --> R22
    008A D318      RCALL	push_gset2
    008B 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++)
    008C 2744      CLR	R20
    008D C010      RJMP	0x009E
(0063)    {
(0064)       if(((send_data<<count)&0x80 )==0)
    008E 2F06      MOV	R16,R22
    008F 2F14      MOV	R17,R20
    0090 D359      RCALL	lsl8
    0091 2F80      MOV	R24,R16
    0092 7880      ANDI	R24,0x80
    0093 F421      BNE	0x0098
(0065) 	     PORTB &=0B11110111;     //送 data
    0094 B388      IN	R24,0x18
    0095 7F87      ANDI	R24,0xF7
    0096 BB88      OUT	0x18,R24
    0097 C001      RJMP	0x0099
(0066)       else
(0067) 	     PORTB |=0B00001000;
    0098 9AC3      SBI	0x18,3
(0068) 	  PORTB |= 0B00000100;      //送SCK信号
    0099 9AC2      SBI	0x18,2
(0069)       PORTB &= 0B11111011; 
    009A B388      IN	R24,0x18
    009B 7F8B      ANDI	R24,0xFB
    009C BB88      OUT	0x18,R24
    009D 9543      INC	R20
    009E 3048      CPI	R20,0x8
    009F F370      BCS	0x008E
    00A0 D2FA      RCALL	pop_gset2
    00A1 9508      RET
(0070)    }
(0071) }
(0072) /*  主显示,键值获取  */
(0073) void Disp_key_group(void)    //使用时只需对Disp_Buff[] 刷新。
(0074) {     
(0075)      disp_key_count++;
_Disp_key_group:
    00A2 91800068  LDS	R24,disp_key_count
    00A4 5F8F      SUBI	R24,0xFF
    00A5 93800068  STS	disp_key_count,R24
(0076) 	 if(disp_key_count>7)    //4个LED的板子(disp_key_count>3)
    00A7 E087      LDI	R24,7
    00A8 90200068  LDS	R2,disp_key_count
    00AA 1582      CP	R24,R2
    00AB F418      BCC	0x00AF
(0077) 	    disp_key_count =0;
    00AC 2422      CLR	R2
    00AD 92200068  STS	disp_key_count,R2
(0078) 	 disp_bit(Disp_Buff[disp_key_count],1 <<disp_key_count);
    00AF 91100068  LDS	R17,disp_key_count
    00B1 E001      LDI	R16,1
    00B2 D337      RCALL	lsl8
    00B3 2F20      MOV	R18,R16
    00B4 E680      LDI	R24,0x60
    00B5 940E040D  CALL	0x40D
    00B7 8100      LDD	R16,Z+0
    00B8 DFBE      RCALL	_disp_bit
(0079)      if((PINB & 1) ==0)
    00B9 99B0      SBIC	0x16,0
    00BA C006      RJMP	0x00C1
(0080) 	    key_buff[disp_key_count] =1;
    00BB E780      LDI	R24,0x70
    00BC 940E040D  CALL	0x40D
    00BE E081      LDI	R24,1
    00BF 8380      STD	Z+0,R24
    00C0 C005      RJMP	0x00C6
(0081)      else 
(0082) 		key_buff[disp_key_count] =0;
    00C1 E780      LDI	R24,0x70
    00C2 940E040D  CALL	0x40D
    00C4 2422      CLR	R2
    00C5 8220      STD	Z+0,R2
    00C6 9508      RET
_dec_hex_disp:
  temp                 --> R20
  i                    --> R22
    00C7 D2DB      RCALL	push_gset2
(0083) }
(0084) void dec_hex_disp(void)
(0085) {/* 完整数以HEX显示  */
(0086)   unsigned char i;
(0087)   int temp;
(0088)   temp =disp_code;
    00C8 91400069  LDS	R20,disp_code
    00CA 9150006A  LDS	R21,disp_code+1
(0089)   for(i =0;i <7;i++)
    00CC 2766      CLR	R22
    00CD C010      RJMP	0x00DE
(0090) 	 Disp_Buff[i] =((temp>>i*4) &0x0f);
    00CE E084      LDI	R24,4
    00CF 9F86      MUL	R24,R22
    00D0 0190      MOVW	R18,R0
    00D1 018A      MOVW	R16,R20
    00D2 D2C1      RCALL	asr16
    00D3 01C8      MOVW	R24,R16
    00D4 708F      ANDI	R24,0xF
    00D5 7090      ANDI	R25,0
    00D6 E6E0      LDI	R30,0x60
    00D7 E0F0      LDI	R31,0
    00D8 2FA6      MOV	R26,R22
    00D9 27BB      CLR	R27
    00DA 0FAE      ADD	R26,R30
    00DB 1FBF      ADC	R27,R31
    00DC 938C      ST	R24,0(X)
    00DD 9563      INC	R22
    00DE 3067      CPI	R22,7
    00DF F370      BCS	0x00CE
    00E0 D2BA      RCALL	pop_gset2
    00E1 9508      RET
(0091) }
(0092) /* 键值处理及去抖 */
(0093) void Key_num(void)
(0094) {
(0095)   char i;
(0096)   char j =0;
_Key_num:
  j                    --> R16
  i                    --> R18
    00E2 2700      CLR	R16
(0097)   if(key_delay >0)        //键盘去抖动延时变量
    00E3 2422      CLR	R2
    00E4 9030007A  LDS	R3,key_delay
    00E6 1423      CP	R2,R3
    00E7 F410      BCC	0x00EA
    00E8 940E0446  CALL	0x446
(0098)       key_delay--;
(0099)   for(i =0;i <=7;i++)
    00EA 2722      CLR	R18
    00EB C00D      RJMP	0x00F9
(0100)   {
(0101)     if(key_buff[i] ==1)
    00EC E780      LDI	R24,0x70
    00ED E090      LDI	R25,0
    00EE 2FE2      MOV	R30,R18
    00EF 27FF      CLR	R31
    00F0 0FE8      ADD	R30,R24
    00F1 1FF9      ADC	R31,R25
    00F2 8180      LDD	R24,Z+0
    00F3 3081      CPI	R24,1
    00F4 F419      BNE	0x00F8
(0102) 	{
(0103) 	   new_key_num =(i);
    00F5 9320006F  STS	new_key_num,R18
(0104) 	   j =1;//键盘缓冲区有键值标志
    00F7 E001      LDI	R16,1
    00F8 9523      INC	R18
    00F9 E087      LDI	R24,7
    00FA 1782      CP	R24,R18
    00FB F780      BCC	0x00EC
(0105) 	}
(0106)   }
(0107)   if(j ==0 )
    00FC 2300      TST	R16
    00FD F419      BNE	0x0101
(0108)     new_key_num =0x0f;
    00FE E08F      LDI	R24,0xF
    00FF 9380006F  STS	new_key_num,R24
(0109)   if((old_key_num ==0x0f) && (new_key_num !=0x0f) && (key_delay ==0))//判断按键正按下
    0101 9180006E  LDS	R24,old_key_num
    0103 308F      CPI	R24,0xF
    0104 F461      BNE	0x0111
    0105 9180006F  LDS	R24,new_key_num
    0107 308F      CPI	R24,0xF
    0108 F041      BEQ	0x0111
    0109 9020007A  LDS	R2,key_delay
    010B 2022      TST	R2
    010C F421      BNE	0x0111
(0110)     key_num =new_key_num;
    010D 2E28      MOV	R2,R24
    010E 9220006D  STS	key_num,R2
    0110 C029      RJMP	0x013A
(0111)   else if ((old_key_num !=0x0f) && (new_key_num ==old_key_num))//判断按键持续按下
    0111 9180006E  LDS	R24,old_key_num
    0113 308F      CPI	R24,0xF
    0114 F089      BEQ	0x0126
    0115 9030006F  LDS	R3,new_key_num
    0117 1638      CP	R3,R24
    0118 F469      BNE	0x0126
(0112)   {
(0113)      key_num =0x0f;//持续按键时不再给出键值,只给出空键值。   
    0119 E08F      LDI	R24,0xF
    011A 9380006D  STS	key_num,R24
(0114) 	 key_down_time++;//记录按键持续按下时间
    011C 91800078  LDS	R24,key_down_time
    011E 91900079  LDS	R25,key_down_time+1
    0120 9601      ADIW	R24,1
    0121 93900079  STS	key_down_time+1,R25
    0123 93800078  STS	key_down_time,R24
(0115)   }
    0125 C014      RJMP	0x013A
(0116)   else 
(0117)   {   
(0118) 	 if((old_key_num !=0x0f) && (new_key_num ==0x0f))
    0126 9180006E  LDS	R24,old_key_num
    0128 308F      CPI	R24,0xF
    0129 F081      BEQ	0x013A
    012A 9180006F  LDS	R24,new_key_num
    012C 308F      CPI	R24,0xF
    012D F461      BNE	0x013A
(0119)      {  
(0120)         key_num =0x0f;
    012E E08F      LDI	R24,0xF
    012F 9380006D  STS	key_num,R24
(0121) 	    key_down_time =0;//按键时间变量清零
    0131 2422      CLR	R2
    0132 2433      CLR	R3
    0133 92300079  STS	key_down_time+1,R3
    0135 92200078  STS	key_down_time,R2
(0122) 		key_delay=100;//去抖动延时100ms
    0137 E684      LDI	R24,0x64
    0138 9380007A  STS	key_delay,R24
(0123)      }
(0124)   }
(0125)   old_key_num =new_key_num;
    013A 9020006F  LDS	R2,new_key_num
    013C 9220006E  STS	old_key_num,R2
    013E 9508      RET
FILE: C:\DOCUME~1\fli\桌面\广告屏程序\写字库程序\display_board2.1.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
(0018) 下载:		   
(0019) 		 PB4~7:  SPI通讯和下载端口
(0020)          PD0~1:  UART通讯口
(0021) 电机:
(0022) 		 PD2:  外中断,电机脉冲
(0023) */
(0024) 
(0025) /********************************************************
(0026)     广告屏程序第二次改版----主显示控制模块程序2.0
(0027)                
(0028) 			   1、程序采用模块化构架,提高了可读性
(0029)                2、此程序支持第二套广告屏硬件
(0030)                3、创建时间:2004年11月23日
(0031) 			   4、作者:西南科技大学 电子设计大赛第8大组
(0032)                注意:需要包括 :<disp_key.h>
(0033) 							   
(0034) ********************************************************/
(0035) 
(0036) 
(0037) 
(0038) /***************************************************
(0039)             头文件申明
(0040) ****************************************************/

⌨️ 快捷键说明

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