📄 avr_ks0108.lst
字号:
(0245) };
(0246) const struct typFNT_ASC16 ASC_16[] =
(0247) { /* 显示为8*16 Curier 10 常规*/
(0248) "1",0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x04,0x04,0x00,
(0249) "2",0x00,0x00,0x08,0x04,0x84,0x44,0x38,0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x00,
(0250) "3",0x00,0x00,0x08,0x04,0x44,0x44,0xB8,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00,
(0251) "4",0x00,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x00,0x00,0x01,0x01,0x05,0x07,0x05,0x00,
(0252) "5",0x00,0x00,0x7C,0x44,0x44,0x44,0x84,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00,
(0253) "6",0x00,0x00,0xF0,0x48,0x44,0x44,0x80,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
(0254) "7",0x00,0x00,0x0C,0x04,0x84,0x64,0x1C,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,
(0255) "8",0x00,0x00,0xB8,0x44,0x44,0x44,0xB8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
(0256) "9",0x00,0x00,0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x00,0x00,0x04,0x04,0x02,0x01,0x00,
(0257) "0",0x00,0x00,0xF8,0x04,0x04,0x04,0xF8,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x00,
(0258) ".",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
(0259) ",",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x00,
(0260) ":",0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
(0261) ";",0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x00,
(0262) "-",0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
(0263) "_",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
(0264) "A",0x00,0x00,0x80,0x64,0x1C,0x60,0x80,0x00,0x00,0x04,0x07,0x05,0x01,0x05,0x07,0x04,
(0265) "B",0x00,0x04,0xFC,0x44,0x44,0x44,0x44,0xB8,0x00,0x04,0x07,0x04,0x04,0x04,0x04,0x03,
(0266) "C",0x00,0xF0,0x08,0x04,0x04,0x04,0x04,0x08,0x00,0x01,0x02,0x04,0x04,0x04,0x04,0x02,
(0267) "D",0x00,0x04,0xFC,0x04,0x04,0x04,0x08,0xF0,0x00,0x04,0x07,0x04,0x04,0x04,0x02,0x01,
(0268) "E",0x00,0x04,0xFC,0x44,0x44,0xE4,0x04,0x0C,0x00,0x04,0x07,0x04,0x04,0x04,0x04,0x06,
(0269) "F",0x00,0x04,0xFC,0x44,0x44,0xE4,0x04,0x0C,0x00,0x04,0x07,0x04,0x04,0x00,0x00,0x00,
(0270) " ",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
(0271) "=",0x00,0x00,0xA0,0xA0,0xA0,0xA0,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
(0272) "(",0x00,0x00,0x00,0xE0,0x18,0x04,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x00,0x00,
(0273) ")",0x00,0x00,0x00,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x00,0x10,0x0C,0x03,0x00,0x00,
(0274) "V",0x00,0x04,0x3C,0xC4,0x00,0xC4,0x3C,0x04,0x00,0x00,0x00,0x01,0x06,0x01,0x00,0x00,
(0275) "m",0x00,0x20,0xE0,0x20,0xC0,0x20,0xC0,0x00,0x00,0x04,0x07,0x00,0x07,0x00,0x07,0x04,
(0276) "H",0x00,0x04,0xFC,0x44,0x40,0x44,0xFC,0x04,0x00,0x04,0x07,0x04,0x00,0x04,0x07,0x04,
(0277) "*",0x90,0x90,0x60,0xFC,0x60,0x90,0x90,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,
(0278) };
(0279)
(0280) #define ASC_HZ_WIDTH 12
(0281) //#define ASC_HZ_HEIGHT 12
(0282)
(0283) typedef struct typFNT_GB16 /*12*16 汉字字模显示数据结构 */
(0284) {
(0285) char Index[2];
(0286) char Msk[24];
(0287) };
(0288) const struct typFNT_GB16 GB_16[] = { /* 宋体 9 显示为12*16 */
(0289) "科",0x8A,0x6A,0xFE,0x29,0x49,0x80,0x92,0xA4,0x80,0xFF,0x40,0x00,0x01,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,
(0290) "技",0x44,0x44,0xFF,0x24,0x00,0x64,0xA4,0x3F,0xA4,0x64,0x04,0x00,0x04,0x04,0x07,0x00,0x04,0x04,0x02,0x01,0x02,0x04,0x04,0x00,
(0291) "有",0x42,0x22,0x12,0xFA,0x4E,0x4B,0x4A,0x4A,0xFA,0x02,0x02,0x00,0x00,0x00,0x00,0x07,0x01,0x01,0x01,0x05,0x07,0x00,0x00,0x00,
(0292) "限",0xFF,0x81,0x99,0xE7,0x00,0xFF,0x25,0xE5,0x25,0xBF,0x40,0x00,0x07,0x00,0x00,0x00,0x00,0x07,0x04,0x02,0x01,0x02,0x04,0x00,
(0293) "公",0x20,0x10,0x08,0x07,0xC0,0x30,0x83,0x0C,0x10,0x20,0x20,0x00,0x00,0x04,0x06,0x05,0x04,0x04,0x02,0x03,0x06,0x00,0x00,0x00,
(0294) "司",0x08,0x09,0xE9,0x29,0x29,0x29,0xED,0x09,0x01,0xFF,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x04,0x04,0x07,0x00,0x00,
(0295) "液",0x19,0xE2,0x14,0x42,0xF2,0x2E,0x72,0x8F,0xAA,0x7A,0x02,0x00,0x01,0x07,0x00,0x00,0x07,0x04,0x04,0x02,0x01,0x02,0x04,0x00,
(0296) "晶",0x00,0xC0,0x40,0x5F,0xD5,0x15,0xD5,0x55,0x5F,0x40,0xC0,0x00,0x00,0x07,0x05,0x05,0x07,0x00,0x07,0x05,0x05,0x05,0x07,0x00,
(0297) "显",0x00,0x40,0x9F,0x15,0xD5,0x15,0xD5,0x15,0x1F,0xC0,0x00,0x00,0x04,0x04,0x05,0x04,0x07,0x04,0x07,0x06,0x05,0x04,0x04,0x00,
(0298) "示",0x10,0x12,0x92,0x52,0x12,0xF2,0x12,0x12,0x53,0x92,0x10,0x00,0x02,0x01,0x00,0x04,0x04,0x07,0x00,0x00,0x00,0x00,0x03,0x00,
(0299) "的",0xFC,0x44,0x46,0x45,0xFC,0x10,0x2C,0xC7,0x04,0x04,0xFC,0x00,0x07,0x02,0x02,0x02,0x07,0x00,0x00,0x04,0x04,0x04,0x03,0x00,
(0300) "第",0x04,0xEA,0xAB,0xAE,0xAA,0xFC,0xAA,0xAB,0xAE,0xBA,0x82,0x00,0x04,0x04,0x02,0x01,0x00,0x07,0x00,0x02,0x02,0x02,0x01,0x00,
(0301) "一",0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
(0302) "行",0x48,0x24,0xF3,0x08,0x09,0x09,0x09,0x09,0xF9,0x09,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x04,0x04,0x04,0x07,0x00,0x00,0x00,
(0303) "二",0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
(0304) "三",0x00,0x02,0x22,0x22,0x22,0x22,0x22,0x22,0x23,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,
(0305) "四",0x00,0xFF,0x81,0x41,0x3F,0x01,0x01,0xFF,0x81,0x81,0xFF,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x07,0x00,
(0306) "五",0x00,0x11,0x11,0x91,0x7F,0x11,0x11,0x11,0xF1,0x01,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x00,
(0307) };
(0308)
(0309) unsigned char GetPage(void) /*得到当前页*/
(0310) {
(0311) return CurPage;
_GetPage:
048A 91000090 LDS R16,CurPage
048C 9508 RET
(0312) }
(0313)
(0314) unsigned char GetCol(void) /*得到当前列*/
(0315) {
(0316) return CurCol;
_GetCol:
048D 9100008F LDS R16,CurCol
048F 9508 RET
_SetPageCol:
ucol --> R20
upage --> R22
0490 940E0999 CALL push_gset2
0492 2F42 MOV R20,R18
0493 2F60 MOV R22,R16
(0317) }
(0318)
(0319) void SetPageCol(unsigned char upage, unsigned char ucol) /* 设置液晶的页和列 */
(0320) {
(0321) CurPage = upage;
0494 93600090 STS CurPage,R22
(0322) CurCol = ucol;
0496 9340008F STS CurCol,R20
(0323) if(ucol<64)
0498 3440 CPI R20,0x40
0499 F428 BCC 0x049F
(0324) {
(0325) set_page_L(upage);
049A 2F06 MOV R16,R22
049B DF73 RCALL _set_page_L
(0326) set_col_addr_L(ucol);
049C 2F04 MOV R16,R20
049D DF8D RCALL _set_col_addr_L
(0327) }
049E C005 RJMP 0x04A4
(0328) else
(0329) {
(0330) set_page_R(upage);
049F 2F06 MOV R16,R22
04A0 DF7C RCALL _set_page_R
(0331) set_col_addr_R(ucol-64);
04A1 2F04 MOV R16,R20
04A2 5400 SUBI R16,0x40
04A3 DF95 RCALL _set_col_addr_R
(0332) }
04A4 940E098A CALL pop_gset2
04A6 9508 RET
_SetRowCol:
page --> R20
ucol --> R22
urow --> R20
04A7 940E0999 CALL push_gset2
04A9 2F62 MOV R22,R18
04AA 2F40 MOV R20,R16
(0333) }
(0334)
(0335) /* 设置当前显示的页和列 */
(0336) void SetRowCol(unsigned char urow, unsigned char ucol)
(0337) {
(0338) unsigned char page;
(0339) CurRow = urow;
04AB 93400091 STS CurRow,R20
(0340) CurCol = ucol;
04AD 9360008F STS CurCol,R22
(0341)
(0342) switch(urow)
04AF 2755 CLR R21
04B0 3041 CPI R20,1
04B1 E0E0 LDI R30,0
04B2 075E CPC R21,R30
04B3 F089 BEQ 0x04C5
04B4 3042 CPI R20,2
04B5 E0E0 LDI R30,0
04B6 075E CPC R21,R30
04B7 F091 BEQ 0x04CA
04B8 3043 CPI R20,3
04B9 E0E0 LDI R30,0
04BA 075E CPC R21,R30
04BB F099 BEQ 0x04CF
04BC 3044 CPI R20,4
04BD E0E0 LDI R30,0
04BE 075E CPC R21,R30
04BF F0A1 BEQ 0x04D4
04C0 3045 CPI R20,5
04C1 E0E0 LDI R30,0
04C2 075E CPC R21,R30
04C3 F0A9 BEQ 0x04D9
04C4 C018 RJMP 0x04DD
(0343) {
(0344) case 1:
(0345) page=0;
04C5 2744 CLR R20
(0346) CurOffset=1;
04C6 E081 LDI R24,1
04C7 93800092 STS CurOffset,R24
(0347) break;
04C9 C013 RJMP 0x04DD
(0348) case 2:
(0349) page=1;
04CA E041 LDI R20,1
(0350) CurOffset=2;
04CB E082 LDI R24,2
04CC 93800092 STS CurOffset,R24
(0351) break;
04CE C00E RJMP 0x04DD
(0352) case 3:
(0353) page=3;
04CF E043 LDI R20,3
(0354) CurOffset=1;
04D0 E081 LDI R24,1
04D1 93800092 STS CurOffset,R24
(0355) break;
04D3 C009 RJMP 0x04DD
(0356) case 4:
(0357) page=4;
04D4 E044 LDI R20,4
(0358) CurOffset=2;
04D5 E082 LDI R24,2
04D6 93800092 STS CurOffset,R24
(0359) break;
04D8 C004 RJMP 0x04DD
(0360) case 5:
(0361) page=6;
04D9 E046 LDI R20,6
(0362) CurOffset=1;
04DA E081 LDI R24,1
04DB 93800092 STS CurOffset,R24
(0363) break;
(0364) }
(0365) SetPageCol(page,ucol);
04DD 2F26 MOV R18,R22
04DE 2F04 MOV R16,R20
04DF DFB0 RCALL _SetPageCol
04E0 940E098A CALL pop_gset2
04E2 9508 RET
_disp_ch:
width --> R22
len --> R22
uPage --> Y+2
ch_r --> R10
uCol --> Y+1
ch_w --> R14
k --> R20
j --> R12
c --> R10
04E3 940E0993 CALL push_gset5
04E5 2EA0 MOV R10,R16
04E6 9723 SBIW R28,3
(0366) }
(0367)
(0368) void disp_ch(unsigned char c)
(0369) {
(0370) unsigned char k,j,uPage,uCol,ch_r,ch_w;
(0371) unsigned char width;
(0372) unsigned char len;
(0373) uPage = GetPage();
04E7 DFA2 RCALL _GetPage
04E8 830A STD Y+2,R16
(0374) uCol = GetCol();
04E9 DFA3 RCALL _GetCol
04EA 8309 STD Y+1,R16
(0375) len=sizeof(ASC_16)/sizeof(ASC_16[0]);
04EB E16E LDI R22,0x1E
(0376) for(k=0;k<len;k++)
04EC 2744 CLR R20
04ED C00C RJMP 0x04FA
(0377) {
(0378) if(c == ASC_16[k].Index[0] ) break;
04EE E181 LDI R24,0x11
04EF 9F84 MUL R24,R20
04F0 01F0 MOVW R30,R0
04F1 E584 LDI R24,0x54
04F2 E090 LDI R25,0
04F3 0FE8 ADD R30,R24
04F4 1FF9 ADC R31,R25
04F5 91E4 LPM R30,0(Z)
04F6 16AE CP R10,R30
04F7 F409 BNE 0x04F9
04F8 C003 RJMP 0x04FC
04F9 9543 INC R20
04FA 1746 CP R20,R22
04FB F390 BCS 0x04EE
(0379) }
(0380) if(k<len)
04FC 1746 CP R20,R22
04FD F008 BCS 0x04FF
04FE C0F1 RJMP 0x05F0
(0381) {
(0382)
(0383) if(c=='-'||c==':')
04FF 2D8A MOV R24,R10
0500 328D CPI R24,0x2D
0501 F011 BEQ 0x0504
0502 338A CPI R24,0x3A
0503 F411 BNE 0x0506
(0384) width=ASC_CHR_WIDTH-2;
0504 E066 LDI R22,6
0505 C006 RJMP 0x050C
(0385) else if(c=='|')
0506 2D8A MOV R24,R10
0507 378C CPI R24,0x7C
0508 F411 BNE 0x050B
(0386) width=ASC_HZ_WIDTH-ASC_CHR_WIDTH;
0509 E064 LDI R22,4
050A C001 RJMP 0x050C
(0387) else
(0388) width=ASC_CHR_WIDTH;
050B E068 LDI R22,0x8
(0389)
(0390) if(CurOffset==1) //下半部是写半个字节
050C 91800092 LDS R24,CurOffset
050E 3081 CPI R24,1
050F F009 BEQ 0x0511
0510 C062 RJMP 0x0573
(0391) {
(0392) for(j=0;j<width;j++)
0511 24CC CLR R12
0512 C01E RJMP 0x0531
(0393) {
(0394) SetPageCol(uPage,uCol+j);
0513 8129 LDD R18,Y+1
0514 0D2C ADD R18,R12
0515 810A LDD R16,Y+2
0516 DF79 RCALL _SetPageCol
(0395) ch_w=ASC_16[k].Msk[j];
0517 E181 LDI R24,0x11
0518 9F84 MUL R24,R20
0519 0110 MOVW R2,R0
051A E585 LDI R24,0x55
051B E090 LDI R25,0
051C 0E28 ADD R2,R24
051D 1E39 ADC R3,R25
051E 2DEC MOV R30,R12
051F 27FF CLR R31
0520 0DE2 ADD R30,R2
0521 1DF3 ADC R31,R3
0522 90E4 LPM R14,0(Z)
(0396) if(uCol+j<64) write_LCD(LEFT,DATA,ch_w);
0523 8189 LDD R24,Y+1
0524 0D8C ADD R24,R12
0525 3480 CPI R24,0x40
0526 F428 BCC 0x052C
0527 82E8 STD Y+0,R14
0528 E021 LDI R18,1
0529 2700 CLR R16
052A DDE0 RCALL _write_LCD
052B C004 RJMP 0x0530
(0397) else write_LCD(RIGHT,DATA,ch_w);
052C 82E8 STD Y+0,R14
052D E021 LDI R18,1
052E E001 LDI R16,1
052F DDDB RCALL _write_LCD
0530 94C3 INC R12
0531 16C6 CP R12,R22
0532 F300 BCS 0x0513
(0398) }
(0399) SetPageCol(uPage+1,uCol);
0533 8129 LDD R18,Y+1
0534 810A LDD R16,Y+2
0535 5F0F SUBI R16,0xFF
0536 DF59 RCALL _SetPageCol
(0400)
(0401) for(j=0;j<width;j++)
0537 24CC CLR R12
0538 C036 RJMP 0x056F
(0402) {
(0403) SetPageCol(uPage+1,uCol+j);
0539 8129 LDD R18,Y+1
053A 0D2C ADD R18,R12
053B 810A LDD R16,Y+2
053C 5F0F SUBI R16,0xFF
053D DF52 RCALL _SetPageCol
(0404) if(uCol+j<64) ch_r=read_LCD(LEFT);
053E 8189 LDD R24,Y+1
053F 0D8C ADD R24,R12
0540 3480 CPI R24,0x40
0541 F420 BCC 0x0546
0542 2700 CLR R16
0543 DE1A RCALL _read_LCD
0544 2EA0 MOV R10,R16
0545 C003 RJMP 0x0549
(0405) else ch_r=read_LCD(RIGHT);
0546 E001 LDI R16,1
0547 DE16 RCALL _read_LCD
0548 2EA0 MOV R10,R16
(0406) ch_r&=0xf0;
0549 2D8A MOV R24,R10
054A 7F80 ANDI R24,0xF0
054B 2EA8 MOV R10,R24
(0407) ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j]&0x0f;
054C E181 LDI R24,0x11
054D 9F84 MUL R24,R20
054E 0110 MOVW R2,R0
054F E585 LDI R24,0x55
0550 E090 LDI R25,0
0551 0E28 ADD R2,R24
0552 1E39 ADC R3,R25
0553 2DEC MOV R30,R12
0554 27FF CLR R31
0555 9638 ADIW R30,0x8
0556 0DE2 ADD R30,R2
0557 1DF3 ADC R31,R3
0558 91E4 LPM R30,0(Z)
0559 70EF ANDI R30,0xF
055A 2EEE MOV R14,R30
(0408) ch_w|=ch_r;
055B 28EA OR R14,R10
(0409) SetPageCol(uPage+1,uCol+j);
055C 8129 LDD R18,Y+1
055D 0D2C ADD R18,R12
055E 810A LDD R16,Y+2
055F 5F0F SUBI R16,0xFF
0560 DF2F RCALL _SetPageCol
(0410) if(uCol+j<64) write_LCD(LEFT,DATA,ch_w);
0561 8189 LDD R24,Y+1
0562 0D8C ADD R24,R12
0563 3480 CPI R24,0x40
0564 F428 BCC 0x056A
0565 82E8 STD Y+0,R14
0566 E021 LDI R18,1
0567 2700 CLR R16
0568 DDA2 RCALL _write_LCD
0569 C004 RJMP 0x056E
(0411) else write_LCD(RIGHT,DATA,ch_w);
056A 82E8 STD Y+0,R14
056B E021 LDI R18,1
056C E001 LDI R16,1
056D DD9D RCALL _write_LCD
056E 94C3 INC R12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -