📄 qingxi.lst
字号:
(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 + -