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

📄 写字库.lst

📁 一个LED特效显示程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0041) 
(0042) #include<iom16v.h>
(0043) #include <macros.h>
(0044) #include "disp_key.h"
(0045) /************************************************
(0046)             宏定义
(0047) **************************************************/
(0048) //RAM
(0049) #define ALE  7                   //定义锁存脚
(0050) #define WE   6                   //定义写允许位
(0051) #define RE   5                   //定义读允许位
(0052) 
(0053) 
(0054) #pragma interrupt_handler exi_int0:2   	//外部中断
(0055) #pragma interrupt_handler timer1_vof:9   	//定时器1中断
(0056) #pragma  interrupt_handler usart_rcx:12   //USART接受中断
(0057) /************************************************
(0058)             全局变量申明
(0059) **************************************************/
(0060) //基本全局变量
(0061) int sys_cont =0;
(0062) //显示缓冲区
(0063) char DispTemp[8];
(0064) char Head[3];
(0065) //按键处理
(0066) 
(0067) //数脉冲
(0068) int PDataY =0;
(0069) int PDataYMax =154;
(0070) int PDataYMin =4;
(0071) 
(0072) //UART接收数据
(0073) char FileEnd =1;
(0074) char HeadLoad =0;
(0075) char HeadEN =1;
(0076) int  DataIndex =0;
(0077) int  FileLength =0;
(0078) unsigned int time_out_ms=1; 		 //接收数据时限
(0079) unsigned char time_out_s=0; 		 //试图通讯重新时限
(0080) 
(0081) //特效处理
(0082) char DispModel =0;
(0083) int  ModelDelayTime =0;
(0084) char ModelContJuge=0;
(0085) /************************************************
(0086)              函数申明
(0087) **************************************************/
(0088) //基本初始化
(0089) void port_int(void);
(0090) void timer_int(void);
(0091) void uart_int(void);
(0092) void device_int(void);
(0093) 
(0094) //按键显示事件处理
(0095) void Display_event(void);        //显示事件
(0096) void KEY_event(void);            //按键事件处理
(0097) 
(0098) //特效处理
(0099) void Disp_Model(void);           //屏幕显示特效模式
(0100) 
(0101) //外部RAM读写操作
(0102) void data_store(char data);
(0103) char RAM_Read(int adress);
(0104) void RAM_Write(int adress,char data);
(0105) 
(0106) //显示屏数据发送
(0107) void Screen_send(void);
(0108) void SPI_data_send(unsigned char send_data);
(0109) 
(0110) //UART收发数据
(0111) void uart_TX(unsigned char data);    
(0112) void uart_time_out(void);
(0113) 
(0114) //中断函数
(0115) void exi_int0(void);
(0116) void timer1_vof(void);
(0117) void usart_rcx(void);
(0118) /*************************************************
(0119) *             子函数区                           *
(0120) *                                                *
(0121) *************************************************/
(0122) 
(0123) /****************************************
(0124)           端口定义
(0125) ****************************************/
(0126) void port_int(void)
(0127) {
(0128)      DDRA =0XFF;
_port_int:
    013F EF8F      LDI	R24,0xFF
    0140 BB8A      OUT	0x1A,R24
(0129) 	 PORTA =0XFF;
    0141 BB8B      OUT	0x1B,R24
(0130) 	 DDRB =0B00001110;
    0142 E08E      LDI	R24,0xE
    0143 BB87      OUT	0x17,R24
(0131) 	 PORTB =0XFF;
    0144 EF8F      LDI	R24,0xFF
    0145 BB88      OUT	0x18,R24
(0132) 	 DDRC =0XFF;
    0146 BB84      OUT	0x14,R24
(0133) 	 PORTC =0XFF;
    0147 BB85      OUT	0x15,R24
(0134) 	 DDRD  = 0xF8;	        //
    0148 EF88      LDI	R24,0xF8
    0149 BB81      OUT	0x11,R24
(0135)  	 PORTD = 0XFF;
    014A EF8F      LDI	R24,0xFF
    014B BB82      OUT	0x12,R24
    014C 9508      RET
(0136) }
(0137) 
(0138) /****************************************
(0139)           定时器
(0140) ****************************************/
(0141) void timer_int(void)
(0142) { 
(0143)      TCCR1B = 0x00; //stop
_timer_int:
    014D 2422      CLR	R2
    014E BC2E      OUT	0x2E,R2
    014F 940E0450  CALL	0x450
(0144)  	 TCNT1H = 0xd4; //setup
(0145)  	 TCNT1L = 0xce;
(0146)  	 TCCR1A = 0x00;
    0151 BC2F      OUT	0x2F,R2
(0147)  	 TCCR1B = 0x01; //start Timer
    0152 E081      LDI	R24,1
    0153 BD8E      OUT	0x2E,R24
(0148)      TIMSK = 0x04;
    0154 E084      LDI	R24,4
    0155 BF89      OUT	0x39,R24
    0156 9508      RET
(0149) 
(0150) }
(0151) 
(0152) /****************************************
(0153)           外中断
(0154) ****************************************/
(0155) void exit_int(void)
(0156) {
(0157)      GICR  = 0x40; 
_exit_int:
    0157 E480      LDI	R24,0x40
    0158 BF8B      OUT	0x3B,R24
(0158)   	 MCUCR = 0x02;
    0159 E082      LDI	R24,2
    015A BF85      OUT	0x35,R24
    015B 9508      RET
(0159) 
(0160) }
(0161) 
(0162) /****************************************
(0163)           串口通讯
(0164) ****************************************/
(0165) void uart_int(void)
(0166) {
(0167)       UCSRB = 0x00; //disable while setting baud rate
_uart_int:
    015C 2422      CLR	R2
    015D B82A      OUT	0x0A,R2
(0168)       UCSRA = 0x00;
    015E B82B      OUT	0x0B,R2
(0169)       UCSRC = 0x00;
    015F BC20      OUT	0x20,R2
(0170)       UBRR =5;      //设置波特率115200
    0160 E085      LDI	R24,5
    0161 B989      OUT	0x09,R24
(0171)       UCSRB = 0x98; //接受中断允许,接受允许,发送允许
    0162 E988      LDI	R24,0x98
    0163 B98A      OUT	0x0A,R24
(0172)       UCSRC = 0xBc; //8BIT, 奇校验,2停止位
    0164 EB8C      LDI	R24,0xBC
    0165 BD80      OUT	0x20,R24
    0166 9508      RET
(0173) }
(0174) 
(0175) /****************************************
(0176)           器件初始化函数
(0177) ****************************************/
(0178) void device_int(void)
(0179) {
(0180)      CLI();
_device_int:
    0167 94F8      BCLR	7
(0181)    	 port_int();
    0168 DFD6      RCALL	_port_int
(0182)    	 timer_int();
    0169 DFE3      RCALL	_timer_int
(0183)    	 exit_int();
    016A DFEC      RCALL	_exit_int
(0184)    	 uart_int();
    016B DFF0      RCALL	_uart_int
(0185) 	 SEI(); 
    016C 9478      BSET	7
    016D 9508      RET
(0186) }
(0187) 
(0188) /****************************************
(0189)           串口收发数据
(0190) ****************************************/
(0191) void uart_TX(unsigned char data)
(0192) {
(0193)     UCSRA |=0X40;         //标志清零
_uart_TX:
  data                 --> R16
    016E 9A5E      SBI	0x0B,6
(0194) 	UDR =data;
    016F B90C      OUT	0x0C,R16
    0170 9508      RET
    0171 940E042C  CALL	0x42C
(0195) }
(0196) //***************
(0197) //传输超时处理,当time_out_ms大于设定值的时候,等待等待20S,并且
(0198) //一直发送标志符号,超过20S以后,进行错误处理	 
(0199) void uart_time_out(void)
(0200) {
(0201) 	 time_out_ms++;
_uart_time_out:
    0173 9601      ADIW	R24,1
    0174 940E041D  CALL	0x41D
(0202) 	 if (HeadEN ==0 && FileEnd ==0 && time_out_ms >=800 )
    0176 90200087  LDS	R2,HeadEN
    0178 2022      TST	R2
    0179 F521      BNE	0x019E
    017A 90200085  LDS	R2,FileEnd
    017C 2022      TST	R2
    017D F501      BNE	0x019E
    017E 3280      CPI	R24,0x20
    017F E0E3      LDI	R30,3
    0180 079E      CPC	R25,R30
    0181 F0E0      BCS	0x019E
(0203) 	 {
(0204) 		if(sys_cont ==0)		 //秒记时 
    0182 9020007D  LDS	R2,sys_cont
    0184 9030007E  LDS	R3,sys_cont+1
    0186 2022      TST	R2
    0187 F479      BNE	0x0197
    0188 2033      TST	R3
    0189 F469      BNE	0x0197
(0205) 		{
(0206) 		   time_out_s++;
    018A 9180008E  LDS	R24,time_out_s
    018C 5F8F      SUBI	R24,0xFF
    018D 9380008E  STS	time_out_s,R24
(0207) 		   if (time_out_s ==20)	 //结束标志
    018F 3184      CPI	R24,0x14
    0190 F431      BNE	0x0197
(0208) 		   {
(0209) 			  time_out_ms=1;	 //闲置标志
    0191 E081      LDI	R24,1
    0192 E090      LDI	R25,0
    0193 940E041D  CALL	0x41D
    0195 940E044B  CALL	0x44B
(0210) 			  HeadEN=1;
(0211) 			  FileEnd=1;
(0212) 			  //进行错误处理,并要跳出此结构体
(0213) 			  {/**********/}
(0214) 		   }
(0215) 		}
(0216) 		uart_TX(0xAA);			 //重复发送标志位
    0197 EA0A      LDI	R16,0xAA
    0198 DFD5      RCALL	_uart_TX
    0199 940E042C  CALL	0x42C
(0217) 		time_out_ms--;   
    019B 9701      SBIW	R24,1
    019C 940E041D  CALL	0x41D
(0218) 	 }
(0219) 	 if (time_out_ms ==1000)
    019E 940E042C  CALL	0x42C
    01A0 3E88      CPI	R24,0xE8
    01A1 E0E3      LDI	R30,3
    01A2 079E      CPC	R25,R30
    01A3 F421      BNE	0x01A8
(0220) 	 	time_out_ms=1;	   	 //1 表示空闲状态
    01A4 E081      LDI	R24,1
    01A5 E090      LDI	R25,0
    01A6 940E041D  CALL	0x41D
    01A8 9508      RET
_SPI_data_send:
  count                --> R20
  send_data            --> R22
    01A9 D1F9      RCALL	push_gset2
    01AA 2F60      MOV	R22,R16
(0221) }
(0222) /***************************************************
(0223)                向显示屏送数据
(0224) ***************************************************/
(0225) 
(0226) void SPI_data_send(unsigned char send_data)       //向595送数据串
(0227) {  
(0228)    unsigned char count;
(0229)    for(count =0;count<8;count++)
    01AB 2744      CLR	R20
    01AC C010      RJMP	0x01BD
(0230)    {
(0231)       if(((send_data<<count)&0x80 )==0)
    01AD 2F06      MOV	R16,R22
    01AE 2F14      MOV	R17,R20
    01AF D23A      RCALL	lsl8
    01B0 2F80      MOV	R24,R16
    01B1 7880      ANDI	R24,0x80
    01B2 F421      BNE	0x01B7
(0232) 	     PORTC &= 0b01111111;      	   			   //送 data
    01B3 B385      IN	R24,0x15
    01B4 778F      ANDI	R24,0x7F
    01B5 BB85      OUT	0x15,R24
    01B6 C001      RJMP	0x01B8
(0233)       else
(0234) 	     PORTC |= 0b10000000;
    01B7 9AAF      SBI	0x15,7
(0235) 	  PORTD |=0b00001000;        				   //送SCK信号
    01B8 9A93      SBI	0x12,3
(0236)       PORTD &=0b11110111;
    01B9 B382      IN	R24,0x12
    01BA 7F87      ANDI	R24,0xF7
    01BB BB82      OUT	0x12,R24
    01BC 9543      INC	R20
    01BD 3048      CPI	R20,0x8
    01BE F370      BCS	0x01AD
    01BF D1DB      RCALL	pop_gset2
    01C0 9508      RET
_Screen_send:
  i                    --> R20
    01C1 D1E3      RCALL	push_gset1
(0237)    }
(0238) }
(0239) void Screen_send(void)
(0240) {
(0241)     char i;
(0242) 	PORTD &= 0b11101111;       //送RCK信号,底电平                
    01C2 B382      IN	R24,0x12
    01C3 7E8F      ANDI	R24,0xEF
    01C4 BB82      OUT	0x12,R24
(0243) 	for(i =0;i <8;i++)
    01C5 2744      CLR	R20
    01C6 C003      RJMP	0x01CA
(0244) 	{
(0245) 	    SPI_data_send(0xff);//sys_cont);   //DispTemp[i]);  
    01C7 EF0F      LDI	R16,0xFF
    01C8 DFE0      RCALL	_SPI_data_send
    01C9 9543      INC	R20
    01CA 3048      CPI	R20,0x8
    01CB F3D8      BCS	0x01C7
(0246)     }
(0247) 	PORTD |= 0b00010000;       //关闭RCK信号,高电平
    01CC 9A94      SBI	0x12,4
    01CD D1DA      RCALL	pop_gset1
    01CE 9508      RET
(0248) 
(0249) }
(0250) /**************************************************
(0251) 			 数据接受,外部RAM读写
(0252) ****************************************************/
(0253) //写外部RAM
(0254) void RAM_Write(int adress,char data)
(0255) {
(0256)    PORTD |=0B11100000;           //关ALE  读关闭  写关闭
_RAM_Write:
  data                 --> R18
  adress               --> R16
    01CF 940E03F0  CALL	<created procedures>
(0257)    DDRA =0XFF;
(0258)    PORTA =adress&0xff;
(0259)    PORTC =(adress >>8)&0xff;
(0260)    PORTD &=0b01111111;                         
(0261)    PORTA =data;
    01D1 BB2B      OUT	0x1B,R18
(0262)    PORTD &=0b10111111;
    01D2 B382      IN	R24,0x12
    01D3 7B8F      ANDI	R24,0xBF
    01D4 BB82      OUT	0x12,R24
    01D5 9508      RET
_RAM_Read:
  temp                 --> R20
  adress               --> R16
    01D6 D1CE      RCALL	push_gset1
    01D7 940E03F0  CALL	<created procedures>
(0263)    //PORTD |=0B01100000;           //关ALE  读关闭  写关闭
(0264) }
(0265) //读外部RAM
(0266) char RAM_Read(int adress)
(0267) {
(0268)    char temp;
(0269)    PORTD |=0B11100000;           //关ALE  读关闭  写关闭
(0270)    DDRA =0XFF;
(0271)    PORTA =adress&0xff;
(0272)    PORTC =(adress >>8)&0xff;
(0273)    PORTD &=0b01111111;                         
(0274)    PORTD &=0b11011111;
    01D9 B382      IN	R24,0x12

⌨️ 快捷键说明

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