📄 lcd.lst
字号:
6DB E010 LDI R17,0
6DC 940E 073B CALL _Delayms
(0232) Draw_Pic(0,0,*PIC3);
6DE E584 LDI R24,0x54
6DF E098 LDI R25,0x8
6E0 8399 STD Y+1,R25
6E1 8388 STD Y+0,R24
6E2 2722 CLR R18
6E3 2733 CLR R19
6E4 2700 CLR R16
6E5 2711 CLR R17
6E6 940E 08D0 CALL _Draw_Pic
(0233) lcdDisplay(2,0,"设 计 者");
6E8 E68C LDI R24,0x6C
6E9 E090 LDI R25,0
6EA 8399 STD Y+1,R25
6EB 8388 STD Y+0,R24
6EC 2722 CLR R18
6ED E002 LDI R16,2
6EE 940E 0816 CALL _lcdDisplay
(0234) lcdDisplay(1,2,"Love");lcdDisplay(10,2," Music");
6F0 E687 LDI R24,0x67
6F1 E090 LDI R25,0
6F2 8399 STD Y+1,R25
6F3 8388 STD Y+0,R24
6F4 E022 LDI R18,2
6F5 E001 LDI R16,1
6F6 940E 0816 CALL _lcdDisplay
6F8 E680 LDI R24,0x60
6F9 E090 LDI R25,0
6FA 8399 STD Y+1,R25
6FB 8388 STD Y+0,R24
6FC E022 LDI R18,2
6FD E00A LDI R16,0xA
6FE 940E 0816 CALL _lcdDisplay
(0235) Delayms(70);
700 E406 LDI R16,0x46
701 E010 LDI R17,0
702 940E 073B CALL _Delayms
704 CF77 RJMP 0x067C
705 9625 ADIW R28,5
706 9508 RET
_Delayus:
i --> Y,+0
x --> Y,+8
707 940E 091D CALL push_arg4
709 9728 SBIW R28,0x8
FILE: F:\毕业设计\LCM12864\ST7920.c
(0001) #include "ST7920.h"
(0002) void Delayus(ulong x);
(0003) void Delayms(uchar x);
(0004) void BUSYLOOP(void);
(0005) void WriteCommand(uchar command);
(0006) void WriteData(uchar data);
(0007)
(0008) /**********************延时程序START********************************/
(0009) void Delayus(ulong x)
(0010) { ulong i;
(0011) i = x<<4;
70A E084 LDI R24,4
70B E090 LDI R25,0
70C 8508 LDD R16,Y+8
70D 8519 LDD R17,Y+9
70E 852A LDD R18,Y+10
70F 853B LDD R19,Y+11
710 938A ST R24,-Y
711 940E 09A2 CALL lsl32
713 8308 STD Y+0,R16
714 8319 STD Y+1,R17
715 832A STD Y+2,R18
716 833B STD Y+3,R19
(0012) while(i--);
717 8028 LDD R2,Y+0
718 8039 LDD R3,Y+1
719 804A LDD R4,Y+2
71A 805B LDD R5,Y+3
71B 822C STD Y+4,R2
71C 823D STD Y+5,R3
71D 824E STD Y+6,R4
71E 825F STD Y+7,R5
71F E081 LDI R24,1
720 E090 LDI R25,0
721 E0A0 LDI R26,0
722 E0B0 LDI R27,0
723 802C LDD R2,Y+4
724 803D LDD R3,Y+5
725 804E LDD R4,Y+6
726 805F LDD R5,Y+7
727 1A28 SUB R2,R24
728 0A39 SBC R3,R25
729 0A4A SBC R4,R26
72A 0A5B SBC R5,R27
72B 8228 STD Y+0,R2
72C 8239 STD Y+1,R3
72D 824A STD Y+2,R4
72E 825B STD Y+3,R5
72F 802C LDD R2,Y+4
730 803D LDD R3,Y+5
731 804E LDD R4,Y+6
732 805F LDD R5,Y+7
733 E000 LDI R16,0
734 1620 CP R2,R16
735 0630 CPC R3,R16
736 0640 CPC R4,R16
737 0650 CPC R5,R16
738 F6F1 BNE 0x0717
739 962C ADIW R28,0xC
73A 9508 RET
_Delayms:
i --> R20
x --> R10
73B 940E 098A CALL push_xgset300C
73D 2EA0 MOV R10,R16
(0013) }
(0014) void Delayms(uchar x)
(0015) { uint i;
(0016) i = x;
73E 2D4A MOV R20,R10
73F 2755 CLR R21
740 C005 RJMP 0x0746
(0017) while(i--)Delayus(1000);
741 EE08 LDI R16,0xE8
742 E013 LDI R17,3
743 E020 LDI R18,0
744 E030 LDI R19,0
745 DFC1 RCALL _Delayus
746 011A MOVW R2,R20
747 5041 SUBI R20,1
748 4050 SBCI R21,0
749 2022 TST R2
74A F7B1 BNE 0x0741
74B 2033 TST R3
74C F7A1 BNE 0x0741
74D 940C 098F JMP pop_xgset300C
(0018) }
(0019) void BUSYLOOP(void)
(0020) {
(0021) Delayus(10);
_BUSYLOOP:
74F E00A LDI R16,0xA
750 E010 LDI R17,0
751 E020 LDI R18,0
752 E030 LDI R19,0
753 DFB3 RCALL _Delayus
754 9508 RET
_lcm_out:
d --> R22
i --> R20
a --> R16
755 934A ST R20,-Y
756 936A ST R22,-Y
(0022) }
(0023) /**********************延时程序END********************************/
(0024)
(0025) /**********************串行方式相关程序START*********************/
(0026) void lcm_out(uchar a)
(0027) {
(0028) char i,d;
(0029) for(i=0;i<8;i++)
757 2744 CLR R20
758 C00A RJMP 0x0763
(0030) {
(0031) clrbit(LCD_CTRL,E);
759 98C7 CBI 0x18,7
(0032) d=a&0x80;
75A 2F60 MOV R22,R16
75B 7860 ANDI R22,0x80
(0033) if(d)
75C F011 BEQ 0x075F
(0034) setbit(LCD_CTRL,RW);
75D 9AC6 SBI 0x18,6
75E C001 RJMP 0x0760
(0035) else
(0036) clrbit(LCD_CTRL,RW);
75F 98C6 CBI 0x18,6
(0037) a<<=1;
760 0F00 LSL R16
(0038) setbit(LCD_CTRL,E); //上升弦发送
761 9AC7 SBI 0x18,7
762 9543 INC R20
763 3048 CPI R20,0x8
764 F3A0 BCS 0x0759
765 9169 LD R22,Y+
766 9149 LD R20,Y+
767 9508 RET
_WriteCommand:
s --> R20
command --> R22
768 934A ST R20,-Y
769 936A ST R22,-Y
76A 2F60 MOV R22,R16
(0039) }
(0040) }
(0041)
(0042)
(0043) void WriteCommand(uchar command) //发送命令字
(0044) {
(0045) uchar s; //,i;
(0046) s=command&0xf0;
76B 2F46 MOV R20,R22
76C 7F40 ANDI R20,0xF0
(0047) lcm_out(0xf8); //送写命令指令 1111 1 RW=0 RS=0 0
76D EF08 LDI R16,0xF8
76E DFE6 RCALL _lcm_out
(0048) lcm_out(s); //发送高四位数据
76F 2F04 MOV R16,R20
770 DFE4 RCALL _lcm_out
(0049) s=command&0x0f;
771 2F46 MOV R20,R22
772 704F ANDI R20,0xF
(0050) s<<=4;
773 2F84 MOV R24,R20
774 708F ANDI R24,0xF
775 9582 SWAP R24
776 2F48 MOV R20,R24
(0051) lcm_out(s); //发送低四位数据
777 2F08 MOV R16,R24
778 DFDC RCALL _lcm_out
779 9169 LD R22,Y+
77A 9149 LD R20,Y+
77B 9508 RET
_WriteData:
s --> R20
data --> R22
77C 934A ST R20,-Y
77D 936A ST R22,-Y
77E 2F60 MOV R22,R16
(0052) //for(i=1;i>0;i--)BUSYLOOP(); //延时10us 延时后写命令就消失?
(0053) }
(0054)
(0055)
(0056) void WriteData(uchar data)
(0057) {
(0058)
(0059) uchar s; //,i;
(0060) s=data&0xf0;
77F 2F46 MOV R20,R22
780 7F40 ANDI R20,0xF0
(0061) lcm_out(0xfa); //送写数据指令 1111 1 RW=0 RS=1 0
781 EF0A LDI R16,0xFA
782 DFD2 RCALL _lcm_out
(0062) lcm_out(s);
783 2F04 MOV R16,R20
784 DFD0 RCALL _lcm_out
(0063) s=data&0x0f;
785 2F46 MOV R20,R22
786 704F ANDI R20,0xF
(0064) s<<=4;
787 2F84 MOV R24,R20
788 708F ANDI R24,0xF
789 9582 SWAP R24
78A 2F48 MOV R20,R24
(0065) lcm_out(s);
78B 2F08 MOV R16,R24
78C DFC8 RCALL _lcm_out
78D 9169 LD R22,Y+
78E 9149 LD R20,Y+
78F 9508 RET
_lcdSetXY:
position --> R20
y --> R10
x --> R22
790 940E 0994 CALL push_xgsetF00C
792 2EA2 MOV R10,R18
793 2F60 MOV R22,R16
(0066) //for(i=1;i>0;i--)BUSYLOOP(); //延时10us 延时后写命令就无效?
(0067) }
(0068) /**********************串行方式相关程序END*********************/
(0069)
(0070)
(0071) /**********************液晶文字显示相关程序START*************/
(0072)
(0073)
(0074) void lcdSetXY(uchar x,uchar y) //定位坐标的位置,这个主要跟字符显示相关
(0075) { //x:横0-15 y:纵 0-3 ;x,y对应12864的坐标
(0076) unsigned char position=0;
794 2744 CLR R20
(0077) x &= 0x0f;//x%16;
795 706F ANDI R22,0xF
(0078) switch(y%4)
796 E024 LDI R18,4
797 E030 LDI R19,0
798 2D0A MOV R16,R10
799 2711 CLR R17
79A 940E 0922 CALL mod16s
79C 0158 MOVW R10,R16
79D 3000 CPI R16,0
79E 0701 CPC R16,R17
79F F071 BEQ 0x07AE
7A0 01C5 MOVW R24,R10
7A1 3001 CPI R16,1
7A2 E0E0 LDI R30,0
7A3 071E CPC R17,R30
7A4 F069 BEQ 0x07B2
7A5 3002 CPI R16,2
7A6 E0E0 LDI R30,0
7A7 071E CPC R17,R30
7A8 F069 BEQ 0x07B6
7A9 3003 CPI R16,3
7AA E0E0 LDI R30,0
7AB 071E CPC R17,R30
7AC F069 BEQ 0x07BA
7AD C00F RJMP 0x07BD
(0079) { //第零行和第二行寄存器连续 第一行和第三行寄存器连续
(0080) case 0: position = 0x80 + (x>>1); break; // |0x80 ~ 0x87|
7AE 2F46 MOV R20,R22
7AF 9546 LSR R20
7B0 5840 SUBI R20,0x80
7B1 C00B RJMP 0x07BD
(0081) case 1: position = 0x90 + (x>>1); break; // |0x90 ~ 0x97|
7B2 2F46 MOV R20,R22
7B3 9546 LSR R20
7B4 5740 SUBI R20,0x70
7B5 C007 RJMP 0x07BD
(0082) case 2: position = 0x88 + (x>>1); break; // |0x88 ~ 0x8f|
7B6 2F46 MOV R20,R22
7B7 9546 LSR R20
7B8 5748 SUBI R20,0x78
7B9 C003 RJMP 0x07BD
(0083) case 3: position = 0x98 + (x>>1); break; // |0x98 ~ 0x9f|
7BA 2F46 MOV R20,R22
7BB 9546 LSR R20
7BC 5648 SUBI R20,0x68
(0084) default: break;
(0085) }
(0086) WriteCommand(position);
7BD 2F04 MOV R16,R20
7BE DFA9 RCALL _WriteCommand
7BF 940C 099B JMP pop_xgsetF00C
_SetGraphicAddr:
ytemp --> R22
y --> R10
x --> R20
7C1 940E 0994 CALL push_xgsetF00C
7C3 2EA2 MOV R10,R18
7C4 2F40 MOV R20,R16
(0087) }
(0088)
(0089) //x:横0-15 y:纵 0-63
(0090) void SetGraphicAddr(uchar x,uchar y)
(0091) {
(0092) uchar ytemp;
(0093) EX_FT(); //跟绘图设置有关 8BIT控制界面,扩充指令集,,绘图显示开
7C5 E306 LDI R16,0x36
7C6 DFA1 RCALL _WriteCommand
(0094) ytemp = (y & 0x1f) | 0x80;
7C7 2D6A MOV R22,R10
7C8 716F ANDI R22,0x1F
7C9 6860 ORI R22,0x80
(0095) WriteCommand(ytemp); //先写st7920 垂直坐标
7CA 2F06 MOV R16,R22
7CB DF9C RCALL _WriteCommand
(0096) ytemp = (y>>5); //12864的y坐标打印32的对应ST水平坐标0x88~0x8f,垂直坐标(y-32)
7CC 2D6A MOV R22,R10
7CD 9566 LSR R22
7CE 9566 LSR R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -