?? 12864-7920.lst
字號:
__text_start:
__start:
45 E5CF LDI R28,0x5F
46 E0D4 LDI R29,4
47 BFCD OUT 0x3D,R28
48 BFDE OUT 0x3E,R29
49 51CE SUBI R28,0x1E
4A 40D0 SBCI R29,0
4B EA0A LDI R16,0xAA
4C 8308 STD Y+0,R16
4D 2400 CLR R0
4E E9E6 LDI R30,0x96
4F E0F0 LDI R31,0
50 E010 LDI R17,0
51 39E6 CPI R30,0x96
52 07F1 CPC R31,R17
53 F011 BEQ 0x0056
54 9201 ST R0,Z+
55 CFFB RJMP 0x0051
56 8300 STD Z+0,R16
57 E5E4 LDI R30,0x54
58 E0F0 LDI R31,0
59 E6A0 LDI R26,0x60
5A E0B0 LDI R27,0
5B E010 LDI R17,0
5C E000 LDI R16,0
5D BF0B OUT 0x3B,R16
5E 38EA CPI R30,0x8A
5F 07F1 CPC R31,R17
60 F021 BEQ 0x0065
61 95C8 LPM
62 9631 ADIW R30,1
63 920D ST R0,X+
64 CFF9 RJMP 0x005E
65 940E 011B CALL _main
_exit:
67 CFFF RJMP _exit
FILE: E:\產品\開發板\光盤\16實驗程序\12864-7920液晶\12864-7920.c
(0001) //12864液晶的試驗程序,驅動芯片為ST7920
(0002) //目標板為DDC-16A
(0003) //驅動方式-并口
(0004) //JP10短路塊位于右側,JP1兩個短路塊均插好
(0005) //調節V0電位器調整對比度
(0006) //注意:因為廠家不同液晶的19腳和20腳(背光)有時會不同,導致背光不亮,需要注意。
(0007)
(0008) #include <iom16v.h>
(0009) #include <string.h>
(0010)
(0011) #define uchar unsigned char
(0012) #define uint unsigned int
(0013)
(0014) #define RS (1<<5)
(0015) #define RW (1<<6)
(0016) #define EN (1<<7)
(0017)
(0018) //延時函數
(0019) void s_ms(uint ms)
(0020) {
(0021) for(;ms>1;ms--);
_s_ms:
ms --> R16
68 C002 RJMP 0x006B
69 5001 SUBI R16,1
6A 4010 SBCI R17,0
6B E081 LDI R24,1
6C E090 LDI R25,0
6D 1780 CP R24,R16
6E 0791 CPC R25,R17
6F F3C8 BCS 0x0069
70 9508 RET
_WriteDataLCM:
WDLCM --> R10
71 92AA ST R10,-Y
72 2EA0 MOV R10,R16
(0022) }
(0023)
(0024) //此處定義字符串
(0025) char text_1[]={"北京東控開發板"};
(0026) char text_2[]={"WWW.ISMCU.COM"};
(0027) char text_3[]={"WDD_CN@126.COM"};
(0028) char text_4[]={"QQ:621520"};
(0029)
(0030) //寫數據
(0031) void WriteDataLCM(unsigned char WDLCM)
(0032) {
(0033) //ReadStatusLCM(); //檢測忙
(0034) s_ms(100);
73 E604 LDI R16,0x64
74 E010 LDI R17,0
75 DFF2 RCALL _s_ms
(0035) PORTA|=RS; //RS=1
76 9ADD SBI 0x1B,5
(0036) s_ms(100);
77 E604 LDI R16,0x64
78 E010 LDI R17,0
79 DFEE RCALL _s_ms
(0037) PORTA&=~RW; //RW=0
7A 98DE CBI 0x1B,6
(0038) s_ms(100);
7B E604 LDI R16,0x64
7C E010 LDI R17,0
7D DFEA RCALL _s_ms
(0039) PORTA|=EN; //EN=1
7E 9ADF SBI 0x1B,7
(0040) s_ms(100);
7F E604 LDI R16,0x64
80 E010 LDI R17,0
81 DFE6 RCALL _s_ms
(0041) PORTD=WDLCM; //輸出數據
82 BAA2 OUT 0x12,R10
(0042) s_ms(100);
83 E604 LDI R16,0x64
84 E010 LDI R17,0
85 DFE2 RCALL _s_ms
(0043) PORTA&=~EN; //EN=0
86 98DF CBI 0x1B,7
(0044) s_ms(100);
87 E604 LDI R16,0x64
88 E010 LDI R17,0
89 DFDE RCALL _s_ms
8A 90A9 LD R10,Y+
8B 9508 RET
_WriteCommandLCM:
WCLCM --> R10
8C 92AA ST R10,-Y
8D 2EA0 MOV R10,R16
(0045) }
(0046)
(0047) //寫指令
(0048) void WriteCommandLCM(unsigned char WCLCM)
(0049) {
(0050) //ReadStatusLCM(); //根據需要檢測忙
(0051) s_ms(100);
8E E604 LDI R16,0x64
8F E010 LDI R17,0
90 DFD7 RCALL _s_ms
(0052) PORTA&=~RS; //RS=0
91 98DD CBI 0x1B,5
(0053) s_ms(100);
92 E604 LDI R16,0x64
93 E010 LDI R17,0
94 DFD3 RCALL _s_ms
(0054) PORTA&=~RW; //RW=0
95 98DE CBI 0x1B,6
(0055) s_ms(100);
96 E604 LDI R16,0x64
97 E010 LDI R17,0
98 DFCF RCALL _s_ms
(0056) PORTA|=EN; //EN=1
99 9ADF SBI 0x1B,7
(0057) s_ms(100);
9A E604 LDI R16,0x64
9B E010 LDI R17,0
9C DFCB RCALL _s_ms
(0058) PORTD=WCLCM; //輸出指令
9D BAA2 OUT 0x12,R10
(0059) s_ms(100);
9E E604 LDI R16,0x64
9F E010 LDI R17,0
A0 DFC7 RCALL _s_ms
(0060) PORTA&=~EN; //EN=0
A1 98DF CBI 0x1B,7
(0061) s_ms(100);
A2 E604 LDI R16,0x64
A3 E010 LDI R17,0
A4 DFC3 RCALL _s_ms
A5 90A9 LD R10,Y+
A6 9508 RET
_ReadStatusLCM:
flag --> R20
temp --> R10
A7 92AA ST R10,-Y
A8 934A ST R20,-Y
(0062) }
(0063)
(0064) //讀狀態:檢測忙
(0065) void ReadStatusLCM(void)
(0066) {
(0067) uchar temp;
(0068) uchar flag = 1;
A9 E041 LDI R20,1
AA C02A RJMP 0x00D5
(0069) while(flag==1)
(0070) {
(0071) DDRD=0x00; //端口A改為輸入
AB 2422 CLR R2
AC BA21 OUT 0x11,R2
(0072) PORTD=0xff;
AD EF8F LDI R24,0xFF
AE BB82 OUT 0x12,R24
(0073) s_ms(100);
AF E604 LDI R16,0x64
B0 E010 LDI R17,0
B1 DFB6 RCALL _s_ms
(0074) PORTA&=~RS; //RS=0
B2 98DD CBI 0x1B,5
(0075) s_ms(100);
B3 E604 LDI R16,0x64
B4 E010 LDI R17,0
B5 DFB2 RCALL _s_ms
(0076) PORTA|=RW; //RW=1
B6 9ADE SBI 0x1B,6
(0077) s_ms(100);
B7 E604 LDI R16,0x64
B8 E010 LDI R17,0
B9 DFAE RCALL _s_ms
(0078) PORTA|=EN; //EN=1
BA 9ADF SBI 0x1B,7
(0079) s_ms(1000);
BB EE08 LDI R16,0xE8
BC E013 LDI R17,3
BD DFAA RCALL _s_ms
(0080) temp = PIND; //讀端口A
BE B2A0 IN R10,0x10
(0081) s_ms(1000);
BF EE08 LDI R16,0xE8
C0 E013 LDI R17,3
C1 DFA6 RCALL _s_ms
(0082) DDRD=0xff; //端口A改為
C2 EF8F LDI R24,0xFF
C3 BB81 OUT 0x11,R24
(0083) s_ms(100);
C4 E604 LDI R16,0x64
C5 E010 LDI R17,0
C6 DFA1 RCALL _s_ms
(0084) PORTA&=~EN; //EN=0
C7 98DF CBI 0x1B,7
(0085) s_ms(100);
C8 E604 LDI R16,0x64
C9 E010 LDI R17,0
CA DF9D RCALL _s_ms
(0086) if(temp>>7==0)
CB 2C2A MOV R2,R10
CC 9426 LSR R2
CD 9426 LSR R2
CE 9426 LSR R2
CF 9426 LSR R2
D0 9426 LSR R2
D1 9426 LSR R2
D2 9426 LSR R2
D3 F409 BNE 0x00D5
(0087) flag = 0;
D4 2744 CLR R20
D5 3041 CPI R20,1
D6 F2A1 BEQ 0x00AB
D7 9149 LD R20,Y+
D8 90A9 LD R10,Y+
D9 9508 RET
(0088) }
(0089) }
(0090)
(0091) //LCM初始化
(0092) void LCMInit(void)
(0093) {
(0094) WriteCommandLCM(0x38); //三次顯示模式設置,不檢測忙信號
_LCMInit:
DA E308 LDI R16,0x38
DB DFB0 RCALL _WriteCommandLCM
(0095) s_ms(1000);
DC EE08 LDI R16,0xE8
DD E013 LDI R17,3
DE DF89 RCALL _s_ms
(0096) WriteCommandLCM(0x38);
DF E308 LDI R16,0x38
E0 DFAB RCALL _WriteCommandLCM
(0097) s_ms(1000);
E1 EE08 LDI R16,0xE8
E2 E013 LDI R17,3
E3 DF84 RCALL _s_ms
(0098) WriteCommandLCM(0x38);
E4 E308 LDI R16,0x38
E5 DFA6 RCALL _WriteCommandLCM
(0099) s_ms(1000);
E6 EE08 LDI R16,0xE8
E7 E013 LDI R17,3
E8 DF7F RCALL _s_ms
(0100) WriteCommandLCM(0x38); //顯示模式設置,開始要求每次檢測忙信號
E9 E308 LDI R16,0x38
EA DFA1 RCALL _WriteCommandLCM
(0101) WriteCommandLCM(0x08); //關閉顯示
EB E008 LDI R16,0x8
EC DF9F RCALL _WriteCommandLCM
(0102) WriteCommandLCM(0x01); //顯示清屏
ED E001 LDI R16,1
EE DF9D RCALL _WriteCommandLCM
(0103) WriteCommandLCM(0x06); //顯示光標移動設置
EF E006 LDI R16,6
F0 DF9B RCALL _WriteCommandLCM
(0104) WriteCommandLCM(0x0C); //顯示開及光標設置
F1 E00C LDI R16,0xC
F2 DF99 RCALL _WriteCommandLCM
F3 9508 RET
_DisplayList:
p --> R14
length --> R14
i --> R10
DData --> R12
X --> R20
F4 940E 0153 CALL push_xgset30FC
F6 0169 MOVW R12,R18
F7 2F40 MOV R20,R16
(0105) }
(0106)
(0107) //按指定位置顯示一串字符
(0108) //液晶顯示:漢字為16*16,字母及數字為8*16,此次顯示的文本
(0109) // 從第一行第一列開始,依次向左,如果想在不同的
(0110) // 位置顯示,只需修改相應的行值即可。液晶顯示
(0111) // 完畢后,轉入語音文本發送。
(0112) //DisplsyList(X,DData)函數:X為0x80在第一行顯示;X為0x90在
(0113) // 第二行顯示;X為0x88在第三行顯示;X為0x98在
(0114) // 第四行顯示;DData為顯示數組。
(0115) void DisplayList(unsigned char X,char *DData)
(0116) {
(0117) unsigned char length;
(0118) unsigned char i=0;
F8 24AA CLR R10
(0119) char *p;
(0120) p = DData;
F9 0176 MOVW R14,R12
(0121) length = strlen(p);
FA 0187 MOVW R16,R14
FB 940E 013C CALL _strlen
FD 2EE0 MOV R14,R16
(0122) WriteCommandLCM(0x08);
FE E008 LDI R16,0x8
FF DF8C RCALL _WriteCommandLCM
(0123) WriteCommandLCM(X);
100 2F04 MOV R16,R20
101 DF8A RCALL _WriteCommandLCM
(0124) WriteCommandLCM(0x06);
102 E006 LDI R16,6
103 DF88 RCALL _WriteCommandLCM
(0125) WriteCommandLCM(0x0C);
104 E00C LDI R16,0xC
105 DF86 RCALL _WriteCommandLCM
(0126) WriteCommandLCM(X);
106 2F04 MOV R16,R20
107 DF84 RCALL _WriteCommandLCM
(0127) for(i=0;i<length;i++)
108 C00E RJMP 0x0117
(0128) {
(0129) WriteDataLCM(DData[i]);
109 2DEA MOV R30,R10
10A 27FF CLR R31
10B 0DEC ADD R30,R12
10C 1DFD ADC R31,R13
10D 8100 LDD R16,Z+0
10E DF62 RCALL _WriteDataLCM
(0130) i++;
10F 94A3 INC R10
(0131) WriteDataLCM(DData[i]);
110 2DEA MOV R30,R10
111 27FF CLR R31
112 0DEC ADD R30,R12
113 1DFD ADC R31,R13
114 8100 LDD R16,Z+0
115 DF5B RCALL _WriteDataLCM
116 94A3 INC R10
117 14AE CP R10,R14
118 F380 BCS 0x0109
119 940C 0148 JMP pop_xgset30FC
(0132) }
(0133) }
(0134)
(0135) //主函數
(0136) void main(void)
(0137) {
(0138) //端口初始化
(0139) DDRA=0xff;
_main:
11B EF8F LDI R24,0xFF
11C BB8A OUT 0x1A,R24
(0140) PORTA=0xff;
11D BB8B OUT 0x1B,R24
(0141) DDRB=0xff;
11E BB87 OUT 0x17,R24
(0142) PORTB=0xff;
11F BB88 OUT 0x18,R24
(0143) DDRD=0xff;
120 BB81 OUT 0x11,R24
(0144) PORTD=0x00;
121 2422 CLR R2
122 BA22 OUT 0x12,R2
(0145)
(0146) s_ms(200);
123 EC08 LDI R16,0xC8
124 E010 LDI R17,0
125 DF42 RCALL _s_ms
(0147) s_ms(200);
126 EC08 LDI R16,0xC8
127 E010 LDI R17,0
128 DF3F RCALL _s_ms
(0148) LCMInit(); //LCM初始化 //液晶初始化
129 DFB0 RCALL _LCMInit
(0149)
(0150) DisplayList(0x80,text_1); //顯示第一行
12A E620 LDI R18,0x60
12B E030 LDI R19,0
12C E800 LDI R16,0x80
12D DFC6 RCALL _DisplayList
(0151) DisplayList(0x90,text_2); //顯示第二行
12E E62F LDI R18,0x6F
12F E030 LDI R19,0
130 E900 LDI R16,0x90
131 DFC2 RCALL _DisplayList
(0152) DisplayList(0x88,text_3); //顯示第三行
132 E72D LDI R18,0x7D
133 E030 LDI R19,0
134 E808 LDI R16,0x88
135 DFBE RCALL _DisplayList
(0153) DisplayList(0x98,text_4); //顯示第四行
136 E82C LDI R18,0x8C
137 E030 LDI R19,0
138 E908 LDI R16,0x98
139 DFBA RCALL _DisplayList
(0154) while(1);
FILE: <library>
13A CFFF RJMP 0x013A
13B 9508 RET
_strlen:
13C 2FE0 MOV R30,R16
13D 2FF1 MOV R31,R17
13E 27AA CLR R26
13F 27BB CLR R27
140 9001 LD R0,Z+
141 2000 TST R0
142 F011 BEQ 0x0145
143 9611 ADIW R26,1
144 CFFB RJMP 0x0140
145 2F0A MOV R16,R26
146 2F1B MOV R17,R27
147 9508 RET
pop_xgset30FC:
148 90A9 LD R10,Y+
149 90B9 LD R11,Y+
14A 90C9 LD R12,Y+
14B 90D9 LD R13,Y+
14C 90E9 LD R14,Y+
14D 90F9 LD R15,Y+
14E 9149 LD R20,Y+
14F 9159 LD R21,Y+
150 9508 RET
push_xgsetF0FC:
151 937A ST R23,-Y
152 936A ST R22,-Y
push_xgset30FC:
153 935A ST R21,-Y
154 934A ST R20,-Y
push_xgset00FC:
155 92FA ST R15,-Y
156 92EA ST R14,-Y
push_xgset003C:
157 92DA ST R13,-Y
158 92CA ST R12,-Y
159 92BA ST R11,-Y
15A 92AA ST R10,-Y
15B 9508 RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -