📄 lcd.lst
字号:
7CF 9566 LSR R22
7D0 9566 LSR R22
7D1 9566 LSR R22
(0097) x &= 0x0f;//x%16;
7D2 704F ANDI R20,0xF
(0098) x = 0x80 +(ytemp<<3) + (x>>1); //0 |0x80 ~ 0x87|
7D3 2E24 MOV R2,R20
7D4 9426 LSR R2
7D5 2F46 MOV R20,R22
7D6 0F44 LSL R20
7D7 0F44 LSL R20
7D8 0F44 LSL R20
7D9 5840 SUBI R20,0x80
7DA 0D42 ADD R20,R2
(0099) WriteCommand(x); //1 |
7DB 2F04 MOV R16,R20
7DC DF8B RCALL _WriteCommand
(0100) //. |数值表示st的位址
(0101) //. |
(0102) //31|
(0103) //0 |0x88 ~ 0x8f|
(0104) FunctionSet(); //功能设置 8位数据,基本指令
7DD E300 LDI R16,0x30
7DE DF89 RCALL _WriteCommand
7DF 940C 099B JMP pop_xgsetF00C
(0105) }
(0106)
(0107)
(0108) void lcdInit() //液晶初始化
(0109) {
(0110) //初始化控制管脚
(0111) DDR_LCD_CTRL |= BIT(RS);
_lcdInit:
7E1 9ABD SBI 0x17,5
(0112) DDR_LCD_CTRL |= BIT(RW);
7E2 9ABE SBI 0x17,6
(0113) DDR_LCD_CTRL |= BIT(E);
7E3 9ABF SBI 0x17,7
(0114) LCD_CTRL |= BIT(RS);
7E4 9AC5 SBI 0x18,5
(0115) LCD_CTRL |= BIT(RW);
7E5 9AC6 SBI 0x18,6
(0116) LCD_CTRL |= BIT(E);
7E6 9AC7 SBI 0x18,7
(0117)
(0118) FunctionSet();
7E7 E300 LDI R16,0x30
7E8 DF7F RCALL _WriteCommand
(0119) Delayus(150);
7E9 E906 LDI R16,0x96
7EA E010 LDI R17,0
7EB E020 LDI R18,0
7EC E030 LDI R19,0
7ED DF19 RCALL _Delayus
(0120)
(0121) FunctionSet();
7EE E300 LDI R16,0x30
7EF DF78 RCALL _WriteCommand
(0122) Delayus(50);
7F0 E302 LDI R16,0x32
7F1 E010 LDI R17,0
7F2 E020 LDI R18,0
7F3 E030 LDI R19,0
7F4 DF12 RCALL _Delayus
(0123)
(0124) DisplayOff();
7F5 E008 LDI R16,0x8
7F6 DF71 RCALL _WriteCommand
(0125) Delayus(150);
7F7 E906 LDI R16,0x96
7F8 E010 LDI R17,0
7F9 E020 LDI R18,0
7FA E030 LDI R19,0
7FB DF0B RCALL _Delayus
(0126)
(0127) lcdClear(); //清屏程序 需要毫秒级的延时
7FC E001 LDI R16,1
7FD DF6A RCALL _WriteCommand
7FE E00A LDI R16,0xA
7FF DF3B RCALL _Delayms
(0128) Delayus(150);
800 E906 LDI R16,0x96
801 E010 LDI R17,0
802 E020 LDI R18,0
803 E030 LDI R19,0
804 DF02 RCALL _Delayus
(0129) EntryModeSet(); //设定写入时候指针右移
805 E006 LDI R16,6
806 DF61 RCALL _WriteCommand
(0130) DisplayOn();
807 E00C LDI R16,0xC
808 DF5F RCALL _WriteCommand
(0131) Delayus(50);
809 E302 LDI R16,0x32
80A E010 LDI R17,0
80B E020 LDI R18,0
80C E030 LDI R19,0
80D DEF9 RCALL _Delayus
(0132) DisplayOn();
80E E00C LDI R16,0xC
80F DF58 RCALL _WriteCommand
(0133) Delayus(50);
810 E302 LDI R16,0x32
811 E010 LDI R17,0
812 E020 LDI R18,0
813 E030 LDI R19,0
814 DEF2 RCALL _Delayus
815 9508 RET
_lcdDisplay:
LineDispCnt --> R12
i --> R10
ptr --> R20
y --> R14
x --> R22
816 940E 097F CALL push_xgsetF0FC
818 2EE2 MOV R14,R18
819 2F60 MOV R22,R16
81A 854A LDD R20,Y+10
81B 855B LDD R21,Y+11
(0134) }
(0135)
(0136) void lcdDisplay( uchar x, uchar y, uchar *ptr ) //行写满自动换行
(0137) {
(0138) uchar i;
(0139) uchar LineDispCnt = 0;
(0140) LineDispCnt = (16-x+x%2);
81C E012 LDI R17,2
81D 2F06 MOV R16,R22
81E 940E 095C CALL mod8u
820 E180 LDI R24,0x10
821 2EC8 MOV R12,R24
822 1AC6 SUB R12,R22
823 0EC0 ADD R12,R16
(0141) lcdSetXY(x,y);
824 2D2E MOV R18,R14
825 2F06 MOV R16,R22
826 DF69 RCALL _lcdSetXY
(0142) i = 0;
827 24AA CLR R10
828 C017 RJMP 0x0840
(0143) while((ptr[i])!='\0')
(0144) {
(0145) WriteData(ptr[i]);
829 2DEA MOV R30,R10
82A 27FF CLR R31
82B 0FE4 ADD R30,R20
82C 1FF5 ADC R31,R21
82D 8100 LDD R16,Z+0
82E DF4D RCALL _WriteData
(0146) i++;
82F 94A3 INC R10
(0147) if( i%16 == LineDispCnt%16 )
830 E110 LDI R17,0x10
831 2D0C MOV R16,R12
832 940E 095C CALL mod8u
834 2E20 MOV R2,R16
835 E110 LDI R17,0x10
836 2D0A MOV R16,R10
837 940E 095C CALL mod8u
839 1502 CP R16,R2
83A F429 BNE 0x0840
(0148) {
(0149) y++;
83B 94E3 INC R14
(0150) x = 0;
83C 2766 CLR R22
(0151) lcdSetXY(x,y);
83D 2D2E MOV R18,R14
83E 2F06 MOV R16,R22
83F DF50 RCALL _lcdSetXY
840 2DEA MOV R30,R10
841 27FF CLR R31
842 0FE4 ADD R30,R20
843 1FF5 ADC R31,R21
844 8020 LDD R2,Z+0
845 2022 TST R2
846 F711 BNE 0x0829
847 940C 0974 JMP pop_xgsetF0FC
_lcdDispChar:
c --> Y,+2
y --> R12
x --> R10
849 92AA ST R10,-Y
84A 92CA ST R12,-Y
84B 2EC2 MOV R12,R18
84C 2EA0 MOV R10,R16
(0152) }
(0153) }
(0154) }
(0155)
(0156) void lcdDispChar( uchar x, uchar y, uchar c )
(0157) {
(0158) lcdSetXY(x,y);
84D 2D2C MOV R18,R12
84E 2D0A MOV R16,R10
84F DF40 RCALL _lcdSetXY
(0159) WriteData(c);
850 810A LDD R16,Y+2
851 DF2A RCALL _WriteData
852 90C9 LD R12,Y+
853 90A9 LD R10,Y+
854 9508 RET
_lcdDispGraphic:
widthOver --> R20
i --> R14
j --> R10
ptr --> R22
y --> R12
x --> Y,+14
width --> Y,+12
length --> Y,+10
855 940E 091D CALL push_arg4
857 940E 097F CALL push_xgsetF0FC
859 88C8 LDD R12,Y+16
85A 896A LDD R22,Y+18
85B 897B LDD R23,Y+19
(0160) }
(0161)
(0162) void lcdDispGraphic(uchar length,uchar width, uchar x,uchar y,const unsigned char *ptr)
(0163) { //x:横0-15 y:纵 0-63
(0164) uchar i,j;
(0165) uchar widthOver=0;
85C 2744 CLR R20
(0166) if((width + x) > 16) {widthOver = (width + x - 16);width = (16-x);} //超出屏幕
85D 842C LDD R2,Y+12
85E 840E LDD R0,Y+14
85F 0C20 ADD R2,R0
860 E180 LDI R24,0x10
861 1582 CP R24,R2
862 F428 BCC 0x0868
863 854C LDD R20,Y+12
864 0D40 ADD R20,R0
865 5140 SUBI R20,0x10
866 1980 SUB R24,R0
867 878C STD Y+12,R24
(0167) for(i = 0;i< length;i++)
868 24EE CLR R14
869 C017 RJMP 0x0881
(0168) {
(0169) SetGraphicAddr(x,y); //定位12864坐标
86A 2D2C MOV R18,R12
86B 850E LDD R16,Y+14
86C DF54 RCALL _SetGraphicAddr
(0170) for(j = 0; j< width;j++)
86D 24AA CLR R10
86E C007 RJMP 0x0876
(0171) {
(0172) WriteData(*ptr++);
86F 011B MOVW R2,R22
870 5F6F SUBI R22,0xFF
871 4F7F SBCI R23,0xFF
872 01F1 MOVW R30,R2
873 9104 LPM R16,255(Z)
874 DF07 RCALL _WriteData
875 94A3 INC R10
876 840C LDD R0,Y+12
877 14A0 CP R10,R0
878 F3B0 BCS 0x086F
(0173) }
(0174) if(widthOver)ptr +=widthOver;
879 2344 TST R20
87A F021 BEQ 0x087F
87B 2E24 MOV R2,R20
87C 2433 CLR R3
87D 0D62 ADD R22,R2
87E 1D73 ADC R23,R3
(0175) y++;
87F 94C3 INC R12
880 94E3 INC R14
881 840A LDD R0,Y+10
882 14E0 CP R14,R0
883 F330 BCS 0x086A
884 940E 0974 CALL pop_xgsetF0FC
886 9624 ADIW R28,4
887 9508 RET
_ClearArea:
i --> R10
j --> R22
back --> Y,+14
y --> R12
x --> Y,+10
width --> R14
length --> R20
888 940E 097F CALL push_xgsetF0FC
88A 2EE2 MOV R14,R18
88B 2F40 MOV R20,R16
88C 84CC LDD R12,Y+12
(0176) }
(0177) }
(0178)
(0179)
(0180) void ClearArea(uchar length,uchar width, uchar x,uchar y,uchar back)
(0181) {
(0182) uchar i=0,j=0;
88D 24AA CLR R10
88E 2766 CLR R22
(0183) for(i = 0;i< length;i++)
88F C00C RJMP 0x089C
(0184) {
(0185) SetGraphicAddr(x,y); //定位12864坐标
890 2D2C MOV R18,R12
891 850A LDD R16,Y+10
892 DF2E RCALL _SetGraphicAddr
(0186) for(j = 0; j< width;j++)
893 2766 CLR R22
894 C003 RJMP 0x0898
(0187) {
(0188) WriteData(back);
895 850E LDD R16,Y+14
896 DEE5 RCALL _WriteData
897 9563 INC R22
898 156E CP R22,R14
899 F3D8 BCS 0x0895
(0189) }
(0190) y++;
89A 94C3 INC R12
89B 94A3 INC R10
89C 16A4 CP R10,R20
89D F390 BCS 0x0890
89E 940C 0974 JMP pop_xgsetF0FC
_DrawLevelLing:
y1 --> Y,+9
x1 --> Y,+7
y0 --> R12
x0 --> R10
8A0 92AA ST R10,-Y
8A1 92CA ST R12,-Y
8A2 2EC2 MOV R12,R18
8A3 2EA0 MOV R10,R16
8A4 9725 SBIW R28,5
(0191) }
(0192) }
(0193)
(0194)
(0195) void DrawLevelLing( uchar x0,uchar y0, uchar x1,uchar y1)
(0196) {
(0197) ClearArea(1,x1 - x0,x0,y0,0xff);
8A5 EF8F LDI R24,0xFF
8A6 838C STD Y+4,R24
8A7 82CA STD Y+2,R12
8A8 82A8 STD Y+0,R10
8A9 812F LDD R18,Y+7
8AA 192A SUB R18,R10
8AB E001 LDI R16,1
8AC DFDB RCALL _ClearArea
8AD 9625 ADIW R28,5
8AE 90C9 LD R12,Y+
8AF 90A9 LD R10,Y+
8B0 9508 RET
_PicClear1:
COUNT3 --> R20
LCD_X --> R22
LCD_Y --> R10
COUNT2 --> R12
COUNT1 --> R14
8B1 940E 097F CALL push_xgsetF0FC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -