📄 st7920.lis
字号:
0116 A22E mov R10,R18
0118 602F mov R22,R16
011A .dbline -1
011A .dbline 75
011A ; //for(i=1;i>0;i--)BUSYLOOP(); //延时10us 延时后写命令就无效?
011A ; }
011A ; /**********************串行方式相关程序END*********************/
011A ;
011A ;
011A ; /**********************液晶文字显示相关程序START*************/
011A ;
011A ;
011A ; void lcdSetXY(uchar x,uchar y) //定位坐标的位置,这个主要跟字符显示相关
011A ; { //x:横0-15 y:纵 0-3 ;x,y对应12864的坐标
011A .dbline 76
011A ; unsigned char position=0;
011A 4427 clr R20
011C .dbline 77
011C ; x &= 0x0f;//x%16;
011C 6F70 andi R22,15
011E .dbline 78
011E ; switch(y%4)
011E 24E0 ldi R18,4
0120 30E0 ldi R19,0
0122 0A2D mov R16,R10
0124 1127 clr R17
0126 0E940000 xcall mod16s
012A 5801 movw R10,R16
012C 0030 cpi R16,0
012E 0107 cpc R16,R17
0130 71F0 breq L23
0132 X4:
0132 C501 movw R24,R10
0134 0130 cpi R16,1
0136 E0E0 ldi R30,0
0138 1E07 cpc R17,R30
013A 69F0 breq L24
013C X5:
013C 0230 cpi R16,2
013E E0E0 ldi R30,0
0140 1E07 cpc R17,R30
0142 69F0 breq L25
0144 X6:
0144 0330 cpi R16,3
0146 E0E0 ldi R30,0
0148 1E07 cpc R17,R30
014A 69F0 breq L26
014C X7:
014C 0FC0 xjmp L21
014E L23:
014E .dbline 80
014E ; { //第零行和第二行寄存器连续 第一行和第三行寄存器连续
014E ; case 0: position = 0x80 + (x>>1); break; // |0x80 ~ 0x87|
014E 462F mov R20,R22
0150 4695 lsr R20
0152 4058 subi R20,128 ; addi 128
0154 .dbline 80
0154 0BC0 xjmp L21
0156 L24:
0156 .dbline 81
0156 ; case 1: position = 0x90 + (x>>1); break; // |0x90 ~ 0x97|
0156 462F mov R20,R22
0158 4695 lsr R20
015A 4057 subi R20,112 ; addi 144
015C .dbline 81
015C 07C0 xjmp L21
015E L25:
015E .dbline 82
015E ; case 2: position = 0x88 + (x>>1); break; // |0x88 ~ 0x8f|
015E 462F mov R20,R22
0160 4695 lsr R20
0162 4857 subi R20,120 ; addi 136
0164 .dbline 82
0164 03C0 xjmp L21
0166 L26:
0166 .dbline 83
0166 ; case 3: position = 0x98 + (x>>1); break; // |0x98 ~ 0x9f|
0166 462F mov R20,R22
0168 4695 lsr R20
016A 4856 subi R20,104 ; addi 152
016C .dbline 83
016C .dbline 84
016C ; default: break;
016C L21:
016C .dbline 86
016C ; }
016C ; WriteCommand(position);
016C 042F mov R16,R20
016E A9DF xcall _WriteCommand
0170 .dbline -2
0170 L19:
0170 .dbline 0 ; func end
0170 0C940000 xjmp pop_xgsetF00C
0174 .dbsym r position 20 c
0174 .dbsym r y 10 c
0174 .dbsym r x 22 c
0174 .dbend
0174 .dbfunc e SetGraphicAddr _SetGraphicAddr fV
0174 ; ytemp -> R22
0174 ; y -> R10
0174 ; x -> R20
.even
0174 _SetGraphicAddr::
0174 0E940000 xcall push_xgsetF00C
0178 A22E mov R10,R18
017A 402F mov R20,R16
017C .dbline -1
017C .dbline 91
017C ; }
017C ;
017C ; //x:横0-15 y:纵 0-63
017C ; void SetGraphicAddr(uchar x,uchar y)
017C ; {
017C .dbline 93
017C ; uchar ytemp;
017C ; EX_FT(); //跟绘图设置有关 8BIT控制界面,扩充指令集,,绘图显示开
017C 06E3 ldi R16,54
017E A1DF xcall _WriteCommand
0180 .dbline 94
0180 ; ytemp = (y & 0x1f) | 0x80;
0180 6A2D mov R22,R10
0182 6F71 andi R22,31
0184 6068 ori R22,128
0186 .dbline 95
0186 ; WriteCommand(ytemp); //先写st7920 垂直坐标
0186 062F mov R16,R22
0188 9CDF xcall _WriteCommand
018A .dbline 96
018A ; ytemp = (y>>5); //12864的y坐标打印32的对应ST水平坐标0x88~0x8f,垂直坐标(y-32)
018A 6A2D mov R22,R10
018C 6695 lsr R22
018E 6695 lsr R22
0190 6695 lsr R22
0192 6695 lsr R22
0194 6695 lsr R22
0196 .dbline 97
0196 ; x &= 0x0f;//x%16;
0196 4F70 andi R20,15
0198 .dbline 98
0198 ; x = 0x80 +(ytemp<<3) + (x>>1); //0 |0x80 ~ 0x87|
0198 242E mov R2,R20
019A 2694 lsr R2
019C 462F mov R20,R22
019E 440F lsl R20
01A0 440F lsl R20
01A2 440F lsl R20
01A4 4058 subi R20,128 ; addi 128
01A6 420D add R20,R2
01A8 .dbline 99
01A8 ; WriteCommand(x); //1 |
01A8 042F mov R16,R20
01AA 8BDF xcall _WriteCommand
01AC .dbline 104
01AC ; //. |数值表示st的位址
01AC ; //. |
01AC ; //31|
01AC ; //0 |0x88 ~ 0x8f|
01AC ; FunctionSet(); //功能设置 8位数据,基本指令
01AC 00E3 ldi R16,48
01AE 89DF xcall _WriteCommand
01B0 .dbline -2
01B0 L27:
01B0 .dbline 0 ; func end
01B0 0C940000 xjmp pop_xgsetF00C
01B4 .dbsym r ytemp 22 c
01B4 .dbsym r y 10 c
01B4 .dbsym r x 20 c
01B4 .dbend
01B4 .dbfunc e lcdInit _lcdInit fV
.even
01B4 _lcdInit::
01B4 .dbline -1
01B4 .dbline 109
01B4 ; }
01B4 ;
01B4 ;
01B4 ; void lcdInit() //液晶初始化
01B4 ; {
01B4 .dbline 111
01B4 ; //初始化控制管脚
01B4 ; DDR_LCD_CTRL |= BIT(RS);
01B4 BD9A sbi 0x17,5
01B6 .dbline 112
01B6 ; DDR_LCD_CTRL |= BIT(RW);
01B6 BE9A sbi 0x17,6
01B8 .dbline 113
01B8 ; DDR_LCD_CTRL |= BIT(E);
01B8 BF9A sbi 0x17,7
01BA .dbline 114
01BA ; LCD_CTRL |= BIT(RS);
01BA C59A sbi 0x18,5
01BC .dbline 115
01BC ; LCD_CTRL |= BIT(RW);
01BC C69A sbi 0x18,6
01BE .dbline 116
01BE ; LCD_CTRL |= BIT(E);
01BE C79A sbi 0x18,7
01C0 .dbline 118
01C0 ;
01C0 ; FunctionSet();
01C0 00E3 ldi R16,48
01C2 7FDF xcall _WriteCommand
01C4 .dbline 119
01C4 ; Delayus(150);
01C4 06E9 ldi R16,150
01C6 10E0 ldi R17,0
01C8 20E0 ldi R18,0
01CA 30E0 ldi R19,0
01CC 19DF xcall _Delayus
01CE .dbline 121
01CE ;
01CE ; FunctionSet();
01CE 00E3 ldi R16,48
01D0 78DF xcall _WriteCommand
01D2 .dbline 122
01D2 ; Delayus(50);
01D2 02E3 ldi R16,50
01D4 10E0 ldi R17,0
01D6 20E0 ldi R18,0
01D8 30E0 ldi R19,0
01DA 12DF xcall _Delayus
01DC .dbline 124
01DC ;
01DC ; DisplayOff();
01DC 08E0 ldi R16,8
01DE 71DF xcall _WriteCommand
01E0 .dbline 125
01E0 ; Delayus(150);
01E0 06E9 ldi R16,150
01E2 10E0 ldi R17,0
01E4 20E0 ldi R18,0
01E6 30E0 ldi R19,0
01E8 0BDF xcall _Delayus
01EA .dbline 127
01EA ;
01EA ; lcdClear(); //清屏程序 需要毫秒级的延时
01EA .dbline 127
01EA 01E0 ldi R16,1
01EC 6ADF xcall _WriteCommand
01EE .dbline 127
01EE 0AE0 ldi R16,10
01F0 3BDF xcall _Delayms
01F2 .dbline 127
01F2 .dbline 127
01F2 .dbline 128
01F2 ; Delayus(150);
01F2 06E9 ldi R16,150
01F4 10E0 ldi R17,0
01F6 20E0 ldi R18,0
01F8 30E0 ldi R19,0
01FA 02DF xcall _Delayus
01FC .dbline 129
01FC ; EntryModeSet(); //设定写入时候指针右移
01FC 06E0 ldi R16,6
01FE 61DF xcall _WriteCommand
0200 .dbline 130
0200 ; DisplayOn();
0200 0CE0 ldi R16,12
0202 5FDF xcall _WriteCommand
0204 .dbline 131
0204 ; Delayus(50);
0204 02E3 ldi R16,50
0206 10E0 ldi R17,0
0208 20E0 ldi R18,0
020A 30E0 ldi R19,0
020C F9DE xcall _Delayus
020E .dbline 132
020E ; DisplayOn();
020E 0CE0 ldi R16,12
0210 58DF xcall _WriteCommand
0212 .dbline 133
0212 ; Delayus(50);
0212 02E3 ldi R16,50
0214 10E0 ldi R17,0
0216 20E0 ldi R18,0
0218 30E0 ldi R19,0
021A F2DE xcall _Delayus
021C .dbline -2
021C L28:
021C .dbline 0 ; func end
021C 0895 ret
021E .dbend
021E .dbfunc e lcdDisplay _lcdDisplay fV
021E ; LineDispCnt -> R12
021E ; i -> R10
021E ; ptr -> R20,R21
021E ; y -> R14
021E ; x -> R22
.even
021E _lcdDisplay::
021E 0E940000 xcall push_xgsetF0FC
0222 E22E mov R14,R18
0224 602F mov R22,R16
0226 4A85 ldd R20,y+10
0228 5B85 ldd R21,y+11
022A .dbline -1
022A .dbline 137
022A ; }
022A ;
022A ; void lcdDisplay( uchar x, uchar y, uchar *ptr ) //行写满自动换行
022A ; {
022A .dbline 139
022A ; uchar i;
022A ; uchar LineDispCnt = 0;
022A .dbline 140
022A ; LineDispCnt = (16-x+x%2);
022A 12E0 ldi R17,2
022C 062F mov R16,R22
022E 0E940000 xcall mod8u
0232 80E1 ldi R24,16
0234 C82E mov R12,R24
0236 C61A sub R12,R22
0238 C00E add R12,R16
023A .dbline 141
023A ; lcdSetXY(x,y);
023A 2E2D mov R18,R14
023C 062F mov R16,R22
023E 69DF xcall _lcdSetXY
0240 .dbline 142
0240 ; i = 0;
0240 AA24 clr R10
0242 17C0 xjmp L31
0244 L30:
0244 .dbline 144
0244 ; while((ptr[i])!='\0')
0244 ; {
0244 .dbline 145
0244 ; WriteData(ptr[i]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -