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

📄 ds1302.lst

📁 16个单片机c语言实验程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
_writecom:
  com                  --> R10
     13B 92AA      ST	R10,-Y
     13C 2EA0      MOV	R10,R16
(0036) 	}
(0037) }
(0038) 
(0039) //写指令
(0040) void writecom(uchar	com)
(0041) {
(0042) 	busy();
     13D DFD2      RCALL	_busy
(0043) 	s_ms(500);
     13E EF04      LDI	R16,0xF4
     13F E011      LDI	R17,1
     140 DFC6      RCALL	_s_ms
(0044) 	PORTA&=~(1<<RS);   //RS=0
     141 98DD      CBI	0x1B,5
(0045) 	s_ms(500);
     142 EF04      LDI	R16,0xF4
     143 E011      LDI	R17,1
     144 DFC2      RCALL	_s_ms
(0046) 	PORTA&=~(1<<RW);   //RW=0
     145 98DE      CBI	0x1B,6
(0047) 	s_ms(500);
     146 EF04      LDI	R16,0xF4
     147 E011      LDI	R17,1
     148 DFBE      RCALL	_s_ms
(0048) 	PORTA|=(1<<EN);    //EN=1
     149 9ADF      SBI	0x1B,7
(0049) 	s_ms(500);
     14A EF04      LDI	R16,0xF4
     14B E011      LDI	R17,1
     14C DFBA      RCALL	_s_ms
(0050) 	PORTD = com;       //输出指令
     14D BAA2      OUT	0x12,R10
(0051) 	s_ms(500);
     14E EF04      LDI	R16,0xF4
     14F E011      LDI	R17,1
     150 DFB6      RCALL	_s_ms
(0052) 	PORTA&=~(1<<EN);   //EN=0
     151 98DF      CBI	0x1B,7
(0053) 	s_ms(500);
     152 EF04      LDI	R16,0xF4
     153 E011      LDI	R17,1
     154 DFB2      RCALL	_s_ms
     155 90A9      LD	R10,Y+
     156 9508      RET
(0054) }
(0055) 
(0056) //1602初始化
(0057) void	LcdInit(void)
(0058) {
(0059)     DDRD = 0xff; 
_LcdInit:
     157 EF8F      LDI	R24,0xFF
     158 BB81      OUT	0x11,R24
(0060)     PORTD = 0x00; 
     159 2422      CLR	R2
     15A BA22      OUT	0x12,R2
(0061) 	writecom(0x38);
     15B E308      LDI	R16,0x38
     15C DFDE      RCALL	_writecom
(0062) 	s_ms(1000);
     15D EE08      LDI	R16,0xE8
     15E E013      LDI	R17,3
     15F DFA7      RCALL	_s_ms
(0063) 	writecom(0x01);
     160 E001      LDI	R16,1
     161 DFD9      RCALL	_writecom
(0064) 	s_ms(1000);
     162 EE08      LDI	R16,0xE8
     163 E013      LDI	R17,3
     164 DFA2      RCALL	_s_ms
(0065) 	s_ms(1000);
     165 EE08      LDI	R16,0xE8
     166 E013      LDI	R17,3
     167 DF9F      RCALL	_s_ms
(0066) 	s_ms(1000);
     168 EE08      LDI	R16,0xE8
     169 E013      LDI	R17,3
     16A DF9C      RCALL	_s_ms
(0067) 	s_ms(1000);
     16B EE08      LDI	R16,0xE8
     16C E013      LDI	R17,3
     16D DF99      RCALL	_s_ms
(0068) 	s_ms(1000);
     16E EE08      LDI	R16,0xE8
     16F E013      LDI	R17,3
     170 DF96      RCALL	_s_ms
(0069) 	s_ms(1000);
     171 EE08      LDI	R16,0xE8
     172 E013      LDI	R17,3
     173 DF93      RCALL	_s_ms
(0070) 	s_ms(1000);
     174 EE08      LDI	R16,0xE8
     175 E013      LDI	R17,3
     176 DF90      RCALL	_s_ms
(0071) 	writecom(0x02);
     177 E002      LDI	R16,2
     178 DFC2      RCALL	_writecom
(0072) 	s_ms(1000);
     179 EE08      LDI	R16,0xE8
     17A E013      LDI	R17,3
     17B DF8B      RCALL	_s_ms
(0073) 	writecom(0x06);
     17C E006      LDI	R16,6
     17D DFBD      RCALL	_writecom
(0074) 	s_ms(1000);
     17E EE08      LDI	R16,0xE8
     17F E013      LDI	R17,3
     180 DF86      RCALL	_s_ms
(0075) 	writecom(0x0c);
     181 E00C      LDI	R16,0xC
     182 DFB8      RCALL	_writecom
(0076) 	s_ms(1000);
     183 EE08      LDI	R16,0xE8
     184 E013      LDI	R17,3
     185 DF81      RCALL	_s_ms
(0077) 	writecom(0x38);	
     186 E308      LDI	R16,0x38
     187 DFB3      RCALL	_writecom
(0078) 	s_ms(1000);
     188 EE08      LDI	R16,0xE8
     189 E013      LDI	R17,3
     18A CF7C      RJMP	_s_ms
_writedata:
  data                 --> R10
     18B 92AA      ST	R10,-Y
     18C 2EA0      MOV	R10,R16
(0079) }	
(0080) 
(0081) //写数据
(0082) void	writedata(uchar data)
(0083) {
(0084) 	busy();
     18D DF82      RCALL	_busy
(0085) 	s_ms(500);
     18E EF04      LDI	R16,0xF4
     18F E011      LDI	R17,1
     190 DF76      RCALL	_s_ms
(0086) 	PORTA|=(1<<RS);   //RS=1
     191 9ADD      SBI	0x1B,5
(0087) 	s_ms(500);
     192 EF04      LDI	R16,0xF4
     193 E011      LDI	R17,1
     194 DF72      RCALL	_s_ms
(0088) 	PORTA&=~(1<<RW);   //RW=0
     195 98DE      CBI	0x1B,6
(0089) 	s_ms(500);
     196 EF04      LDI	R16,0xF4
     197 E011      LDI	R17,1
     198 DF6E      RCALL	_s_ms
(0090) 	PORTA|=(1<<EN);    //EN=1
     199 9ADF      SBI	0x1B,7
(0091) 	s_ms(500);
     19A EF04      LDI	R16,0xF4
     19B E011      LDI	R17,1
     19C DF6A      RCALL	_s_ms
(0092) 	PORTD = data;      //输出数据
     19D BAA2      OUT	0x12,R10
(0093) 	s_ms(500);
     19E EF04      LDI	R16,0xF4
     19F E011      LDI	R17,1
     1A0 DF66      RCALL	_s_ms
(0094) 	PORTA&=~(1<<EN);   //EN=0
     1A1 98DF      CBI	0x1B,7
(0095) 	s_ms(500);
     1A2 EF04      LDI	R16,0xF4
     1A3 E011      LDI	R17,1
     1A4 DF62      RCALL	_s_ms
     1A5 90A9      LD	R10,Y+
     1A6 9508      RET
_readdata:
  temp                 --> R10
     1A7 92AA      ST	R10,-Y
(0096) }
(0097) 
(0098) 
(0099) //读数据
(0100) uchar	readdata(void)
(0101) {
(0102) 	uchar temp;
(0103) 	busy();
     1A8 DF67      RCALL	_busy
(0104) 	s_ms(500);
     1A9 EF04      LDI	R16,0xF4
     1AA E011      LDI	R17,1
     1AB DF5B      RCALL	_s_ms
(0105) 	PORTA|=(1<<RS);  //RS=1
     1AC 9ADD      SBI	0x1B,5
(0106) 	s_ms(500);
     1AD EF04      LDI	R16,0xF4
     1AE E011      LDI	R17,1
     1AF DF57      RCALL	_s_ms
(0107) 	PORTA|=(1<<RW);  //RW=1
     1B0 9ADE      SBI	0x1B,6
(0108) 	s_ms(500);
     1B1 EF04      LDI	R16,0xF4
     1B2 E011      LDI	R17,1
     1B3 DF53      RCALL	_s_ms
(0109) 	PORTA|=(1<<EN);  //EN=1
     1B4 9ADF      SBI	0x1B,7
(0110) 	s_ms(500);
     1B5 EF04      LDI	R16,0xF4
     1B6 E011      LDI	R17,1
     1B7 DF4F      RCALL	_s_ms
(0111) 	DDRD=0x00;       //A端口变输入
     1B8 2422      CLR	R2
     1B9 BA21      OUT	0x11,R2
(0112) 	s_ms(500);
     1BA EF04      LDI	R16,0xF4
     1BB E011      LDI	R17,1
     1BC DF4A      RCALL	_s_ms
(0113) 	temp = PIND;     //读A端口
     1BD B2A0      IN	R10,0x10
(0114) 	s_ms(500);
     1BE EF04      LDI	R16,0xF4
     1BF E011      LDI	R17,1
     1C0 DF46      RCALL	_s_ms
(0115) 	DDRD=0xff;       //A端口变输出
     1C1 EF8F      LDI	R24,0xFF
     1C2 BB81      OUT	0x11,R24
(0116) 	s_ms(500);
     1C3 EF04      LDI	R16,0xF4
     1C4 E011      LDI	R17,1
     1C5 DF41      RCALL	_s_ms
(0117) 	PORTA&=~(1<<EN); //EN=0
     1C6 98DF      CBI	0x1B,7
(0118) 	s_ms(500);
     1C7 EF04      LDI	R16,0xF4
     1C8 E011      LDI	R17,1
     1C9 DF3D      RCALL	_s_ms
(0119) 	return temp;	
     1CA 2D0A      MOV	R16,R10
     1CB 90A9      LD	R10,Y+
     1CC 9508      RET
_WriteCGRAM:
  t                    --> R10
  i                    --> R20
  pBuffer              --> R22
  num                  --> R10
     1CD 940E 03A0 CALL	push_xgsetF00C
     1CF 01B9      MOVW	R22,R18
     1D0 0158      MOVW	R10,R16
(0120) }
(0121) 
(0122) //=================================================
(0123) // 描述: 写LCD内部CGRAM函数
(0124) // 入口: ‘num’要写的数据个数
(0125) //        ‘pbuffer’要写的数据的首地址
(0126) // 出口: 无
(0127) //================================================
(0128) void	WriteCGRAM(uint	num, const uint	*pBuffer)
(0129) {
(0130) 	uint	i,t;
(0131) 	writecom(0x40);
     1D1 E400      LDI	R16,0x40
     1D2 DF68      RCALL	_writecom
(0132) 	PORTA|=(1<<RS);
     1D3 9ADD      SBI	0x1B,5
(0133) 	PORTA&=~(1<<RW);
     1D4 98DE      CBI	0x1B,6
(0134) 	for(i=num;i!=0;i--)
     1D5 01A5      MOVW	R20,R10
     1D6 C00A      RJMP	0x01E1
(0135) 	{
(0136) 		t = *pBuffer;
     1D7 01FB      MOVW	R30,R22
     1D8 80A0      LDD	R10,Z+0
     1D9 80B1      LDD	R11,Z+1
(0137) 		PORTA|=(1<<EN);
     1DA 9ADF      SBI	0x1B,7
(0138) 		PORTD = t;
     1DB BAA2      OUT	0x12,R10
(0139) 		PORTA&=~(1<<EN);				
     1DC 98DF      CBI	0x1B,7
(0140) 		pBuffer++;
     1DD 5F6E      SUBI	R22,0xFE
     1DE 4F7F      SBCI	R23,0xFF
     1DF 5041      SUBI	R20,1
     1E0 4050      SBCI	R21,0
     1E1 3040      CPI	R20,0
     1E2 0745      CPC	R20,R21
     1E3 F799      BNE	0x01D7
     1E4 940C 03A7 JMP	pop_xgsetF00C
_WriteMenu:
  t                    --> R10
  i                    --> R22
  pBuffer              --> R20
     1E6 940E 03A0 CALL	push_xgsetF00C
     1E8 01A8      MOVW	R20,R16
(0141) 	}
(0142) 	
(0143) }
(0144) 
(0145) //=================================================
(0146) //描述:写菜单函数,本程序使用的LCD规格为 16 * 2
(0147) //入口:菜单数组首地址
(0148) //出口:无
(0149) //=================================================
(0150) void	WriteMenu(const uchar *pBuffer)
(0151) {
(0152) 	uchar	i,t;
(0153) 	writecom(0x80);   //数据地址
     1E9 E800      LDI	R16,0x80
     1EA DF50      RCALL	_writecom
(0154) 	
(0155) 	PORTA|=(1<<RS);
     1EB 9ADD      SBI	0x1B,5
(0156) 	PORTA&=~(1<<RW);
     1EC 98DE      CBI	0x1B,6
(0157) 	s_ms(50);
     1ED E302      LDI	R16,0x32
     1EE E010      LDI	R17,0
     1EF DF17      RCALL	_s_ms
(0158) 	for(i=0;i<16;i++)
     1F0 2766      CLR	R22
     1F1 C00B      RJMP	0x01FD
(0159) 	{
(0160) 		t = *pBuffer;
     1F2 01FA      MOVW	R30,R20
     1F3 80A0      LDD	R10,Z+0
(0161) 		PORTD = t;
     1F4 BAA2      OUT	0x12,R10
(0162) 		PORTA|=(1<<EN);
     1F5 9ADF      SBI	0x1B,7
(0163) 		s_ms(50);
     1F6 E302      LDI	R16,0x32
     1F7 E010      LDI	R17,0
     1F8 DF0E      RCALL	_s_ms
(0164) 		PORTA&=~(1<<EN);				
     1F9 98DF      CBI	0x1B,7
(0165) 		pBuffer++;
     1FA 5F4F      SUBI	R20,0xFF
     1FB 4F5F      SBCI	R21,0xFF
     1FC 9563      INC	R22
     1FD 3160      CPI	R22,0x10
     1FE F398      BCS	0x01F2
(0166) 	}
(0167) 	writecom(0xC0);
     1FF EC00      LDI	R16,0xC0
     200 DF3A      RCALL	_writecom
(0168) 
(0169) 	PORTA|=(1<<RS);
     201 9ADD      SBI	0x1B,5
(0170) 	PORTA&=~(1<<RW);
     202 98DE      CBI	0x1B,6
(0171) 	s_ms(50);	
     203 E302      LDI	R16,0x32
     204 E010      LDI	R17,0
     205 DF01      RCALL	_s_ms
(0172) 	for(i=0;i<16;i++)
     206 2766      CLR	R22
     207 C00B      RJMP	0x0213
(0173) 	{
(0174) 		t = *pBuffer;
     208 01FA      MOVW	R30,R20
     209 80A0      LDD	R10,Z+0
(0175) 		PORTD = t;
     20A BAA2      OUT	0x12,R10
(0176) 		PORTA|=(1<<EN);
     20B 9ADF      SBI	0x1B,7
(0177) 		s_ms(50);
     20C E302      LDI	R16,0x32
     20D E010      LDI	R17,0
     20E DEF8      RCALL	_s_ms
(0178) 		PORTA&=~(1<<EN);				
     20F 98DF      CBI	0x1B,7
(0179) 		pBuffer++;
     210 5F4F      SUBI	R20,0xFF
     211 4F5F      SBCI	R21,0xFF
     212 9563      INC	R22
     213 3160      CPI	R22,0x10
     214 F398      BCS	0x0208
     215 940C 03A7 JMP	pop_xgsetF00C
_WriteNum:
  num                  --> R20
  col                  --> R10
  row                  --> R22
     217 940E 03A0 CALL	push_xgsetF00C
     219 0159      MOVW	R10,R18
     21A 01B8      MOVW	R22,R16
     21B 814E      LDD	R20,Y+6
     21C 815F      LDD	R21,Y+7
(0180) 	}
(0181) }
(0182) //====================================================
(0183) // 描述:在任意位置写数字函数
(0184) // 入口:’row‘表示要写数字所在的行地址,只能为1或2
(0185) //       ’col‘表示要写数字所在的列地址,只能为0--15
(0186) //		 ‘num’表示要写的数字,只能为0--9
(0187) // 出口:无
(0188) //===================================================
(0189) void	WriteNum(uint	row,uint	col,uint	 num)
(0190) {
(0191) 	if (row == 1)	row = 0x80 + col;
     21D 3061      CPI	R22,1
     21E E0E0      LDI	R30,0
     21F 077E      CPC	R23,R30
     220 F421      BNE	0x0225
     221 01B5      MOVW	R22,R10
     222 5860      SUBI	R22,0x80
     223 4F7F      SBCI	R23,0xFF
     224 C003      RJMP	0x0228
(0192) 	else	row = 0xC0 + col;
     225 01B5      MOVW	R22,R10
     226 5460      SUBI	R22,0x40
     227 4F7F      SBCI	R23,0xFF
(0193) 	writecom(row);
     228 2F06      MOV	R16,R22
     229 DF11      RCALL	_writecom
(0194) 	if (num<=0 | num>9)	num =0x30;
     22A 3040      CPI	R20,0
     22B 0745      CPC	R20,R21
     22C F421      BNE	0x0231
     22D E081      LDI	R24,1
     22E E090      LDI	R25,0
     22F 015C      MOVW	R10,R24
     230 C002      RJMP	0x0233
     231 24AA      CLR	R10
     232 24BB      CLR	R11
     233 E089      LDI	R24,0x9
     234 E090      LDI	R25,0
     235 1784      CP	R24,R20
     236 0795      CPC	R25,R21
     237 F418      BCC	0x023B
     238 E061      LDI	R22,1
     239 E070      LDI	R23,0
     23A C002      RJMP	0x023D
     23B 2766      CLR	R22
     23C 2777      CLR	R23
     23D 0115      MOVW	R2,R10
     23E 2A26      OR	R2,R22
     23F 2A37      OR	R3,R23
     240 2022      TST	R2
     241 F411      BNE	0x0244
     242 2033      TST	R3
     243 F019      BEQ	0x0247
     244 E340      LDI	R20,0x30
     245 E050      LDI	R21,0
     246 C002      RJMP	0x0249
(0195) 	else	num = 0x30 + num;
     247 5D40      SUBI	R20,0xD0
     248 4F5F      SBCI	R21,0xFF
(0196) 
(0197) 	PORTA|=(1<<RS);
     249 9ADD      SBI	0x1B,5
(0198) 	s_ms(500);
     24A EF04      LDI	R16,0xF4
     24B E011      LDI	R17,1
     24C DEBA      RCALL	_s_ms
(0199) 	PORTA&=~(1<<RW);
     24D 98DE      CBI	0x1B,6
(0200) 	s_ms(500);
     24E EF04      LDI	R16,0xF4
     24F E011      LDI	R17,1
     250 DEB6      RCALL	_s_ms
(0201) 	PORTD = num;
     251 BB42      OUT	0x12,R20
(0202) 	s_ms(500);
     252 EF04      LDI	R16,0xF4
     253 E011      LDI	R17,1
     254 DEB2      RCALL	_s_ms
(0203) 	PORTA|=(1<<EN);
     255 9ADF      SBI	0x1B,7
(0204) 	s_ms(500);
     256 EF04      LDI	R16,0xF4
     257 E011      LDI	R17,1
     258 DEAE      RCALL	_s_ms
(0205) 	PORTA&=~(1<<EN);	
     259 98DF      CBI	0x1B,7
(0206) 	s_ms(500);			
     25A EF04      LDI	R16,0xF4
     25B E011      LDI	R17,1
     25C DEAA      RCALL	_s_ms

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -