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

📄 hzmmi.lst

📁 atmel的atmega128外扩ram对液晶的驱动调试程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0197) 
(0198) void write_data(byte data)
(0199) {
(0200) byte *pt; 
(0201) 
(0202)         wait_disp();
    019E DFCD      RCALL	_wait_disp
(0203)         PORTD&=~LCD_ID;       //CD=0
    019F 9896      CBI	P12,6
(0204) 	PORTD&=~LCD_ID;       //CD=0
    01A0 9896      CBI	P12,6
(0205) 	PORTD&=~LCD_ID;       //CD=0	
    01A1 9896      CBI	P12,6
(0206) 	PORTD&=~LCD_CS;       //CS=0
    01A2 9895      CBI	P12,5
(0207) 	PORTD&=~LCD_CS;       //CS=0
    01A3 9895      CBI	P12,5
(0208) 	PORTD&=~LCD_CS;       //CS=0          
    01A4 9895      CBI	P12,5
(0209) 	*(byte*)0x8000=data;              //命令码		
    01A5 93408000  STS	R20,0x8000
(0210) 	PORTD|=LCD_CS;       //CS=1
    01A7 9A95      SBI	P12,5
(0211) 	PORTD|=LCD_CS;       //CS=1
    01A8 9A95      SBI	P12,5
(0212) 	PORTD|=LCD_CS;       //CS=1
    01A9 9A95      SBI	P12,5
(0213) 	
(0214) }
    01AA 940E0555  CALL	pop_gset1
    01AC 9508      RET
_cls:
  i                    --> R20
    01AD 940E0552  CALL	push_gset1
(0215) 
(0216) //清屏
(0217) void cls(void)
(0218) {
(0219) 	int i;
(0220) 	
(0221)         write_data(00);          //设置显示储存器首地址
    01AF 2700      CLR	R16
    01B0 DFEA      RCALL	_write_data
(0222)         write_data(00);
    01B1 2700      CLR	R16
    01B2 DFE8      RCALL	_write_data
(0223)         write_order(0x24);
    01B3 E204      LDI	R16,0x24
    01B4 DFD1      RCALL	_write_order
(0224)         write_order(0xb0);       //设置自动写方式
    01B5 EB00      LDI	R16,0xB0
    01B6 DFCF      RCALL	_write_order
(0225)         wait_disp();
    01B7 DFB4      RCALL	_wait_disp
(0226)     	for(i=0;i<8000;i++)     //8k显示存储器填00
    01B8 2744      CLR	R20
    01B9 2755      CLR	R21
(0227) 		{
(0228) 	      write_data_auto(0x00);
    01BA 2700      CLR	R16
    01BB D00B      RCALL	_write_data_auto
(0229) 		}	
    01BC 5F4F      SUBI	R20,0xFF
    01BD 4F5F      SBCI	R21,0xFF
    01BE 3440      CPI	R20,0x40
    01BF E1EF      LDI	R30,0x1F
    01C0 075E      CPC	R21,R30
    01C1 F3C4      BLT	0x01BA
(0230) 	write_order(0xb2); 
    01C2 EB02      LDI	R16,0xB2
    01C3 DFC2      RCALL	_write_order
(0231) }
    01C4 940E0555  CALL	pop_gset1
    01C6 9508      RET
_write_data_auto:
  data                 --> R20
    01C7 940E0552  CALL	push_gset1
    01C9 2F40      MOV	R20,R16
(0232) 
(0233) void write_data_auto(byte data)
(0234) {
(0235) 	wait_disp_auto();
    01CA D005      RCALL	_wait_disp_auto
(0236)         write_data(data);
    01CB 2F04      MOV	R16,R20
    01CC DFCE      RCALL	_write_data
(0237) }
    01CD 940E0555  CALL	pop_gset1
    01CF 9508      RET
(0238) 
(0239) //数据自动写状态忙等待
(0240) void wait_disp_auto(void)
(0241) {
(0242) byte flag;
(0243) 
(0244) 	PORTA=0xff;
_wait_disp_auto:
  flag                 --> R16
    01D0 EF8F      LDI	R24,0xFF
    01D1 BB8B      OUT	P1B,R24
(0245) 	DDRA=0;                   //A口为输入	
    01D2 2422      CLR	R2
    01D3 BA2A      OUT	P1A,R2
(0246)         PORTD|=LCD_ID;               //CD=1	
    01D4 9A96      SBI	P12,6
(0247) 	PORTD|=LCD_ID;               //CD=1        	
    01D5 9A96      SBI	P12,6
(0248) 	PORTD&=~LCD_CS;           //CE=0
    01D6 9895      CBI	P12,5
(0249) 	PORTD&=~LCD_CS;           //CE=0
    01D7 9895      CBI	P12,5
(0250) 	PORTD&=~LCD_CS;           //CE=0	
    01D8 9895      CBI	P12,5
(0251) 	for(;;)
(0252) 	{	     
(0253) 	    flag=*(byte*)0x8000;           	       
    01D9 91008000  LDS	R16,0x8000
(0254) 	    if(flag & LCD_BUSY_S3){     //判断液晶忙否?		   	        	               	    
    01DB FF03      SBRS	R16,3
    01DC CFFC      RJMP	0x01D9
(0255) 		  PORTD|=LCD_CS|LCD_ID;         //CE=1,ID=1
    01DD B382      IN	R24,P12
    01DE 6680      ORI	R24,0x60
    01DF BB82      OUT	P12,R24
(0256) 		  PORTD|=LCD_CS|LCD_ID;         //CE=1,ID=1	
    01E0 B382      IN	R24,P12
    01E1 6680      ORI	R24,0x60
    01E2 BB82      OUT	P12,R24
(0257) 		  return;
(0258) 		}	    
(0259) 	}   
    01E3 9508      RET
(0260) }
(0261) 
(0262) 
(0263) 
(0264) //对液晶初始化,清屏
(0265) void init_disp(void)
(0266) {
(0267)     PORTD&=~LCD_RST;              //LCD_RST=0	
_init_disp:
    01E4 9897      CBI	P12,7
(0268)     PORTD&=~LCD_RST;              //LCD_RST=0		
    01E5 9897      CBI	P12,7
(0269)     dlyms(2);
    01E6 E002      LDI	R16,2
    01E7 E010      LDI	R17,0
    01E8 DF66      RCALL	_dlyms
(0270)     PORTD|=LCD_RST;              //LCD_RST=1
    01E9 9A97      SBI	P12,7
(0271)     PORTD|=LCD_RST;              //LCD_RST=1		
    01EA 9A97      SBI	P12,7
(0272)     dlyms(3);
    01EB E003      LDI	R16,3
    01EC E010      LDI	R17,0
    01ED DF61      RCALL	_dlyms
(0273) 	write_data(0x00);                      //设置图形显示首地址00H
    01EE 2700      CLR	R16
    01EF DFAB      RCALL	_write_data
(0274) 	write_data(0x00);                        
    01F0 2700      CLR	R16
    01F1 DFA9      RCALL	_write_data
(0275) 	write_order(0x42);		
    01F2 E402      LDI	R16,0x42
    01F3 DF92      RCALL	_write_order
(0276)     dlyms(2);		
    01F4 E002      LDI	R16,2
    01F5 E010      LDI	R17,0
    01F6 DF58      RCALL	_dlyms
(0277) 	write_data(DIS_LEN);                   //设置图形显示区域宽度
    01F7 E200      LDI	R16,0x20
    01F8 DFA2      RCALL	_write_data
(0278) 	write_data(00);                        //即一行显示所占字节数
    01F9 2700      CLR	R16
    01FA DFA0      RCALL	_write_data
(0279) 	write_order(0x43);		
    01FB E403      LDI	R16,0x43
    01FC DF89      RCALL	_write_order
(0280) 	dlyms(2);		
    01FD E002      LDI	R16,2
    01FE E010      LDI	R17,0
    01FF DF4F      RCALL	_dlyms
(0281) 	write_order(0xa7);		    //光标形状设置
    0200 EA07      LDI	R16,0xA7
    0201 DF84      RCALL	_write_order
(0282) 	write_order(0x80);		    //显示方式设置逻辑"或"合成
    0202 E800      LDI	R16,0x80
    0203 DF82      RCALL	_write_order
(0283) 	write_order(0x98);		    //显示开关设置,开图形和文本显示
    0204 E908      LDI	R16,0x98
    0205 DF80      RCALL	_write_order
(0284) }
    0206 9508      RET
_str_hz:
  lrow                 --> Y+6
  aa                   --> Y+4
  zk                   --> Y+0
  lcol                 --> R22
  dis_code             --> R12
  pt                   --> Y+11
  i                    --> R14
  w                    --> R10
  q                    --> Y+10
  address1             --> Y+8
  str                  --> R20
  col                  --> R10
  row                  --> R12
    0207 940E0575  CALL	push_gset5
    0209 2EA2      MOV	R10,R18
    020A 2EC0      MOV	R12,R16
    020B 972D      SBIW	R28,0xD
    020C 894F      LDD	R20,23+Y
    020D 8D58      LDD	R21,24+Y
(0285) 
(0286) //显示汉字串及大ASCII串
(0287) void str_hz(byte row,byte col,byte *str)
(0288) {
(0289)   byte q,w,i,dis_code;
(0290)   int address1,lrow,lcol;
(0291)   byte *pt;
(0292)   unsigned int aa;
(0293)    long zk;
(0294)   			
(0295)   lrow=(row)%80;             //设置行
    020E E520      LDI	R18,0x50
    020F E030      LDI	R19,0
    0210 2D0C      MOV	R16,R12
    0211 2711      CLR	R17
    0212 940E0535  CALL	mod16s
    0214 830E      STD	R16,6+Y
    0215 831F      STD	R17,7+Y
(0296)   lcol=(col*8)%160;		//列			
    0216 EA20      LDI	R18,0xA0
    0217 E030      LDI	R19,0
    0218 2D0A      MOV	R16,R10
    0219 2711      CLR	R17
    021A 0F00      LSL	R16
    021B 1F11      ROL	R17
    021C 0F00      LSL	R16
    021D 1F11      ROL	R17
    021E 0F00      LSL	R16
    021F 1F11      ROL	R17
    0220 940E0535  CALL	mod16s
    0222 01B8      MOVW	R22,R16
(0297)   for(;*str;)
    0223 C1C2      RJMP	0x03E6
(0298)   {                   //如果*str=0,则退出循环    
(0299)       if(*str<160)	        //如果是ASC码字符,<A0H
    0224 01FA      MOVW	R30,R20
    0225 8180      LDD	R24,0+Z
    0226 3A80      CPI	R24,0xA0
    0227 F008      BCS	0x0229
    0228 C0A9      RJMP	0x02D2
(0300)       {
(0301)     	 q=(*str++);
    0229 011A      MOVW	R2,R20
    022A 01C1      MOVW	R24,R2
    022B 9601      ADIW	R24,1
    022C 01AC      MOVW	R20,R24
    022D 01F1      MOVW	R30,R2
    022E 8020      LDD	R2,0+Z
    022F 862A      STD	R2,10+Y
(0302) 	     if(q==13)	//处理回车符
    0230 858A      LDD	R24,10+Y
    0231 308D      CPI	R24,0xD
    0232 F441      BNE	0x023B
(0303) 		 {
(0304) 		  lrow+=16;        //换两行
    0233 818E      LDD	R24,6+Y
    0234 819F      LDD	R25,7+Y
    0235 9640      ADIW	R24,0x10
    0236 838E      STD	R24,6+Y
    0237 839F      STD	R25,7+Y
(0305) 		  lcol=0;         //列的开始
    0238 2766      CLR	R22
    0239 2777      CLR	R23
(0306) 		  continue;
    023A C1AB      RJMP	0x03E6
(0307) 		 }
(0308) 	     if(q<0x20) continue;                //为不可见字符,继续循环	     
    023B 858A      LDD	R24,10+Y
    023C 3280      CPI	R24,0x20
    023D F408      BCC	0x023F
    023E C1A7      RJMP	0x03E6
(0309) 	     zk=q*16l+0x100l+0x800l;	   	     
    023F E084      LDI	R24,4
    0240 E090      LDI	R25,0
    0241 842A      LDD	R2,10+Y
    0242 2433      CLR	R3
    0243 2444      CLR	R4
    0244 2455      CLR	R5
    0245 938A      ST	R24,-Y
    0246 0181      MOVW	R16,R2
    0247 0192      MOVW	R18,R4
    0248 940E05A8  CALL	lsl32
    024A 0118      MOVW	R2,R16
    024B 0129      MOVW	R4,R18
    024C EA00      LDI	R16,0xA0
    024D E010      LDI	R17,0
    024E 940E0594  CALL	lpm32
    0250 0E20      ADD	R2,R16
    0251 1E31      ADC	R3,R17
    0252 1E42      ADC	R4,R18
    0253 1E53      ADC	R5,R19
    0254 E90C      LDI	R16,0x9C
    0255 E010      LDI	R17,0
    0256 940E0594  CALL	lpm32
    0258 0E20      ADD	R2,R16
    0259 1E31      ADC	R3,R17
    025A 1E42      ADC	R4,R18
    025B 1E53      ADC	R5,R19
    025C 01FE      MOVW	R30,R28
    025D 8220      STD	R2,0+Z
    025E 8231      STD	R3,1+Z
    025F 8242      STD	R4,2+Z
    0260 8253      STD	R5,3+Z
(0310) 	     lib_addr.l=zk<<2;	    
    0261 E082      LDI	R24,2
    0262 E090      LDI	R25,0
    0263 938A      ST	R24,-Y
    0264 0181      MOVW	R16,R2
    0265 0192      MOVW	R18,R4
    0266 940E05A8  CALL	lsl32
    0268 931001DC  STS	R17,_lib_addr+1
    026A 930001DB  STS	R16,_lib_addr
    026C 933001DE  STS	R19,_lib_addr+3
    026E 932001DD  STS	R18,_lib_addr+2
(0311) 	     PORTF=lib_addr.bytes.a2 & 0x0f;	
    0270 918001DD  LDS	R24,_lib_addr+2
    0272 708F      ANDI	R24,0xF
    0273 93800062  STS	R24,0x62
(0312) 	     aa=zk;
    0275 01FE      MOVW	R30,R28
    0276 8020      LDD	R2,0+Z
    0277 8031      LDD	R3,1+Z
    0278 822C      STD	R2,4+Y
    0279 823D      STD	R3,5+Y
(0313) 	     aa=(aa & 0x3fff)|0xc000;		
    027A 818C      LDD	R24,4+Y
    027B 819D      LDD	R25,5+Y
    027C 739F      ANDI	R25,0x3F
    027D 6C90      ORI	R25,0xC0
    027E 838C      STD	R24,4+Y
    027F 839D      STD	R25,5+Y
(0314) 	     pt=(byte *)aa;
    0280 802C      LDD	R2,4+Y
    0281 803D      LDD	R3,5+Y
    0282 862B      STD	R2,11+Y
    0283 863C      STD	R3,12+Y
(0315) 	     address1=lrow;
    0284 802E      LDD	R2,6+Y
    0285 803F      LDD	R3,7+Y
    0286 8628      STD	R2,8+Y
    0287 8639      STD	R3,9+Y
(0316)              address1=DIS_LEN*address1+lcol/8;
    0288 E028      LDI	R18,0x8
    0289 E030      LDI	R19,0
    028A 018B      MOVW	R16,R22
    028B 940E0537  CALL	div16s
    028D 0118      MOVW	R2,R16
    028E E025      LDI	R18,5
    028F E030      LDI	R19,0
    0290 8508      LDD	R16,8+Y
    0291 8519      LDD	R17,9+Y
    0292 940E05C2  CALL	lsl16
    0294 0128      MOVW	R4,R16
    0295 0C42      ADD	R4,R2
    0296 1C53      ADC	R5,R3
    0297 8648      STD	R4,8+Y
    0298 8659      STD	R5,9+Y
(0317)              address1=address1+START_ADDRESS;           //+图形地址偏移量           
(0318)              for(i=0;i<16;i++){		 
    0299 24EE      CLR	R14
    029A C025      RJMP	0x02C0
(0319)                 q=address1/0x100;           //地址高位
    029B E020      LDI	R18,0
    029C E031      LDI	R19,1
    029D 8508      LDD	R16,8+Y
    029E 8519      LDD	R17,9+Y
    029F 940E0537  CALL	div16s
    02A1 870A      STD	R16,10+Y
(0320)                 w=address1%0x100;           //地址低位
    02A2 E020      LDI	R18,0
    02A3 E031      LDI	R19,1
    02A4 8508      LDD	R16,8+Y
    02A5 8519      LDD	R17,9+Y
    02A6 940E0535  CALL	mod16s
    02A8 0158      MOVW	R10,R16
(0321) 		
(0322)                 write_data(w);               //送低地址
    02A9 2D0A      MOV	R16,R10
    02AA DEF0      RCALL	_write_data
(0323)                 write_data(q);               //送高地址
    02AB 850A      LDD	R16,10+Y
    02AC DEEE      RCALL	_write_data
(0324)                 
(0325) 		 write_order(0x24);           //设置显示RAM地址                      
    02AD E204      LDI	R16,0x24
    02AE DED7      RCALL	_write_order
(0326)                  write_data(*pt);
    02AF 85EB      LDD	R30,11+Y
    02B0 85FC      LDD	R31,12+Y
    02B1 8100      LDD	R16,0+Z
    02B2 DEE8      RCALL	_write_data
(0327)                  write_order(0x0c0);          //设置一次写数据指令代码  
    02B3 EC00      LDI	R16,0xC0
    02B4 DED1      RCALL	_write_order
(0328)                 pt++;                      
    02B5 858B      LDD	R24,11+Y
    02B6 859C      LDD	R25,12+Y
    02B7 9601      ADIW	R24,1
    02B8 878B      STD	R24,11+Y
    02B9 879C      STD	R25,12+Y
(0329)                address1=address1+DIS_LEN;    //地址调整到下一行
    02BA 8588      LDD	R24,8+Y
    02BB 8599      LDD	R25,9+Y
    02BC 9680      ADIW	R24,0x20
    02BD 8788      STD	R24,8+Y
    02BE 8799      STD	R25,9+Y
(0330)              }
    02BF 94E3      INC	R14
    02C0 2D8E      MOV	R24,R14
    02C1 3180      CPI	R24,0x10
    02C2 F2C0      BCS	0x029B
(0331)           lcol=lcol+8;                    //
    02C3 5F68      SUBI	R22,0xF8
    02C4 4F7F      SBCI	R23,0xFF
(0332)           if(lcol>=160)
    02C5 3A60      CPI	R22,0xA0
    02C6 E0E0      LDI	R30,0
    02C7 077E      CPC	R23,R30
    02C8 F40C      BGE	0x02CA
    02C9 C11C      RJMP	0x03E6
(0333) 		  {
(0334) 		   lrow+=16;
    02CA 818E      LDD	R24,6+Y
    02CB 819F      LDD	R25,7+Y
    02CC 9640      ADIW	R24,0x10
    02CD 838E      STD	R24,6+Y
    02CE 839F      STD	R25,7+Y
(0335) 		   lcol=0;
    02CF 2766      CLR	R22
    02D0 2777      CLR	R23
(0336) 		  }	
(0337) 	      continue;
    02D1 C114      RJMP	0x03E6
(0338) 	  }
(0339) 
(0340)       q=(*str++)-160;
    02D2 011A      MOVW	R2,R20
    02D3 01C1      MOVW	R24,R2
    02D4 9601      ADIW	R24,1
    02D5 01AC      MOVW	R20,R24
    02D6 01F1      MOVW	R30,R2
    02D7 8180      LDD	R24,0+Z
    02D8 5A80      SUBI	R24,0xA0
    02D9 878A      STD	R24,10+Y
(0341) 	  if(*str==0) break;
    02DA 01FA      MOVW	R30,R20
    02DB 8020      LDD	R2,0+Z
    02DC 2022      TST	R2
    02DD F409      BNE	0x02DF
    02DE C10C      RJMP	0x03EB
(0342) 	  w=(*str++)-161;
    02DF 011A      MOVW	R2,R20
    02E0 01C1      MOVW	R24,R2
    02E1 9601      ADIW	R24,1
    02E2 01AC      MOVW	R20,R24
    02E3 01F1      MOVW	R30,R2
    02E4 8180      LDD	R24,0+Z
    02E5 5A81      SUBI	R24,0xA1
    02E6 2EA8      MOV	R10,R24
(0343) 	  if(q<=3) q--;

⌨️ 快捷键说明

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