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

📄 main.s

📁 超简单的编码开关(单键飞梭开关)解码程序
💻 S
📖 第 1 页 / 共 5 页
字号:
;  UCSRC = BIT(URSEL) | 0x06;
	ldi R24,134
	out 0x20,R24
	.dbline 299
;  UBRRL = 0x07; //set baud rate lo
	ldi R24,7
	out 0x9,R24
	.dbline 300
;  UBRRH = 0x00; //set baud rate hi
	out 0x20,R2
	.dbline 301
;  UCSRB = 0x98;
	ldi R24,152
	out 0xa,R24
	.dbline -2
L28:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 52
	jmp _uart0_rx_isr
	.area text(rom, con, rel)
	.dbfile F:\bss\AVR-ICC\qingxi\main.c
	.dbfunc e uart0_rx_isr _uart0_rx_isr fV
	.even
_uart0_rx_isr::
	.dbline -1
	.dbline 327
; }
; //*/
; 
; 
; /*8MHz
; //UART0 initialize
; // desired baud rate: 19200
; // actual: baud rate:19231 (0.2%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
;  UCSRB = 0x00; //disable while setting baud rate
;  UCSRA = 0x00;
;  UCSRC = BIT(URSEL) | 0x06;
;  UBRRL = 0x19; //set baud rate lo
;  UBRRH = 0x00; //set baud rate hi
;  UCSRB = 0x98;
; }
; //*/
; 
; 
; //串行通讯接受中断入口服务程序
; #pragma interrupt_handler uart0_rx_isr:14
; void uart0_rx_isr(void)
; {
	.dbline -2
L29:
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e uart_str _uart_str fV
;            str -> R16,R17
	.even
_uart_str::
	.dbline -1
	.dbline 333
;  //uart has received a character in UDR
; }
; 
; 
; //串口发送字符串
; void  uart_str(unsigned char *str) {
	xjmp L32
X2:
	.dbline 335
;      while(*str)
; 	  {
L34:
	.dbline 336
L35:
	.dbline 336
	sbis 0xb,5
	rjmp L34
	.dbline 337
	movw R30,R16
	ld R2,Z+
	movw R16,R30
	out 0xc,R2
	.dbline 338
L32:
	.dbline 334
	movw R30,R16
	ldd R2,z+0
	tst R2
	brne L35
	.dbline -2
L30:
	.dbline 0 ; func end
	ret
	.dbsym r str 16 pc
	.dbend
	.dbfunc e wait_tx _wait_tx fV
	.even
_wait_tx::
	.dbline -1
	.dbline 343
; 		while (!(UCSRA&(1<<UDRE)));
; 		UDR=*str++; 
; 	 }	
; }
; 	 
; 
; //等待发送完一个字节 
; void wait_tx() {	             
L38:
	.dbline 344
L39:
	.dbline 344
; 	while(!(UCSRA&0x40));
	sbis 0xb,6
	rjmp L38
	.dbline 345
;     UCSRA|=0x40; 
	sbi 0xb,6
	.dbline -2
L37:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 4
	jmp _int0_isr
	.area text(rom, con, rel)
	.dbfile F:\bss\AVR-ICC\qingxi\main.c
	.dbfunc e int0_isr _int0_isr fV
	.even
_int0_isr::
	st -y,R2
	st -y,R24
	st -y,R25
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 361
; 	}    
; 
; 
; //外部中断0,用于编码开关解码,解码图:
; //A -|
; //   |   -----|__________|----------|____________
; //C -|
; //
; //B -|
; //   |   ----------|__________|----------|____________
; //C -| 
; //             CW  ===>>> ROTATION
; //外部中断设置(ISC01=0,ISC00=1): INT0 引脚上任意的逻辑电平变化都将引发中断
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
	.dbline 363
;  //external interupt on INT0
;     GICR=0;    //禁止外部中断
	clr R2
	out 0x3b,R2
	.dbline 364
;     if ((PIND & 0x04)==0)           //先判断是高电平产生的中断还是低点平的中断
	sbic 0x10,2
	rjmp L42
	.dbline 365
; 		if ((PINA & 0x02)==0)       
	sbic 0x19,1
	rjmp L44
	.dbline 366
; 		    {
	.dbline 367
; 			 keycounter--; 
	lds R24,_keycounter
	subi R24,1
	sts _keycounter,R24
	.dbline 368
; 		     keydirection=0;
	sts _keydirection,R2
	.dbline 369
; 		    } 
	xjmp L43
L44:
	.dbline 371
; 		else
; 		    {
	.dbline 372
; 			 keycounter++;
	lds R24,_keycounter
	subi R24,255    ; addi 1
	sts _keycounter,R24
	.dbline 373
; 		     keydirection=1;
	ldi R24,1
	sts _keydirection,R24
	.dbline 374
; 			 }
	xjmp L43
L42:
	.dbline 378
; 			 
; 		//beeps(1);
; 	else
;        if ((PINA & 0x02)==0)
	sbic 0x19,1
	rjmp L46
	.dbline 379
; 		   {
	.dbline 380
; 		    keycounter++; 
	lds R24,_keycounter
	subi R24,255    ; addi 1
	sts _keycounter,R24
	.dbline 381
; 		    keydirection=1;
	ldi R24,1
	sts _keydirection,R24
	.dbline 382
; 			} 
	xjmp L47
L46:
	.dbline 384
; 		else
; 		    {
	.dbline 385
; 			keycounter--;
	lds R24,_keycounter
	subi R24,1
	sts _keycounter,R24
	.dbline 386
; 	        keydirection=0;
	clr R2
	sts _keydirection,R2
	.dbline 387
; 			}
L47:
L43:
	.dbline 388
; 	GICR=0x40;
	ldi R24,64
	out 0x3b,R24
	.dbline -2
L41:
	ld R2,y+
	out 0x3f,R2
	ld R25,y+
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e lcd_wd _lcd_wd fV
;       lcd_data -> R16
	.even
_lcd_wd::
	.dbline -1
	.dbline 401
; }
; 
; 
; //**********************************************************************************
; //**********************************************************************************
; //T6963 LCD 显示模块驱动代码段
; //**********************************************************************************
; //**********************************************************************************
; 
; 
; /*发送单字节数据到LCD屏*/
; void lcd_wd(uchar lcd_data)
; {
	.dbline 402
;         LCD_DDR          = 0X00;
	clr R2
	out 0x14,R2
	.dbline 403
;         LCD_CODE_P      &= ~(BIT(LCD_RD) | BIT(LCD_CE));
	in R24,0x12
	andi R24,207
	out 0x12,R24
L49:
	.dbline 405
L50:
	.dbline 405
;         /*LCD_CODE_P       = 0XF9;*/
;         while((LCD_DATA & 0X03) != 0X03);
	in R24,0x13
	andi R24,3
	cpi R24,3
	brne L49
	.dbline 406
;         LCD_RD_H;
	sbi 0x12,4
	.dbline 407
;         LCD_CD_L;
	cbi 0x12,3
	.dbline 408
;         LCD_RW_L;
	cbi 0x12,7
	.dbline 410
;         /*LCD_CODE_P       = 0XF2;*/
;         LCD_DDR          = 0XFF;
	ldi R24,255
	out 0x14,R24
	.dbline 411
;         LCD_PORT         = lcd_data;
	out 0x15,R16
	.dbline 412
;         asm("NOP");
	NOP
	.dbline 413
; 		LCD_CODE_P       |= (BIT(LCD_RW) | BIT(LCD_RD) | BIT(LCD_CD) | BIT(LCD_CE));
	in R24,0x12
	ori R24,184
	out 0x12,R24
	.dbline 414
; 		asm("NOP");
	NOP
	.dbline 415
; 		asm("NOP");
	NOP
	.dbline -2
L48:
	.dbline 0 ; func end
	ret
	.dbsym r lcd_data 16 c
	.dbend
	.dbfunc e lcd_wc _lcd_wc fV
;       lcd_code -> R16
	.even
_lcd_wc::
	.dbline -1
	.dbline 421
; }
; 
; 
; /***********************************************************************************/
; void lcd_wc(uchar lcd_code)/*写单字节命令*/
; {
	.dbline 422
;         LCD_DDR          = 0X00;
	clr R2
	out 0x14,R2
	.dbline 423
;         LCD_CODE_P      &= ~(BIT(LCD_RD) | BIT(LCD_CE));
	in R24,0x12
	andi R24,207
	out 0x12,R24
L53:
	.dbline 425
L54:
	.dbline 425
;         /*LCD_CODE_P      = 0XF9;*/
;         while((LCD_DATA & 0X03) != 0X03);
	in R24,0x13
	andi R24,3
	cpi R24,3
	brne L53
	.dbline 426
;         LCD_RD_H;
	sbi 0x12,4
	.dbline 427
;         LCD_RW_L;
	cbi 0x12,7
	.dbline 429
;         /*LCD_CODE_P       = 0XFA;*/
;         LCD_DDR          = 0XFF;
	ldi R24,255
	out 0x14,R24
	.dbline 430
;         LCD_PORT         = lcd_code;
	out 0x15,R16
	.dbline 431
;         LCD_CODE_P       |= (BIT(LCD_RW) | BIT(LCD_RD) | BIT(LCD_CD) | BIT(LCD_CE));
	in R24,0x12
	ori R24,184
	out 0x12,R24
	.dbline -2
L52:
	.dbline 0 ; func end
	ret
	.dbsym r lcd_code 16 c
	.dbend
	.dbfunc e lcd_wc3 _lcd_wc3 fV
;      lcd_data2 -> y+4
;      lcd_data1 -> R22
;       lcd_code -> R20
	.even
_lcd_wc3::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 437
; }
; 
; /***********************************************************************************/
; //写带2字节参数的指令
; void lcd_wc3(uchar lcd_code,uchar lcd_data1,uchar lcd_data2) 
; {
	.dbline 438
;         lcd_wd(lcd_data1);
	mov R16,R22
	xcall _lcd_wd
	.dbline 439
;         lcd_wd(lcd_data2);
	ldd R16,y+4
	xcall _lcd_wd
	.dbline 440
;         lcd_wc(lcd_code);
	mov R16,R20
	xcall _lcd_wc
	.dbline -2
L56:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l lcd_data2 4 c
	.dbsym r lcd_data1 22 c
	.dbsym r lcd_code 20 c
	.dbend
	.dbfunc e fnPR11 _fnPR11 fV
;      lcd_data1 -> R22
;       lcd_code -> R20
	.even
_fnPR11::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 476
; }
; 
; 
; /*
; uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2)		//写双参数的指令
; {
; 	if(fnST01() == 0)
; 		return 1;
; 	LCMDW = uPar1;
; 	if(fnST01() == 0)
; 		return 2;
; 	LCMDW = uPar2;
; 	if(fnST01() == 0)
; 		return 3;
; 	LCMCW = uCmd;
; 	return 0;	// 返回0成功
; }
; 
; uchar fnPR11(uchar uCmd,uchar uPar1)	// 写单参数的指令
; {
; 	if(fnST01() == 0)
; 		return 1;
; 	LCMDW = uPar1;
; 	if(fnST01() == 0)
; 		return 2;
; 	LCMCW = uCmd;
; 	return 0;	// 返回0成功
; }
; 
; 
; }
; 
; */
; 
; void fnPR11(uchar lcd_code,uchar lcd_data1) 
; {
	.dbline 477
;         lcd_wd(lcd_data1);
	mov R16,R22
	xcall _lcd_wd
	.dbline 478
;         lcd_wc(lcd_code);
	mov R16,R20
	xcall _lcd_wc
	.dbline -2
L57:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r lcd_data1 22 c
	.dbsym r lcd_code 20 c
	.dbend
	.dbfunc e fnST3 _fnST3 fc
;              i -> R16
	.even
_fnST3::
	.dbline -1
	.dbline 498
; }
; 
; 
; 
; /*
; uchar fnST3(void)		// 状态位ST3判断(数据自动写状态)
; {
; 	uchar data i;
; 	
; 	for(i=10;i>0;i--)
; 	{
; 		if((LCMCW & 0x08) == 0x08)
; 			break;
; 	}
; 	return i;	// 若返回零,说明错误
; }
; */
; 
; uchar fnST3(void)		// 状态位ST3判断(数据自动写状态)
; {
	.dbline 501
; 	uchar i;
; 	
; 	for(i=10;i>0;i--)
	ldi R16,10
	xjmp L62
X3:
	.dbline 502
	.dbline 505
L60:
	.dbline 501
	dec R16
L62:
	.dbline 501
	clr R2
	cp R2,R16
	brlo L61
L61:
	.dbline 507
; 	{
;       
; 	  //if((LCMCW & 0x08) == 0x08)
; 			break;
; 	}
; 	return i;	// 若返回零,说明错误
	.dbline -2
L58:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e fnGetRow _fnGetRow fc
	.even
_fnGetRow::
	.dbline -1
	.dbline 513
; }
; 
; 
; 
; uchar fnGetRow(void)
; {
	.dbline 514
; 	return gCurRow;
	lds R16,_gCurRow
	.dbline -2
L63:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e fnGetCol _fnGetCol fc
	.even
_fnGetCol::
	.dbline -1
	.dbline 518
; }
; 
; uchar fnGetCol(void)
; {
	.dbline 519
; 	return gCurCol;
	lds R16,_gCurCol
	.dbline -2
L64:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e fnSetPos _fnSetPos fV
;           iPos -> R10,R11
;           ucol -> R20
;           urow -> R22
	.even
_fnSetPos::
	xcall push_gset3
	mov R20,R18
	mov R22,R16
	sbiw R28,1
	.dbline -1
	.dbline 524
; }
; 
; // 设置当前地址
; void fnSetPos(uchar urow, uchar ucol)
; {
	.dbline 526
; 	uint  iPos;
; 	iPos = urow * 30 + ucol;
	ldi R24,30
	mul R24,R22
	movw R10,R0
	mov R2,R20
	clr R3
	add R10,R2
	adc R11,R3
	.dbline 527
; 	lcd_wc3(LC_ADD_POS,iPos & 0xFF,iPos / 256);
	movw R2,R10
	mov R2,R3
	clr R3
	std y+0,R2
	mov R18,R10
	andi R19,0
	ldi R16,36
	xcall _lcd_wc3
	.dbline 528
; 	gCurRow = urow;
	sts _gCurRow,R22
	.dbline 529
; 	gCurCol = ucol;
	sts _gCurCol,R20
	.dbline -2
L65:
	adiw R28,1
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r iPos 10 i
	.dbsym r ucol 20 c
	.dbsym r urow 22 c
	.dbend
	.dbfunc e cursor _cursor fV
;           uCol -> R22
;           uRow -> R20
	.even
_cursor::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 534
; }
; 
; // 设置当前显示行、列
; void cursor(uchar uRow, uchar uCol)
; {
	.dbline 535
; 	fnSetPos(uRow * 16, uCol);
	mov R18,R22
	ldi R24,16
	mul R24,R20
	mov R16,R0
	xcall _fnSetPos
	.dbline -2
L66:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r uCol 22 c
	.dbsym r uRow 20 c
	.dbend
	.dbfunc e clsrows _clsrows fV
	.dbstruct 0 2 .1
	.dbfield 0 ah c
	.dbfield 1 al c
	.dbend
	.dbunion 0 2 address
	.dbfield 0 a i
	.dbfield 0 apart S[.1]
	.dbend
;          baddr -> y+1
;              i -> R20,R21
;           erow -> R22
;           brow -> R10
	.even
_clsrows::
	xcall push_gset3
	mov R22,R18
	mov R10,R16
	sbiw R28,3
	.dbline -1
	.dbline 540
; }
; 
; //清汉字行函数,参数1起始行,参数2终止行
; void clsrows(uchar brow,uchar erow)
; {
	.dbline 543
; 	uint i;
; 	union address baddr;
; 	baddr.a = 480*brow;
	mov R18,R10
	clr R19
	ldi R16,480
	ldi R17,1
	xcall empy16s
	std y+2,R17
	std y+1,R16
	.dbline 544
; 	lcd_wc3(LC_ADD_POS,baddr.apart.al,baddr.apart.ah);
	mov R2,R16
	std y+0,R2
	ldd R18,y+2
	ldi R16,36
	xcall _lcd_wc3
	.dbline 545
; 	lcd_wc(LC_AUT_WR);
	ldi R16,176
	xcall _lcd_wc
	.dbline 546
; 	for(i=0;i<(erow-brow)*30;i++)
	clr R20
	clr R21
	xjmp L72
L69:
	.dbline 547
	.dbline 548
	xcall _fnST3
	.dbline 549
	clr R16
	xcall _lcd_wd
	.dbline 550
L70:
	.dbline 546
	subi R20,255  ; offset = 1
	sbci R21,255
L72:
	.dbline 546
	mov R2,R22
	sub R2,R10
	ldi R24,30
	mul R24,R2
	cp R20,R0
	cpc R21,R1
	brlo L69
	.dbline 551
; 	{
; 		fnST3();
; 		lcd_wd(0x00);
; 	}
; 	lcd_wc(LC_AUT_OVR);
	ldi R16,178
	xcall _lcd_wc
	.dbline 552
; 	lcd_wc3(LC_ADD_POS,baddr.apart.al,baddr.apart.ah);
	ldd R2,y+1
	std y+0,R2
	ldd R18,y+2
	ldi R16,36
	xcall _lcd_wc3
	.dbline 553
; 	gCurRow = brow<<4;
	mov R24,R10
	andi R24,#0x0F
	swap R24
	sts _gCurRow,R24
	.dbline 554
; 	gCurCol = 0;
	clr R2
	sts _gCurCol,R2
	.dbline -2
L67:
	adiw R28,3
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l baddr 1 S[address]
	.dbsym r i 20 i
	.dbsym r erow 22 c
	.dbsym r brow 10 c
	.dbend
	.dbfunc e fnLCMInit _fnLCMInit fV
	.even
_fnLCMInit::
	sbiw R28,1
	.dbline -1
	.dbline 559
; }      
; 
; 
; void fnLCMInit(void)
; {
	.dbline 560
;     lcd_wc3(LC_TXT_STP,0x00,0x0f);     	// 文本显示区首地址   10
	ldi R24,15
	std y+0,R24
	clr R18
	ldi R16,64
	xcall _lcd_wc3
	.dbline 561
; 	lcd_wc3(LC_TXT_WID,0x1E,0x00);		// 文本显示区宽度
	clr R2
	std y+0,R2
	ldi R18,30
	ldi R16,65
	xcall _lcd_wc3
	.dbline 562
; 	lcd_wc3(LC_GRH_STP,0x00,0x00);		// 图形显示区首地址
	clr R2
	std y+0,R2
	clr R18
	ldi R16,66
	xcall _lcd_wc3
	.dbline 563
; 	lcd_wc3(LC_GRH_WID,0x1E,0x00);		// 图形显示区宽度
	clr R2
	std y+0,R2
	ldi R18,30
	ldi R16,67
	xcall _lcd_wc3
	.dbline 564
; 	lcd_wc(LC_CUR_SHP | 0x00);			// 光标形状
	ldi R16,161
	xcall _lcd_wc
	.dbline 565
; 	lcd_wc3(LC_CGR_POS,0x03,0x00);		//CGRAM设置
	clr R2
	std y+0,R2
	ldi R18,3
	ldi R16,34
	xcall _lcd_wc3
	.dbline 566
; 	lcd_wc(LC_MOD_OR);					// 显示方式设置
	ldi R16,128
	xcall _lcd_wc
	.dbline 567
; 	lcd_wc(0x9f);						// 显示开关设置
	ldi R16,159
	xcall _lcd_wc
	.dbline -2
L74:
	adiw R28,1
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e lcd_init _lcd_init fV
	.even
_lcd_init::
	sbiw R28,1
	.dbline -1
	.dbline 573
; }
; 
; 
; /***********************************************************

⌨️ 快捷键说明

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