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

📄 qingxi.lst

📁 超简单的编码开关(单键飞梭开关)解码程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0249) #pragma interrupt_handler timer1_ovf_isr:10
(0250) void timer1_ovf_isr(void)
(0251) {
(0252)  //TIMER1 has overflowed
(0253)  TCNT1H = 0xFD; //reload counter high value
    0C3E EF8D      LDI	R24,0xFD
    0C3F BD8D      OUT	0x2D,R24
(0254)  TCNT1L = 0x30; //reload counter low value
    0C40 E380      LDI	R24,0x30
    0C41 BD8C      OUT	0x2C,R24
(0255)  //ms100_flag=1;   //100mS标志置位
(0256)  UpdateFlag=1;   //100mS标志置位
    0C42 E081      LDI	R24,1
    0C43 93800174  STS	UpdateFlag,R24
(0257)  if (S_flag<9) S_flag++;   //1S标志置位
    0C45 91800173  LDS	R24,S_flag
    0C47 3089      CPI	R24,0x9
    0C48 F420      BCC	0x0C4D
    0C49 5F8F      SUBI	R24,0xFF
    0C4A 93800173  STS	S_flag,R24
    0C4C C017      RJMP	0x0C64
(0258)  else
(0259)     {
(0260) 	TCNT0=0;
    0C4D 2422      CLR	R2
    0C4E BE22      OUT	0x32,R2
(0261) 	S_flag=0;
    0C4F 92200173  STS	S_flag,R2
(0262)     Freq=Freq_H*256+TCNT0;
    0C51 91200178  LDS	R18,Freq_H
    0C53 2733      CLR	R19
    0C54 E000      LDI	R16,0
    0C55 E011      LDI	R17,1
    0C56 940E1353  CALL	empy16s
    0C58 0118      MOVW	R2,R16
    0C59 B642      IN	R4,0x32
    0C5A 2455      CLR	R5
    0C5B 0C24      ADD	R2,R4
    0C5C 1C35      ADC	R3,R5
    0C5D 92300172  STS	Freq+1,R3
    0C5F 92200171  STS	Freq,R2
(0263) 	Freq_H=0;
    0C61 2422      CLR	R2
    0C62 92200178  STS	Freq_H,R2
(0264) 	}   
    0C64 9029      LD	R2,Y+
    0C65 BE2F      OUT	0x3F,R2
    0C66 9199      LD	R25,Y+
    0C67 9189      LD	R24,Y+
    0C68 9139      LD	R19,Y+
    0C69 9129      LD	R18,Y+
    0C6A 9119      LD	R17,Y+
    0C6B 9109      LD	R16,Y+
    0C6C 9059      LD	R5,Y+
    0C6D 9049      LD	R4,Y+
    0C6E 9039      LD	R3,Y+
    0C6F 9029      LD	R2,Y+
    0C70 9518      RETI
(0265) }
(0266) //*/
(0267) 
(0268) //ADC initialize
(0269) // Conversion time: 208uS
(0270) void adc_init(void)
(0271) {
(0272)  ADCSR = 0x00; //disable adc
_adc_init:
    0C71 2422      CLR	R2
    0C72 B826      OUT	0x06,R2
(0273)  ADMUX = 0x00; //select adc input 0
    0C73 B827      OUT	0x07,R2
(0274)  ACSR  = 0x80;
    0C74 E880      LDI	R24,0x80
    0C75 B988      OUT	0x08,R24
(0275)  ADCSR = 0xEF; //0xEE
    0C76 EE8F      LDI	R24,0xEF
    0C77 B986      OUT	0x06,R24
    0C78 9508      RET
(0276) }
(0277) 
(0278) #pragma interrupt_handler adc_isr:17
(0279) void adc_isr(void)
(0280) {
_adc_isr:
    0C79 9518      RETI
(0281)  //conversion complete, read value (int) using...
(0282)  //  readadc=ADCL;            //Read 8 low bits first (important)
(0283) }
(0284) 
(0285) 
(0286) //*/
(0287) //串行通讯设置
(0288) //UART0 initialize
(0289) // 7.3728MHz
(0290) // desired baud rate: 57600
(0291) // actual: baud rate:57600 (0.0%)
(0292) // char size: 8 bit
(0293) // parity: Disabled
(0294) void uart0_init(void)
(0295) {
(0296)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    0C7A 2422      CLR	R2
    0C7B B82A      OUT	0x0A,R2
(0297)  UCSRA = 0x00;
    0C7C B82B      OUT	0x0B,R2
(0298)  UCSRC = BIT(URSEL) | 0x06;
    0C7D E886      LDI	R24,0x86
    0C7E BD80      OUT	0x20,R24
(0299)  UBRRL = 0x07; //set baud rate lo
    0C7F E087      LDI	R24,7
    0C80 B989      OUT	0x09,R24
(0300)  UBRRH = 0x00; //set baud rate hi
    0C81 BC20      OUT	0x20,R2
(0301)  UCSRB = 0x98;
    0C82 E988      LDI	R24,0x98
    0C83 B98A      OUT	0x0A,R24
    0C84 9508      RET
(0302) }
(0303) //*/
(0304) 
(0305) 
(0306) /*8MHz
(0307) //UART0 initialize
(0308) // desired baud rate: 19200
(0309) // actual: baud rate:19231 (0.2%)
(0310) // char size: 8 bit
(0311) // parity: Disabled
(0312) void uart0_init(void)
(0313) {
(0314)  UCSRB = 0x00; //disable while setting baud rate
(0315)  UCSRA = 0x00;
(0316)  UCSRC = BIT(URSEL) | 0x06;
(0317)  UBRRL = 0x19; //set baud rate lo
(0318)  UBRRH = 0x00; //set baud rate hi
(0319)  UCSRB = 0x98;
(0320) }
(0321) //*/
(0322) 
(0323) 
(0324) //串行通讯接受中断入口服务程序
(0325) #pragma interrupt_handler uart0_rx_isr:14
(0326) void uart0_rx_isr(void)
(0327) {
_uart0_rx_isr:
    0C85 9518      RETI
(0328)  //uart has received a character in UDR
(0329) }
(0330) 
(0331) 
(0332) //串口发送字符串
(0333) void  uart_str(unsigned char *str) {
_uart_str:
  str                  --> R16
    0C86 C006      RJMP	0x0C8D
(0334)      while(*str)
(0335) 	  {
(0336) 		while (!(UCSRA&(1<<UDRE)));
    0C87 9B5D      SBIS	0x0B,5
    0C88 CFFE      RJMP	0x0C87
(0337) 		UDR=*str++; 
    0C89 01F8      MOVW	R30,R16
    0C8A 9021      LD	R2,Z+
    0C8B 018F      MOVW	R16,R30
    0C8C B82C      OUT	0x0C,R2
    0C8D 01F8      MOVW	R30,R16
    0C8E 8020      LDD	R2,Z+0
    0C8F 2022      TST	R2
    0C90 F7B1      BNE	0x0C87
    0C91 9508      RET
(0338) 	 }	
(0339) }
(0340) 	 
(0341) 
(0342) //等待发送完一个字节 
(0343) void wait_tx() {	             
(0344) 	while(!(UCSRA&0x40));
_wait_tx:
    0C92 9B5E      SBIS	0x0B,6
    0C93 CFFE      RJMP	_wait_tx
(0345)     UCSRA|=0x40; 
    0C94 9A5E      SBI	0x0B,6
    0C95 9508      RET
_int0_isr:
    0C96 922A      ST	R2,-Y
    0C97 938A      ST	R24,-Y
    0C98 939A      ST	R25,-Y
    0C99 B62F      IN	R2,0x3F
    0C9A 922A      ST	R2,-Y
(0346) 	}    
(0347) 
(0348) 
(0349) //外部中断0,用于编码开关解码,解码图:
(0350) //A -|
(0351) //   |   -----|__________|----------|____________
(0352) //C -|
(0353) //
(0354) //B -|
(0355) //   |   ----------|__________|----------|____________
(0356) //C -| 
(0357) //             CW  ===>>> ROTATION
(0358) //外部中断设置(ISC01=0,ISC00=1): INT0 引脚上任意的逻辑电平变化都将引发中断
(0359) #pragma interrupt_handler int0_isr:2
(0360) void int0_isr(void)
(0361) {
(0362)  //external interupt on INT0
(0363)     GICR=0;    //禁止外部中断
    0C9B 2422      CLR	R2
    0C9C BE2B      OUT	0x3B,R2
(0364)     if ((PIND & 0x04)==0)           //先判断是高电平产生的中断还是低点平的中断
    0C9D 9982      SBIC	0x10,2
    0C9E C013      RJMP	0x0CB2
(0365) 		if ((PINA & 0x02)==0)       
    0C9F 99C9      SBIC	0x19,1
    0CA0 C008      RJMP	0x0CA9
(0366) 		    {
(0367) 			 keycounter--; 
    0CA1 91800177  LDS	R24,keycounter
    0CA3 5081      SUBI	R24,1
    0CA4 93800177  STS	keycounter,R24
(0368) 		     keydirection=0;
    0CA6 92200176  STS	keydirection,R2
(0369) 		    } 
    0CA8 C01C      RJMP	0x0CC5
(0370) 		else
(0371) 		    {
(0372) 			 keycounter++;
    0CA9 91800177  LDS	R24,keycounter
    0CAB 5F8F      SUBI	R24,0xFF
    0CAC 93800177  STS	keycounter,R24
(0373) 		     keydirection=1;
    0CAE E081      LDI	R24,1
    0CAF 93800176  STS	keydirection,R24
(0374) 			 }
    0CB1 C013      RJMP	0x0CC5
(0375) 			 
(0376) 		//beeps(1);
(0377) 	else
(0378)        if ((PINA & 0x02)==0)
    0CB2 99C9      SBIC	0x19,1
    0CB3 C009      RJMP	0x0CBD
(0379) 		   {
(0380) 		    keycounter++; 
    0CB4 91800177  LDS	R24,keycounter
    0CB6 5F8F      SUBI	R24,0xFF
    0CB7 93800177  STS	keycounter,R24
(0381) 		    keydirection=1;
    0CB9 E081      LDI	R24,1
    0CBA 93800176  STS	keydirection,R24
(0382) 			} 
    0CBC C008      RJMP	0x0CC5
(0383) 		else
(0384) 		    {
(0385) 			keycounter--;
    0CBD 91800177  LDS	R24,keycounter
    0CBF 5081      SUBI	R24,1
    0CC0 93800177  STS	keycounter,R24
(0386) 	        keydirection=0;
    0CC2 2422      CLR	R2
    0CC3 92200176  STS	keydirection,R2
(0387) 			}
(0388) 	GICR=0x40;
    0CC5 E480      LDI	R24,0x40
    0CC6 BF8B      OUT	0x3B,R24
    0CC7 9029      LD	R2,Y+
    0CC8 BE2F      OUT	0x3F,R2
    0CC9 9199      LD	R25,Y+
    0CCA 9189      LD	R24,Y+
    0CCB 9029      LD	R2,Y+
    0CCC 9518      RETI
(0389) }
(0390) 
(0391) 
(0392) //**********************************************************************************
(0393) //**********************************************************************************
(0394) //T6963 LCD 显示模块驱动代码段
(0395) //**********************************************************************************
(0396) //**********************************************************************************
(0397) 
(0398) 
(0399) /*发送单字节数据到LCD屏*/
(0400) void lcd_wd(uchar lcd_data)
(0401) {
(0402)         LCD_DDR          = 0X00;
_lcd_wd:
  lcd_data             --> R16
    0CCD 2422      CLR	R2
    0CCE BA24      OUT	0x14,R2
(0403)         LCD_CODE_P      &= ~(BIT(LCD_RD) | BIT(LCD_CE));
    0CCF B382      IN	R24,0x12
    0CD0 7C8F      ANDI	R24,0xCF
    0CD1 BB82      OUT	0x12,R24
(0404)         /*LCD_CODE_P       = 0XF9;*/
(0405)         while((LCD_DATA & 0X03) != 0X03);
    0CD2 B383      IN	R24,0x13
    0CD3 7083      ANDI	R24,3
    0CD4 3083      CPI	R24,3
    0CD5 F7E1      BNE	0x0CD2
(0406)         LCD_RD_H;
    0CD6 9A94      SBI	0x12,4
(0407)         LCD_CD_L;
    0CD7 9893      CBI	0x12,3
(0408)         LCD_RW_L;
    0CD8 9897      CBI	0x12,7
(0409)         /*LCD_CODE_P       = 0XF2;*/
(0410)         LCD_DDR          = 0XFF;
    0CD9 EF8F      LDI	R24,0xFF
    0CDA BB84      OUT	0x14,R24
(0411)         LCD_PORT         = lcd_data;
    0CDB BB05      OUT	0x15,R16
(0412)         asm("NOP");
    0CDC 0000      NOP
(0413) 		LCD_CODE_P       |= (BIT(LCD_RW) | BIT(LCD_RD) | BIT(LCD_CD) | BIT(LCD_CE));
    0CDD B382      IN	R24,0x12
    0CDE 6B88      ORI	R24,0xB8
    0CDF BB82      OUT	0x12,R24
(0414) 		asm("NOP");
    0CE0 0000      NOP
(0415) 		asm("NOP");
    0CE1 0000      NOP
    0CE2 9508      RET
(0416) }
(0417) 
(0418) 
(0419) /***********************************************************************************/
(0420) void lcd_wc(uchar lcd_code)/*写单字节命令*/
(0421) {
(0422)         LCD_DDR          = 0X00;
_lcd_wc:
  lcd_code             --> R16
    0CE3 2422      CLR	R2
    0CE4 BA24      OUT	0x14,R2
(0423)         LCD_CODE_P      &= ~(BIT(LCD_RD) | BIT(LCD_CE));
    0CE5 B382      IN	R24,0x12
    0CE6 7C8F      ANDI	R24,0xCF
    0CE7 BB82      OUT	0x12,R24
(0424)         /*LCD_CODE_P      = 0XF9;*/
(0425)         while((LCD_DATA & 0X03) != 0X03);
    0CE8 B383      IN	R24,0x13
    0CE9 7083      ANDI	R24,3
    0CEA 3083      CPI	R24,3
    0CEB F7E1      BNE	0x0CE8
(0426)         LCD_RD_H;
    0CEC 9A94      SBI	0x12,4
(0427)         LCD_RW_L;
    0CED 9897      CBI	0x12,7
(0428)         /*LCD_CODE_P       = 0XFA;*/
(0429)         LCD_DDR          = 0XFF;
    0CEE EF8F      LDI	R24,0xFF
    0CEF BB84      OUT	0x14,R24
(0430)         LCD_PORT         = lcd_code;
    0CF0 BB05      OUT	0x15,R16
(0431)         LCD_CODE_P       |= (BIT(LCD_RW) | BIT(LCD_RD) | BIT(LCD_CD) | BIT(LCD_CE));
    0CF1 B382      IN	R24,0x12
    0CF2 6B88      ORI	R24,0xB8
    0CF3 BB82      OUT	0x12,R24
    0CF4 9508      RET
_lcd_wc3:
  lcd_data2            --> Y+4
  lcd_data1            --> R22
  lcd_code             --> R20
    0CF5 940E1375  CALL	push_gset2
    0CF7 2F62      MOV	R22,R18
    0CF8 2F40      MOV	R20,R16
(0432) }
(0433) 
(0434) /***********************************************************************************/
(0435) //写带2字节参数的指令
(0436) void lcd_wc3(uchar lcd_code,uchar lcd_data1,uchar lcd_data2) 
(0437) {
(0438)         lcd_wd(lcd_data1);
    0CF9 2F06      MOV	R16,R22
    0CFA DFD2      RCALL	_lcd_wd
(0439)         lcd_wd(lcd_data2);
    0CFB 810C      LDD	R16,Y+4
    0CFC DFD0      RCALL	_lcd_wd
(0440)         lcd_wc(lcd_code);
    0CFD 2F04      MOV	R16,R20
    0CFE DFE4      RCALL	_lcd_wc
    0CFF 940E1363  CALL	pop_gset2
    0D01 9508      RET
_fnPR11:
  lcd_data1            --> R22
  lcd_code             --> R20
    0D02 940E1375  CALL	push_gset2
    0D04 2F62      MOV	R22,R18
    0D05 2F40      MOV	R20,R16
(0441) }
(0442) 
(0443) 
(0444) /*
(0445) uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2)		//写双参数的指令
(0446) {
(0447) 	if(fnST01() == 0)
(0448) 		return 1;
(0449) 	LCMDW = uPar1;
(0450) 	if(fnST01() == 0)
(0451) 		return 2;
(0452) 	LCMDW = uPar2;
(0453) 	if(fnST01() == 0)
(0454) 		return 3;
(0455) 	LCMCW = uCmd;
(0456) 	return 0;	// 返回0成功
(0457) }
(0458) 
(0459) uchar fnPR11(uchar uCmd,uchar uPar1)	// 写单参数的指令
(0460) {
(0461) 	if(fnST01() == 0)
(0462) 		return 1;
(0463) 	LCMDW = uPar1;
(0464) 	if(fnST01() == 0)
(0465) 		return 2;
(0466) 	LCMCW = uCmd;
(0467) 	return 0;	// 返回0成功
(0468) }
(0469) 
(0470) 
(0471) }
(0472) 
(0473) */
(0474) 
(0475) void fnPR11(uchar lcd_code,uchar lcd_data1) 

⌨️ 快捷键说明

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