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

📄 hzmmi.lst

📁 atmel的atmega128外扩ram对液晶的驱动调试程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
    007E E5CF      LDI	R28,0x5F
    007F E1D0      LDI	R29,0x10
    0080 BFCD      OUT	P3D,R28
    0081 BFDE      OUT	P3E,R29
    0082 51C0      SUBI	R28,0x10
    0083 40D0      SBCI	R29,0
    0084 EA0A      LDI	R16,0xAA
    0085 8308      STD	R16,0+Y
    0086 2400      CLR	R0
    0087 E5E8      LDI	R30,0x58
    0088 E0F1      LDI	R31,1
    0089 E011      LDI	R17,1
    008A 3EE4      CPI	R30,0xE4
    008B 07F1      CPC	R31,R17
    008C F011      BEQ	0x008F
    008D 9201      ST	R0,Z+
    008E CFFB      RJMP	0x008A
    008F 8300      STD	R16,0+Z
    0090 EAE4      LDI	R30,0xA4
    0091 E0F0      LDI	R31,0
    0092 E0A0      LDI	R26,0
    0093 E0B1      LDI	R27,1
    0094 E010      LDI	R17,0
    0095 3FEC      CPI	R30,0xFC
    0096 07F1      CPC	R31,R17
    0097 F021      BEQ	0x009C
    0098 95C8      LPM
    0099 9631      ADIW	R30,1
    009A 920D      ST	R0,X+
    009B CFF9      RJMP	0x0095
    009C 940E009F  CALL	_main
_exit:
    009E CFFF      RJMP	_exit
FILE: D:\美来尼尔\美兰尼尔改进\测控单元\面板程序\测控面板调试程序\hzmmi.c
(0000) #include "hzmmi.h"
(0001) 
(0002) #define __main__
(0003) 
(0004) #define T_RELOAD	(10000-1)		//1.000ms @10MHz,毫秒定时器用
(0005) 
(0006) void init1(void);                               //初始化子程序
(0007) void run_1s(void);		                //1秒任务
(0008) void dlyms(word ms);                           //毫秒级延时函数
(0009) void delly(word ns);                           //毫秒级延时函数
(0010) void str_hz(byte row,byte col,byte *str);     //显示汉字串及大ASCII串
(0011) void wait_disp(void);                          //液晶忙等待
(0012) void write_order(byte order);    //对液晶发送命令码
(0013) void write_data(byte data);    //向LCD送数据码(ASCII码)
(0014) void init_disp_nocls(void);   //对液晶初始化,不清屏
(0015) void cls(void);               //清屏
(0016) void init_disp(void);         //对液晶初始化,清屏
(0017) void str_sasc(byte row,byte col,byte *str);     //显示小ASCII串
(0018) void disp_face(void);             //显示首页
(0019) void full(void);
(0020) void write_data(byte data);
(0021) void write_data_auto(byte data);
(0022) 
(0023) void wait_disp_auto(void);
(0024) 
(0025) word  sec_num;	   				//1秒任务计时器
(0026) word  mstimer1;	   				//毫秒延时计数						     
(0027) word  mstimer3;	   				//串口发送延时						     
(0028) byte ctl_data;
(0029) LIB_ADDR lib_addr;                              
(0030) 
(0031) 
(0032) byte disp_buffer[128];            //显示缓冲区
(0033) byte flag;
(0034) 
(0035) //主程序调用了上电复位进程,键盘进程,事件进程;
(0036) void main(void)
(0037) {
(0038) word i,j;
(0039) byte *pt;
(0040) 
(0041) 	flag=1;
_main:
  pt                   --> Y+1
  j                    --> Y+1
  i                    --> Y+1
    009F E081      LDI	R24,1
    00A0 93800158  STS	R24,_flag
(0042)         init1(); 		
    00A2 D02C      RCALL	_init1
(0043)         init_disp();  
    00A3 D140      RCALL	_init_disp
(0044)         disp_face();
    00A4 D072      RCALL	_disp_face
(0045) //        dlyms(4000);
(0046)         for(;;){
(0047)           if(sec_num>1000)   {
    00A5 EE88      LDI	R24,0xE8
    00A6 E093      LDI	R25,3
    00A7 9030015A  LDS	R3,_sec_num+1
    00A9 90200159  LDS	R2,_sec_num
    00AB 1582      CP	R24,R2
    00AC 0593      CPC	R25,R3
    00AD F470      BCC	0x00BC
(0048) 		
(0049)               if(flag){
    00AE 90200158  LDS	R2,_flag
    00B0 2022      TST	R2
    00B1 F029      BEQ	0x00B7
(0050)                 flag=0;		
    00B2 2422      CLR	R2
    00B3 92200158  STS	R2,_flag
(0051)                 disp_face();                         
    00B5 D061      RCALL	_disp_face
(0052) 			  }
    00B6 C004      RJMP	0x00BB
(0053)                else{
(0054)                   flag=1;                 
    00B7 E081      LDI	R24,1
    00B8 93800158  STS	R24,_flag
(0055)                   cls();
    00BA D0F2      RCALL	_cls
(0056) 			   }
(0057) 		   
(0058)              run_1s(); 
    00BB D003      RCALL	_run_1s
(0059) 		  }
(0060)           asm("wdr");                     //软看门狗复位         
    00BC 95A8      WDR
(0061) 		}
    00BD CFE7      RJMP	0x00A5
    00BE 9508      RET
(0062) }
(0063) //1秒任务
(0064) void run_1s(void)
(0065) {
(0066)     sec_num=0;
_run_1s:
    00BF 2422      CLR	R2
    00C0 2433      CLR	R3
    00C1 9230015A  STS	R3,_sec_num+1
    00C3 92200159  STS	R2,_sec_num
(0067)     PORTE^=RUN_LAMP;       
    00C5 E084      LDI	R24,4
    00C6 B023      IN	R2,P03
    00C7 2628      EOR	R2,R24
    00C8 B823      OUT	P03,R2
(0068)     PORTG|=EL_ON;
    00C9 91800065  LDS	R24,0x65
    00CB 6180      ORI	R24,0x10
    00CC 93800065  STS	R24,0x65
(0069) }
    00CE 9508      RET
(0070) //初始化
(0071) void init1(void)
(0072) {
(0073) //定时器初始化
(0074) 	MCUCR=0x80;//enable the External Memory
_init1:
    00CF E880      LDI	R24,0x80
    00D0 BF85      OUT	P35,R24
(0075) 	XMCRA=0x0e;
    00D1 E08E      LDI	R24,0xE
    00D2 9380006D  STS	R24,0x6D
(0076) 	XMCRB=0x80;
    00D4 E880      LDI	R24,0x80
    00D5 9380006C  STS	R24,0x6C
(0077) 	
(0078) 	TCCR1A=0;
    00D7 2422      CLR	R2
    00D8 BC2F      OUT	P2F,R2
(0079) 	TCCR1B=0x09;			        // ctc1=1,ck/1
    00D9 E089      LDI	R24,0x9
    00DA BD8E      OUT	P2E,R24
(0080) 	TIMSK=0x10;				// TIME1B COMPEAR INT OK
    00DB E180      LDI	R24,0x10
    00DC BF87      OUT	P37,R24
(0081) 	OCR1AH=(byte)(T_RELOAD/256);
    00DD E287      LDI	R24,0x27
    00DE BD8B      OUT	P2B,R24
(0082) 	OCR1AL=(byte)T_RELOAD;
    00DF E08F      LDI	R24,0xF
    00E0 BD8A      OUT	P2A,R24
(0083) //液晶口初始化	
(0084) 	DDRB=0x00;              //键盘输入
    00E1 BA27      OUT	P17,R2
(0085)         DDRD=0xff;              //LCD控制
    00E2 EF8F      LDI	R24,0xFF
    00E3 BB81      OUT	P11,R24
(0086)         DDRE=0x0f;      
    00E4 E08F      LDI	R24,0xF
    00E5 B982      OUT	P02,R24
(0087)         DDRF=0x0f;              //LIB为输出
    00E6 93800061  STS	R24,0x61
(0088)         DDRG=0x18;          
    00E8 E188      LDI	R24,0x18
    00E9 93800064  STS	R24,0x64
(0089) 
(0090) 	asm("sei");	
    00EB 9478      BSET	7
(0091) }
    00EC 9508      RET
_int_timer0:
    00ED 922A      ST	R2,-Y
    00EE 923A      ST	R3,-Y
    00EF 938A      ST	R24,-Y
    00F0 939A      ST	R25,-Y
    00F1 B62F      IN	R2,P3F
    00F2 922A      ST	R2,-Y
(0092) 
(0093) #pragma interrupt_handler	int_timer0:13             //定义中断向量
(0094) void int_timer0(void)                                     //定时器延时器中断,1ms中断一次
(0095) {
(0096) 	asm("cli");			//关中断
    00F3 94F8      BCLR	7
(0097) 	OCR1AH=(byte)(T_RELOAD/256);
    00F4 E287      LDI	R24,0x27
    00F5 BD8B      OUT	P2B,R24
(0098) 	OCR1AL=(byte)T_RELOAD;
    00F6 E08F      LDI	R24,0xF
    00F7 BD8A      OUT	P2A,R24
(0099)         sec_num++;                      //秒计时+1  	
    00F8 9190015A  LDS	R25,_sec_num+1
    00FA 91800159  LDS	R24,_sec_num
    00FC 9601      ADIW	R24,1
    00FD 9390015A  STS	R25,_sec_num+1
    00FF 93800159  STS	R24,_sec_num
(0100)         if(mstimer1>0) mstimer1--;
    0101 903001E3  LDS	R3,_mstimer1+1
    0103 902001E2  LDS	R2,_mstimer1
    0105 2022      TST	R2
    0106 F411      BNE	0x0109
    0107 2033      TST	R3
    0108 F031      BEQ	0x010F
    0109 01C1      MOVW	R24,R2
    010A 9701      SBIW	R24,1
    010B 939001E3  STS	R25,_mstimer1+1
    010D 938001E2  STS	R24,_mstimer1
(0101) //        if(mstimer2>0) mstimer2--;
(0102) 	asm("sei");				//中断允许
    010F 9478      BSET	7
(0103) }
    0110 9029      LD	R2,Y+
    0111 BE2F      OUT	P3F,R2
    0112 9199      LD	R25,Y+
    0113 9189      LD	R24,Y+
    0114 9039      LD	R3,Y+
    0115 9029      LD	R2,Y+
    0116 9518      RETI
_disp_face:
  i                    --> Y+3
    0117 9722      SBIW	R28,2
(0104) 
(0105) void disp_face(void)
(0106) {
(0107) byte i;
(0108) 	cls();
    0118 D094      RCALL	_cls
(0109) 
(0110)     strcpy(disp_buffer,"靶靶靶靶靶靶靶靶靶靶靶靶");
    0119 E32F      LDI	R18,0x3F
    011A E031      LDI	R19,1
    011B E50B      LDI	R16,0x5B
    011C E011      LDI	R17,1
    011D 940E058B  CALL	_strcpy
(0111)     str_hz(0,0,disp_buffer);	
    011F E58B      LDI	R24,0x5B
    0120 E091      LDI	R25,1
    0121 8388      STD	R24,0+Y
    0122 8399      STD	R25,1+Y
    0123 2722      CLR	R18
    0124 2700      CLR	R16
    0125 D0E1      RCALL	_str_hz
(0112) 
(0113)     strcpy(disp_buffer,"啊啊啊阿阿阿埃123456");
    0126 E22A      LDI	R18,0x2A
    0127 E031      LDI	R19,1
    0128 E50B      LDI	R16,0x5B
    0129 E011      LDI	R17,1
    012A 940E058B  CALL	_strcpy
(0114)     str_hz(16,0,disp_buffer);	
    012C E58B      LDI	R24,0x5B
    012D E091      LDI	R25,1
    012E 8388      STD	R24,0+Y
    012F 8399      STD	R25,1+Y
    0130 2722      CLR	R18
    0131 E100      LDI	R16,0x10
    0132 D0D4      RCALL	_str_hz
(0115) 		
(0116)     strcpy(disp_buffer,"靶把耙班搬办绊绑棒磅");
    0133 E125      LDI	R18,0x15
    0134 E031      LDI	R19,1
    0135 E50B      LDI	R16,0x5B
    0136 E011      LDI	R17,1
    0137 940E058B  CALL	_strcpy
(0117)     str_hz(32,0,disp_buffer);		
    0139 E58B      LDI	R24,0x5B
    013A E091      LDI	R25,1
    013B 8388      STD	R24,0+Y
    013C 8399      STD	R25,1+Y
    013D 2722      CLR	R18
    013E E200      LDI	R16,0x20
    013F D0C7      RCALL	_str_hz
(0118) 	
(0119)     strcpy(disp_buffer,"01234567890123456789");
    0140 E020      LDI	R18,0
    0141 E031      LDI	R19,1
    0142 E50B      LDI	R16,0x5B
    0143 E011      LDI	R17,1
    0144 940E058B  CALL	_strcpy
(0120)     str_sasc(48,0,disp_buffer);				
    0146 E58B      LDI	R24,0x5B
    0147 E091      LDI	R25,1
    0148 8388      STD	R24,0+Y
    0149 8399      STD	R25,1+Y
    014A 2722      CLR	R18
    014B E300      LDI	R16,0x30
    014C D2A2      RCALL	_str_sasc
(0121) }
    014D 9622      ADIW	R28,2
    014E 9508      RET
(0122) 
(0123) 
(0124) 
(0125) 
(0126) //毫秒级延时函数
(0127) void dlyms(word ms)
(0128) {
(0129) 	mstimer1=ms;
_dlyms:
  ms                   --> R16
    014F 931001E3  STS	R17,_mstimer1+1
    0151 930001E2  STS	R16,_mstimer1
    0153 C001      RJMP	0x0155
(0130) 	while(mstimer1){
(0131) 	   asm("wdr");                     //软看门狗复位
    0154 95A8      WDR
(0132) //           PORTB^=WDG;                     //硬看门狗复位
(0133) 		   }
    0155 903001E3  LDS	R3,_mstimer1+1
    0157 902001E2  LDS	R2,_mstimer1
    0159 2022      TST	R2
    015A F7C9      BNE	0x0154
    015B 2033      TST	R3
    015C F7B9      BNE	0x0154
(0134) }
    015D 9508      RET
_delly:
  i                    --> R20
  ns                   --> R16
    015E 940E0552  CALL	push_gset1
(0135) //延时函数
(0136) void delly(word ns)
(0137) {
(0138) byte i;
(0139) 	for(i=0;i<ns;i++){
    0160 2744      CLR	R20
    0161 C002      RJMP	0x0164
(0140) 	       asm("wdr");                     //软看门狗复位
    0162 95A8      WDR
(0141) //           PORTB^=WDG;                     //硬看门狗复位
(0142)            }
    0163 9543      INC	R20
    0164 2E24      MOV	R2,R20
    0165 2433      CLR	R3
    0166 1620      CP	R2,R16
    0167 0631      CPC	R3,R17
    0168 F3C8      BCS	0x0162
(0143) }
    0169 940E0555  CALL	pop_gset1
    016B 9508      RET
(0144) 
(0145) //液晶忙等待
(0146) void wait_disp(void)
(0147) {
(0148) byte flag;
(0149) 	
(0150)         PORTD|=LCD_ID;               //CD=1	
_wait_disp:
  flag                 --> R16
    016C 9A96      SBI	P12,6
(0151) 	PORTD|=LCD_ID;               //CD=1        	
    016D 9A96      SBI	P12,6
(0152) 	PORTD&=~LCD_CS;           //CE=0
    016E 9895      CBI	P12,5
(0153) 	PORTD&=~LCD_CS;           //CE=0
    016F 9895      CBI	P12,5
(0154) 	PORTD&=~LCD_CS;           //CE=0		
    0170 9895      CBI	P12,5
(0155) 	
(0156) 	for(;;)
(0157) 	{	                
(0158) 	        asm("nop");
    0171 0000      NOP
(0159) 	        asm("nop");
    0172 0000      NOP
(0160)                 asm("nop");
    0173 0000      NOP
(0161) 	    
(0162) 	        flag=*(byte*)0x8000;
    0174 91008000  LDS	R16,0x8000
(0163) 		if((flag & LCD_BUSY_S0) && (flag & LCD_BUSY_S1))     //判断液晶忙否?
    0176 FF00      SBRS	R16,0
    0177 C009      RJMP	0x0181
    0178 FF01      SBRS	R16,1
    0179 C007      RJMP	0x0181
(0164) 		{  
(0165) 	   	          	               	    
(0166) 		    PORTD|=LCD_CS|LCD_ID;         //CE=1,ID=1
    017A B382      IN	R24,P12
    017B 6680      ORI	R24,0x60
    017C BB82      OUT	P12,R24
(0167) 		    PORTD|=LCD_CS|LCD_ID;         //CE=1,ID=1	
    017D B382      IN	R24,P12
    017E 6680      ORI	R24,0x60
    017F BB82      OUT	P12,R24
(0168) 		    return;
    0180 C004      RJMP	0x0185
(0169) 		}	
(0170) 		asm("nop");
    0181 0000      NOP
(0171) 		asm("nop");
    0182 0000      NOP
(0172) 		asm("nop");                  
    0183 0000      NOP
(0173) 	}	
    0184 CFEC      RJMP	0x0171
    0185 9508      RET
_write_order:
  pt                   --> Y+1
  order                --> R20
    0186 940E0552  CALL	push_gset1
    0188 2F40      MOV	R20,R16
(0174) }
(0175) 
(0176) //对液晶发送命令码
(0177) void write_order(byte order)//对液晶发送命令码
(0178) {
(0179) byte *pt; 
(0180) 
(0181)         wait_disp();
    0189 DFE2      RCALL	_wait_disp
(0182)         PORTD|=LCD_ID;       //CD=1
    018A 9A96      SBI	P12,6
(0183) 	PORTD|=LCD_ID;       //CD=1
    018B 9A96      SBI	P12,6
(0184) 	PORTD|=LCD_ID;       //CD=1	
    018C 9A96      SBI	P12,6
(0185) 	PORTD&=~LCD_CS;       //CS=0
    018D 9895      CBI	P12,5
(0186) 	PORTD&=~LCD_CS;       //CS=0
    018E 9895      CBI	P12,5
(0187) 	PORTD&=~LCD_CS;       //CS=0       
    018F 9895      CBI	P12,5
(0188) 	*(byte*)0x8000=order;              //命令码		
    0190 93408000  STS	R20,0x8000
(0189) 	PORTD|=LCD_CS;       //CS=1
    0192 9A95      SBI	P12,5
(0190) 	PORTD|=LCD_CS;       //CS=1
    0193 9A95      SBI	P12,5
(0191) 	PORTD|=LCD_CS;       //CS=1
    0194 9A95      SBI	P12,5
(0192) 	PORTD&=~LCD_ID;       //CD=0
    0195 9896      CBI	P12,6
(0193) 	PORTD&=~LCD_ID;       //CD=0
    0196 9896      CBI	P12,6
(0194) 	PORTD&=~LCD_ID;       //CD=0	
    0197 9896      CBI	P12,6
(0195) }
    0198 940E0555  CALL	pop_gset1
    019A 9508      RET
_write_data:
  pt                   --> Y+1
  data                 --> R20
    019B 940E0552  CALL	push_gset1
    019D 2F40      MOV	R20,R16
(0196) 

⌨️ 快捷键说明

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