📄 dtmf2.lst
字号:
727 02f8 FECF rjmp .L50
179:dtmf2.c **** UDR = data; //start transmittion
729 .LM98:
730 02fa 8CB9 out 44-0x20,r24
180:dtmf2.c **** }
732 .LM99:
733 /* epilogue: frame size=0 */
734 02fc 0895 ret
735 /* epilogue end (size=1) */
736 /* function TXbyte size 4 (3) */
738 .Lscope4:
743 .global ewrite
745 ewrite:
181:dtmf2.c ****
182:dtmf2.c ****
183:dtmf2.c **** void ewrite (char address, char data) //Writes char to EEPROM address
184:dtmf2.c **** {
747 .LM100:
748 /* prologue: frame size=0 */
749 /* prologue end (size=0) */
750 02fe 982F mov r25,r24
185:dtmf2.c **** cli();
752 .LM101:
753 /* #APP */
754 0300 F894 cli
186:dtmf2.c **** while ((EECR >> EEWE) & 1);
756 .LM102:
757 /* #NOAPP */
758 .L55:
759 0302 8CB3 in r24,60-0x20
760 0304 8695 lsr r24
761 0306 80FD sbrc r24,0
762 0308 FCCF rjmp .L55
187:dtmf2.c **** EEARL = address>>1;
764 .LM103:
765 030a 9695 lsr r25
766 030c 9EBB out 62-0x20,r25
188:dtmf2.c **** EEDR = data;
768 .LM104:
769 030e 6DBB out 61-0x20,r22
189:dtmf2.c **** sbi (EECR,2);
771 .LM105:
772 0310 E29A sbi 60-0x20,2
190:dtmf2.c **** sbi (EECR,1);
774 .LM106:
775 0312 E19A sbi 60-0x20,1
191:dtmf2.c **** sei();
777 .LM107:
778 /* #APP */
779 0314 7894 sei
192:dtmf2.c **** }
781 .LM108:
782 /* #NOAPP */
783 /* epilogue: frame size=0 */
784 0316 0895 ret
785 /* epilogue end (size=1) */
786 /* function ewrite size 15 (14) */
788 .Lscope5:
792 .global eread
794 eread:
193:dtmf2.c ****
194:dtmf2.c **** unsigned char eread (char address) //Reads char from EEPROM address
195:dtmf2.c **** {
796 .LM109:
797 /* prologue: frame size=0 */
798 /* prologue end (size=0) */
799 0318 982F mov r25,r24
196:dtmf2.c **** EEARL = address>>1;
801 .LM110:
802 031a 8695 lsr r24
803 031c 8EBB out 62-0x20,r24
197:dtmf2.c **** sbi (EECR,0);
805 .LM111:
806 031e E09A sbi 60-0x20,0
198:dtmf2.c **** if(address&1) return (EEDR & 0x0F); //Read LSN on odd address
808 .LM112:
809 0320 90FF sbrs r25,0
810 0322 05C0 rjmp .L60
811 0324 8DB3 in r24,61-0x20
812 0326 9927 clr r25
813 0328 8F70 andi r24,lo8(15)
814 032a 9070 andi r25,hi8(15)
199:dtmf2.c **** else return (EEDR >> 4); //Read MSN on even address
200:dtmf2.c **** }
816 .LM113:
817 032c 0895 ret
818 .L60:
820 .LM114:
821 032e 8DB3 in r24,61-0x20
822 0330 8295 swap r24
823 0332 8F70 andi r24,0x0f
824 0334 9927 clr r25
826 .LM115:
827 0336 0895 ret
828 /* epilogue: frame size=0 */
829 0338 0895 ret
830 /* epilogue end (size=1) */
831 /* function eread size 17 (16) */
833 .Lscope6:
837 .global store
839 store:
201:dtmf2.c ****
202:dtmf2.c ****
203:dtmf2.c **** void store(unsigned char edata) //Compresses and appends digit to the end of eeprom
204:dtmf2.c **** {
841 .LM116:
842 /* prologue: frame size=0 */
843 033a CF93 push r28
844 /* prologue end (size=1) */
845 033c C82F mov r28,r24
205:dtmf2.c **** unsigned char old;
206:dtmf2.c **** if (eepos&1) { //test if Marker is in MSN or LSN
847 .LM117:
848 .LBB8:
849 033e 8091 0000 lds r24,eepos
850 0342 80FF sbrs r24,0
851 0344 16C0 rjmp .L63
207:dtmf2.c **** old = eread(eepos-1); //read byte that will be overwritten
853 .LM118:
854 0346 8150 subi r24,lo8(-(-1))
855 0348 E7DF rcall eread
856 034a 682F mov r22,r24
208:dtmf2.c **** old = old<<4;
858 .LM119:
859 034c 6295 swap r22
860 034e 607F andi r22,0xf0
209:dtmf2.c **** old|= edata; //place new in LSN
862 .LM120:
863 0350 6C2B or r22,r28
210:dtmf2.c **** ewrite(eepos,old); //write new byte
865 .LM121:
866 0352 8091 0000 lds r24,eepos
867 0356 D3DF rcall ewrite
211:dtmf2.c **** eepos++; //increment eeprom address
869 .LM122:
870 0358 8091 0000 lds r24,eepos
871 035c 8F5F subi r24,lo8(-(1))
872 035e 8093 0000 sts eepos,r24
212:dtmf2.c **** old = eread(eepos+1); //read byte that will be overwritten
874 .LM123:
875 0362 8F5F subi r24,lo8(-(1))
876 0364 D9DF rcall eread
877 0366 682F mov r22,r24
213:dtmf2.c **** old|= 0xF0; //put Marker in MSN, keep data in LSN
879 .LM124:
880 0368 606F ori r22,lo8(-16)
214:dtmf2.c **** ewrite(eepos,old); //write new marker byte
882 .LM125:
883 036a 8091 0000 lds r24,eepos
884 036e C7DF rcall ewrite
885 0370 0AC0 rjmp .L62
886 .L63:
215:dtmf2.c **** }
216:dtmf2.c **** else {
217:dtmf2.c **** edata = (edata << 4); //Move data in LSN to MSN
888 .LM126:
889 0372 C295 swap r28
890 0374 C07F andi r28,0xf0
218:dtmf2.c **** edata|= 0x0F; //put Marker in LSN
892 .LM127:
893 0376 CF60 ori r28,lo8(15)
219:dtmf2.c **** ewrite(eepos,edata); //write new marker and data byte
895 .LM128:
896 0378 6C2F mov r22,r28
897 037a C1DF rcall ewrite
220:dtmf2.c **** eepos++;
899 .LM129:
900 037c 8091 0000 lds r24,eepos
901 0380 8F5F subi r24,lo8(-(1))
902 0382 8093 0000 sts eepos,r24
221:dtmf2.c **** }
222:dtmf2.c **** }
904 .LM130:
905 .L62:
906 .LBE8:
907 /* epilogue: frame size=0 */
908 0386 CF91 pop r28
909 0388 0895 ret
910 /* epilogue end (size=2) */
911 /* function store size 40 (37) */
916 .Lscope7:
921 .global trnsfr
923 trnsfr:
223:dtmf2.c ****
224:dtmf2.c ****
225:dtmf2.c **** void trnsfr(char line, char eol) //Moves digits from eeprom to LCD line
226:dtmf2.c **** {
925 .LM131:
926 /* prologue: frame size=0 */
927 038a 1F93 push r17
928 038c CF93 push r28
929 /* prologue end (size=2) */
930 038e C82F mov r28,r24
931 0390 162F mov r17,r22
227:dtmf2.c **** unsigned char hold,pop;
228:dtmf2.c **** if(line<10) { //test if line is less than 10
933 .LM132:
934 .LBB9:
935 0392 8A30 cpi r24,lo8(10)
936 0394 20F4 brsh .L66
229:dtmf2.c **** lcdata (' '); //write space on LCD
938 .LM133:
939 0396 60E2 ldi r22,lo8(32)
940 0398 81E0 ldi r24,lo8(1)
941 039a B9D0 rcall lcdwrt
230:dtmf2.c **** lcdata ((line|0x30)); //write 'ones' line number on LCD
943 .LM134:
944 039c 04C0 rjmp .L75
945 .L66:
231:dtmf2.c **** }
232:dtmf2.c **** else { //if line greater than 9....
233:dtmf2.c **** lcdata ('1'); //write 1 on LCD
947 .LM135:
948 039e 61E3 ldi r22,lo8(49)
949 03a0 81E0 ldi r24,lo8(1)
950 03a2 B5D0 rcall lcdwrt
234:dtmf2.c **** lcdata (((line-10)|0x30)); //write 'ones' line number on LCD
952 .LM136:
953 03a4 CA50 subi r28,lo8(-(-10))
954 .L75:
955 03a6 C063 ori r28,lo8(48)
956 03a8 6C2F mov r22,r28
957 03aa 81E0 ldi r24,lo8(1)
958 03ac B0D0 rcall lcdwrt
235:dtmf2.c **** }
236:dtmf2.c **** lcdata ('-'); //write "-" after line number
960 .LM137:
961 03ae 6DE2 ldi r22,lo8(45)
962 03b0 81E0 ldi r24,lo8(1)
963 03b2 ADD0 rcall lcdwrt
237:dtmf2.c **** for(pop=1;pop<=13;pop++) { //Read nibbles
965 .LM138:
966 03b4 C1E0 ldi r28,lo8(1)
967 .L72:
238:dtmf2.c **** hold = eread(pop+eref-eol-14); //Get byte from eeprom
969 .LM139:
970 03b6 8091 0000 lds r24,eref
971 03ba 8C0F add r24,r28
972 03bc 811B sub r24,r17
973 03be 8E50 subi r24,lo8(-(-14))
974 03c0 ABDF rcall eread
239:dtmf2.c **** lcdata (fltr(hold)); //Send to LCD
976 .LM140:
977 03c2 8DD0 rcall fltr
978 03c4 682F mov r22,r24
979 03c6 81E0 ldi r24,lo8(1)
980 03c8 A2D0 rcall lcdwrt
982 .LM141:
983 03ca CF5F subi r28,lo8(-(1))
984 03cc CE30 cpi r28,lo8(14)
985 03ce 98F3 brlo .L72
240:dtmf2.c **** }
241:dtmf2.c **** }
987 .LM142:
988 .LBE9:
989 /* epilogue: frame size=0 */
990 03d0 CF91 pop r28
991 03d2 1F91 pop r17
992 03d4 0895 ret
993 /* epilogue end (size=3) */
994 /* function trnsfr size 38 (33) */
1000 .Lscope8:
1004 .global updtlcd
1006 updtlcd:
242:dtmf2.c ****
243:dtmf2.c **** void updtlcd(unsigned char ldata) //Handles writing new dtmf digit to LCD
244:dtmf2.c **** {
1008 .LM143:
1009 /* prologue: frame size=0 */
1010 03d6 CF93 push r28
1011 /* prologue end (size=1) */
1012 03d8 C82F mov r28,r24
245:dtmf2.c **** if (redraw==1 && lcdpos<13) { // Redraw LCD if up/dn stuff is on it
1014 .LM144:
1015 03da 6091 0000 lds r22,redraw
1016 03de 6130 cpi r22,lo8(1)
1017 03e0 A1F4 brne .L77
1018 03e2 8091 0000 lds r24,lcdpos
1019 03e6 8D30 cpi r24,lo8(13)
1020 03e8 80F4 brsh .L77
246:dtmf2.c **** redraw = 0;
1022 .LM145:
1023 03ea 1092 0000 sts redraw,__zero_reg__
247:dtmf2.c **** esrl = 0;
1025 .LM146:
1026 03ee 1092 0000 sts esrl,__zero_reg__
248:dtmf2.c **** lcdln = 19; //reset line numbner
1028 .LM147:
1029 03f2 83E1 ldi r24,lo8(19)
1030 03f4 8093 0000 sts lcdln,r24
249:dtmf2.c **** lcdcmd (0x01); //Clear LCD, move home//clear lcd
1032 .LM148:
1033 03f8 80E0 ldi r24,lo8(0)
1034 03fa 89D0 rcall lcdwrt
250:dtmf2.c **** trnsfr (18, 0); //draw line 18
1036 .LM149:
1037 03fc 60E0 ldi r22,lo8(0)
1038 03fe 82E1 ldi r24,lo8(18)
1039 0400 C4DF rcall trnsfr
251:dtmf2.c **** lcdcmd (0xC0); //set cursor at begining of bottom line
1041 .LM150:
1042 0402 60EC ldi r22,lo8(-64)
1043 0404 80E0 ldi r24,lo8(0)
1044 0406 83D0 rcall lcdwrt
252:dtmf2.c **** line19(); //re-draw line 19
1046 .LM151:
1047 0408 48D0 rcall line19
1048 .L77:
253:dtmf2.c **** }
254:dtmf2.c **** if (lcdpos>=13) {
1050 .LM152:
1051 040a 8091 0000 lds r24,lcdpos
1052 040e 8D30 cpi r24,lo8(13)
1053 0410 A8F1 brlo .L78
255:dtmf2.c **** lcdcmd (0x01); //Clear LCD, move home//clear lcd
1055 .LM153:
1056 0412 61E0 ldi r22,lo8(1)
1057 0414 80E0 ldi r24,lo8(0)
1058 0416 7BD0 rcall lcdwrt
256:dtmf2.c **** lcdata ('1'); //write "18-"
1060 .LM154:
1061 0418 61E3 ldi r22,lo8(49)
1062 041a 81E0 ldi r24,lo8(1)
1063 041c 78D0 rcall lcdwrt
257:dtmf2.c **** lcdata ('8');
1065 .LM155:
1066 041e 68E3 ldi r22,lo8(56)
1067 0420 81E0 ldi r24,lo8(1)
1068 0422 75D0 rcall lcdwrt
258:dtmf2.c **** lcdata ('-');
1070 .LM156:
1071 0424 6DE2 ldi r22,lo8(45)
1072 0426 81E0 ldi r24,lo8(1)
1073 0428 72D0 rcall lcdwrt
259:dtmf2.c **** for (lcdpos=0;lcdpos<=13;lcdpos++) { //Move bottom line to top
1075 .LM157:
1076 042a 1092 0000 sts lcdpos,__zero_reg__
1077 .L83:
260:dtmf2.c **** lcdata (lcdtemp[lcdpos]);
1079 .LM158:
1080 042e 8091 0000 lds r24,lcdpos
1081 0432 E82F mov r30,r24
1082 0434 FF27 clr r31
1083 0436 E050 subi r30,lo8(-(lcdtemp))
1084 0438 F040 sbci r31,hi8(-(lcdtemp))
1085 043a 6081 ld r22,Z
1086 043c 81E0 ldi r24,lo8(1)
1087 043e 67D0 rcall lcdwrt
1089 .LM159:
1090 0440 8091 0000 lds r24,lcdpos
1091 0444 8F5F subi r24,lo8(-(1))
1092 0446 8093 0000 sts lcdpos,r24
1093 044a 8E30 cpi r24,lo8(14)
1094 044c 80F3 brlo .L83
261:dtmf2.c **** }
262:dtmf2.c **** lcdcmd (0xC0); //set cursor at begining of bottom line
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -