⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtmf2.lst

📁 使用2X16的液晶(国内型号叫1602B)。可以将234个来电存在EEPROM中
💻 LST
📖 第 1 页 / 共 4 页
字号:
 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 + -