📄 main.s
字号:
; 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 + -