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

📄 main.lst

📁 LCD128*64 atmega16驱动 带仿真文件
💻 LST
字号:
__text_start:
__start:
    0101 EFCF      LDI	R28,0xFF
    0102 E1D0      LDI	R29,0x10
    0103 BFCD      OUT	0x3D,R28
    0104 BFDE      OUT	0x3E,R29
    0105 51C0      SUBI	R28,0x10
    0106 40D0      SBCI	R29,0
    0107 EA0A      LDI	R16,0xAA
    0108 8308      STD	Y+0,R16
    0109 2400      CLR	R0
    010A E0E1      LDI	R30,1
    010B E0F1      LDI	R31,1
    010C E011      LDI	R17,1
    010D 30E2      CPI	R30,2
    010E 07F1      CPC	R31,R17
    010F F011      BEQ	0x0112
    0110 9201      ST	R0,Z+
    0111 CFFB      RJMP	0x010D
    0112 8300      STD	Z+0,R16
    0113 E0E0      LDI	R30,0
    0114 E0F2      LDI	R31,2
    0115 E0A0      LDI	R26,0
    0116 E0B1      LDI	R27,1
    0117 E012      LDI	R17,2
    0118 30E1      CPI	R30,1
    0119 07F1      CPC	R31,R17
    011A F021      BEQ	0x011F
    011B 95C8      LPM
    011C 9631      ADIW	R30,1
    011D 920D      ST	R0,X+
    011E CFF9      RJMP	0x0118
    011F 940E0234  CALL	_main
_exit:
    0121 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\zhuji\桌面\char\main.c
(0001) // Project :12864 LCD Display
(0002) // Writer : you hu
(0003) // ICC-AVR application builder :2005-7-12 
(0004) // Target : M128
(0005) // Crystal: 8.0000Mhz
(0006) // Description : display char  
(0007) 
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "char.h"
(0011) #include "main.h"
(0012) typedef unsigned char uchar;
(0013) typedef unsigned int uint;
(0014) 
(0015) unsigned char flag;
(0016) 
(0017) void port_init(void)
(0018) {
(0019)  //访问外部ram的总线端口
(0020)  PORTA = 0x00;
_port_init:
    0122 2422      CLR	R2
    0123 BA2B      OUT	0x1B,R2
(0021)  DDRA  = 0x00; 
    0124 BA2A      OUT	0x1A,R2
(0022)  PORTC = 0x00; 
    0125 BA25      OUT	0x15,R2
(0023)  DDRC  = 0xFF;
    0126 EF8F      LDI	R24,0xFF
    0127 BB84      OUT	0x14,R24
(0024) }
    0128 9508      RET
_check_busy:
  temp                 --> R20
  cs                   --> R16
    0129 940E0240  CALL	push_gset1
(0025) 	  
(0026) void check_busy(uchar cs)               
(0027) { 
    012B C009      RJMP	0x0135
(0028)   uchar temp;
(0029)   while(temp)          
(0030)    { 
(0031)      if(cs)
    012C 2300      TST	R16
    012D F021      BEQ	0x0132
(0032)         temp=R_staus&0X80;               //将忙状态读到temp中进行确定
    012E 91402005  LDS	R20,0x2005
    0130 7840      ANDI	R20,0x80
    0131 C003      RJMP	0x0135
(0033) 	 else
(0034) 	    temp=L_staus&0X80;
    0132 91402009  LDS	R20,0x2009
    0134 7840      ANDI	R20,0x80
    0135 2344      TST	R20
    0136 F7A9      BNE	0x012C
(0035) 	}
(0036) }
    0137 940E0243  CALL	pop_gset1
    0139 9508      RET
_LCD_Clean:
  page                 --> R20
  y                    --> R22
    013A 940E0257  CALL	push_gset2
(0037) 
(0038) void LCD_Clean(void)
(0039) {
(0040)   unsigned char page=0,y;                //定义表示页和列的局部变量
    013C 2744      CLR	R20
(0041)   
(0042)   for(page=0;page<8;page++)
    013D C021      RJMP	0x015F
(0043)      {
(0044) 	                                     //LCD左半屏的操作
(0045) 	   check_busy(0);
    013E 2700      CLR	R16
    013F DFE9      RCALL	_check_busy
(0046) 	   L_command=LCD_PAGE+page;          //设置LCD左半屏页地址
    0140 2F84      MOV	R24,R20
    0141 5488      SUBI	R24,0x48
    0142 93802008  STS	0x2008,R24
(0047) 	   check_busy(0);
    0144 2700      CLR	R16
    0145 DFE3      RCALL	_check_busy
(0048) 	   L_command=LCD_Y; 
    0146 E480      LDI	R24,0x40
    0147 93802008  STS	0x2008,R24
(0049) 	                                     //LCD右半屏的操作
(0050) 	  check_busy(1);
    0149 E001      LDI	R16,1
    014A DFDE      RCALL	_check_busy
(0051) 	   R_command=LCD_PAGE+page;          //设置LCD右半屏页地址
    014B 2F84      MOV	R24,R20
    014C 5488      SUBI	R24,0x48
    014D 93802004  STS	0x2004,R24
(0052) 	  check_busy(1);
    014F E001      LDI	R16,1
    0150 DFD8      RCALL	_check_busy
(0053) 	   R_command=LCD_Y;
    0151 E480      LDI	R24,0x40
    0152 93802004  STS	0x2004,R24
(0054) 	   
(0055) 	   for(y=0;y<64;y++)
    0154 2766      CLR	R22
    0155 C006      RJMP	0x015C
(0056) 	      {
(0057)             L_data=0x00;
    0156 2422      CLR	R2
    0157 9220200A  STS	0x200A,R2
(0058) 			R_data=0x00;
    0159 92202006  STS	0x2006,R2
    015B 9563      INC	R22
    015C 3460      CPI	R22,0x40
    015D F3C0      BCS	0x0156
    015E 9543      INC	R20
    015F 3048      CPI	R20,0x8
    0160 F2E8      BCS	0x013E
(0059) 		  }  
(0060) 	 }
(0061) }
    0161 940E023D  CALL	pop_gset2
    0163 9508      RET
(0062)                                          
(0063) void LCD_Init(void)                     //LCD初始化子函数
(0064) {
(0065)   /*首先关闭12864的显示*/
(0066)   check_busy(0);                        //LCD左半屏正在工作,等待......
_LCD_Init:
    0164 2700      CLR	R16
    0165 DFC3      RCALL	_check_busy
(0067)   L_command=LCD_OFF;                    //先关闭LCD左半屏的显示
    0166 E38E      LDI	R24,0x3E
    0167 93802008  STS	0x2008,R24
(0068)   check_busy(1);                        //LCD右半屏正在工作,等待......
    0169 E001      LDI	R16,1
    016A DFBE      RCALL	_check_busy
(0069)   R_command=LCD_OFF;                    //先关闭LCD右半屏的显示
    016B E38E      LDI	R24,0x3E
    016C 93802004  STS	0x2004,R24
(0070)   
(0071)   /*开启12864的显示*/
(0072)   check_busy(0);
    016E 2700      CLR	R16
    016F DFB9      RCALL	_check_busy
(0073)   L_command=LCD_ON;                     //打开LCD左半屏的显示
    0170 E38F      LDI	R24,0x3F
    0171 93802008  STS	0x2008,R24
(0074)   check_busy(1);
    0173 E001      LDI	R16,1
    0174 DFB4      RCALL	_check_busy
(0075)   R_command=LCD_ON;                     //打开LCD右半屏的显示
    0175 E38F      LDI	R24,0x3F
    0176 93802004  STS	0x2004,R24
(0076)   
(0077)   /*设置LCD显示的起始行*/
(0078)   check_busy(0);
    0178 2700      CLR	R16
    0179 DFAF      RCALL	_check_busy
(0079)   L_command=LCD_X;                      //LCD左半屏起始行为0
    017A EC80      LDI	R24,0xC0
    017B 93802008  STS	0x2008,R24
(0080)   check_busy(1);
    017D E001      LDI	R16,1
    017E DFAA      RCALL	_check_busy
(0081)   R_command=LCD_X;                      //LCD右半屏起始行为0
    017F EC80      LDI	R24,0xC0
    0180 93802004  STS	0x2004,R24
(0082) }
    0182 9508      RET
(0083) 
(0084) void init_devices(void)
(0085) {
(0086)  XMCRA = 0x00;                          //外部存储器控制
_init_devices:
    0183 2422      CLR	R2
    0184 9220006D  STS	0x6D,R2
(0087)  XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
    0186 E087      LDI	R24,7
    0187 9380006C  STS	0x6C,R24
(0088) // mapping_init();
(0089)  port_init();
    0189 DF98      RCALL	_port_init
(0090)  MCUCR = 0x80;                          //外部SRAM使能
    018A E880      LDI	R24,0x80
    018B BF85      OUT	0x35,R24
(0091) }
    018C 9508      RET
_write_Bchar:
  i                    --> R20
  n                    --> R18
  cs                   --> R16
    018D 940E0240  CALL	push_gset1
(0092) 
(0093) void write_Bchar(unsigned char cs,unsigned char n)   // 大写字母显示函数
(0094) {
(0095)   unsigned char i;
(0096)   for(i=0;i<6;i++)
    018F 2744      CLR	R20
    0190 C020      RJMP	0x01B1
(0097)    {
(0098)     if(cs) R_data=big_char[n][i];             //右半屏显示
    0191 2300      TST	R16
    0192 F079      BEQ	0x01A2
    0193 E086      LDI	R24,6
    0194 9F82      MUL	R24,R18
    0195 0110      MOVW	R2,R0
    0196 EC88      LDI	R24,0xC8
    0197 E090      LDI	R25,0
    0198 0E28      ADD	R2,R24
    0199 1E39      ADC	R3,R25
    019A 2FE4      MOV	R30,R20
    019B 27FF      CLR	R31
    019C 0DE2      ADD	R30,R2
    019D 1DF3      ADC	R31,R3
    019E 91E4      LPM	R30,0(Z)
    019F 93E02006  STS	0x2006,R30
    01A1 C00E      RJMP	0x01B0
(0099) 	else   L_data=big_char[n][i];             //左半屏显示
    01A2 E086      LDI	R24,6
    01A3 9F82      MUL	R24,R18
    01A4 0110      MOVW	R2,R0
    01A5 EC88      LDI	R24,0xC8
    01A6 E090      LDI	R25,0
    01A7 0E28      ADD	R2,R24
    01A8 1E39      ADC	R3,R25
    01A9 2FE4      MOV	R30,R20
    01AA 27FF      CLR	R31
    01AB 0DE2      ADD	R30,R2
    01AC 1DF3      ADC	R31,R3
    01AD 91E4      LPM	R30,0(Z)
    01AE 93E0200A  STS	0x200A,R30
    01B0 9543      INC	R20
    01B1 3046      CPI	R20,6
    01B2 F2F0      BCS	0x0191
(0100)    }  
(0101)  }  	
    01B3 940E0243  CALL	pop_gset1
    01B5 9508      RET
_write_Schar:
  i                    --> R20
  n                    --> R18
  cs                   --> R16
    01B6 940E0240  CALL	push_gset1
(0102)  
(0103)  void write_Schar(unsigned char cs,unsigned char n)  // 小写字母显示函数
(0104) {
(0105)   unsigned char i;
(0106)   for(i=0;i<6;i++)
    01B8 2744      CLR	R20
    01B9 C020      RJMP	0x01DA
(0107)    {
(0108)     if(cs) R_data=small_char[n][i];            //右半屏显示
    01BA 2300      TST	R16
    01BB F079      BEQ	0x01CB
    01BC E086      LDI	R24,6
    01BD 9F82      MUL	R24,R18
    01BE 0110      MOVW	R2,R0
    01BF E684      LDI	R24,0x64
    01C0 E091      LDI	R25,1
    01C1 0E28      ADD	R2,R24
    01C2 1E39      ADC	R3,R25
    01C3 2FE4      MOV	R30,R20
    01C4 27FF      CLR	R31
    01C5 0DE2      ADD	R30,R2
    01C6 1DF3      ADC	R31,R3
    01C7 91E4      LPM	R30,0(Z)
    01C8 93E02006  STS	0x2006,R30
    01CA C00E      RJMP	0x01D9
(0109) 	else   L_data=small_char[n][i];            //左半屏显示
    01CB E086      LDI	R24,6
    01CC 9F82      MUL	R24,R18
    01CD 0110      MOVW	R2,R0
    01CE E684      LDI	R24,0x64
    01CF E091      LDI	R25,1
    01D0 0E28      ADD	R2,R24
    01D1 1E39      ADC	R3,R25
    01D2 2FE4      MOV	R30,R20
    01D3 27FF      CLR	R31
    01D4 0DE2      ADD	R30,R2
    01D5 1DF3      ADC	R31,R3
    01D6 91E4      LPM	R30,0(Z)
    01D7 93E0200A  STS	0x200A,R30
    01D9 9543      INC	R20
    01DA 3046      CPI	R20,6
    01DB F2F0      BCS	0x01BA
(0110)    }  
(0111)  }
    01DC 940E0243  CALL	pop_gset1
    01DE 9508      RET
_write_Nchar:
  i                    --> R20
  n                    --> R18
  cs                   --> R16
    01DF 940E0240  CALL	push_gset1
(0112)  
(0113)  void write_Nchar(unsigned char cs,unsigned char n)  //数字显示函数
(0114) {
(0115)   unsigned char i;
(0116)   for(i=0;i<6;i++)
    01E1 2744      CLR	R20
    01E2 C020      RJMP	0x0203
(0117)    {
(0118)     if(cs) R_data=num[n][i];                  //右半屏显示
    01E3 2300      TST	R16
    01E4 F079      BEQ	0x01F4
    01E5 E086      LDI	R24,6
    01E6 9F82      MUL	R24,R18
    01E7 0110      MOVW	R2,R0
    01E8 E88C      LDI	R24,0x8C
    01E9 E090      LDI	R25,0
    01EA 0E28      ADD	R2,R24
    01EB 1E39      ADC	R3,R25
    01EC 2FE4      MOV	R30,R20
    01ED 27FF      CLR	R31
    01EE 0DE2      ADD	R30,R2
    01EF 1DF3      ADC	R31,R3
    01F0 91E4      LPM	R30,0(Z)
    01F1 93E02006  STS	0x2006,R30
    01F3 C00E      RJMP	0x0202
(0119) 	else   L_data=num[n][i];                  //左半屏显示
    01F4 E086      LDI	R24,6
    01F5 9F82      MUL	R24,R18
    01F6 0110      MOVW	R2,R0
    01F7 E88C      LDI	R24,0x8C
    01F8 E090      LDI	R25,0
    01F9 0E28      ADD	R2,R24
    01FA 1E39      ADC	R3,R25
    01FB 2FE4      MOV	R30,R20
    01FC 27FF      CLR	R31
    01FD 0DE2      ADD	R30,R2
    01FE 1DF3      ADC	R31,R3
    01FF 91E4      LPM	R30,0(Z)
    0200 93E0200A  STS	0x200A,R30
    0202 9543      INC	R20
    0203 3046      CPI	R20,6
    0204 F2F0      BCS	0x01E3
(0120)    }  
(0121)  }
    0205 940E0243  CALL	pop_gset1
    0207 9508      RET
_display_char:
  i                    --> R20
    0208 940E0240  CALL	push_gset1
(0122)      
(0123)  void display_char(void)                    //字符显示函数
(0124) {  
(0125)   unsigned char i;
(0126)   static unsigned char adder=0;
(0127)   write_Bchar(0, 24);
    020A E128      LDI	R18,0x18
    020B 2700      CLR	R16
    020C DF80      RCALL	_write_Bchar
(0128)   write_Schar(0, 14);
    020D E02E      LDI	R18,0xE
    020E 2700      CLR	R16
    020F DFA6      RCALL	_write_Schar
(0129)   write_Schar(0, 20);
    0210 E124      LDI	R18,0x14
    0211 2700      CLR	R16
    0212 DFA3      RCALL	_write_Schar
(0130)   for(i=0;i<4;i++){L_data=0x00;}
    0213 2744      CLR	R20
    0214 C004      RJMP	0x0219
    0215 2422      CLR	R2
    0216 9220200A  STS	0x200A,R2
    0218 9543      INC	R20
    0219 3044      CPI	R20,4
    021A F3D0      BCS	0x0215
(0131)   write_Bchar(0, 7);
    021B E027      LDI	R18,7
    021C 2700      CLR	R16
    021D DF6F      RCALL	_write_Bchar
(0132)   write_Schar(0, 20);
    021E E124      LDI	R18,0x14
    021F 2700      CLR	R16
    0220 DF95      RCALL	_write_Schar
(0133)   adder++;
    0221 91800100  LDS	R24,0x100
    0223 5F8F      SUBI	R24,0xFF
    0224 93800100  STS	0x100,R24
(0134)   if(adder>15){flag=1;adder=0;}
    0226 E08F      LDI	R24,0xF
    0227 90200100  LDS	R2,0x100
    0229 1582      CP	R24,R2
    022A F430      BCC	0x0231
    022B E081      LDI	R24,1
    022C 93800101  STS	_flag,R24
    022E 2422      CLR	R2
    022F 92200100  STS	0x100,R2
(0135) }
    0231 940E0243  CALL	pop_gset1
    0233 9508      RET
(0136) 
(0137) 
(0138) void main(void)
(0139) {
(0140)   unsigned char i;
(0141)   init_devices();
_main:
  i                    --> Y+1
    0234 DF4E      RCALL	_init_devices
(0142)   LCD_Clean();
    0235 DF04      RCALL	_LCD_Clean
(0143)   LCD_Init();
    0236 DF2D      RCALL	_LCD_Init
    0237 C003      RJMP	0x023B
(0144)   //display_char(); 
(0145)   while(1)
(0146)   {
(0147)   //write_Bchar(0,1);
(0148)   write_Schar(0,3);
    0238 E023      LDI	R18,3
    0239 2700      CLR	R16
    023A DF7B      RCALL	_write_Schar
    023B CFFC      RJMP	0x0238
(0149)   }
(0150) }
FILE: <library>
    023C 9508      RET
pop_gset2:
    023D E0E2      LDI	R30,2
    023E 940C0244  JMP	pop
push_gset1:
    0240 935A      ST	R21,-Y
    0241 934A      ST	R20,-Y
    0242 9508      RET
pop_gset1:
    0243 E0E1      LDI	R30,1
pop:
    0244 9149      LD	R20,Y+
    0245 9159      LD	R21,Y+
    0246 FDE0      SBRC	R30,0
    0247 9508      RET
    0248 9169      LD	R22,Y+
    0249 9179      LD	R23,Y+
    024A FDE1      SBRC	R30,1
    024B 9508      RET
    024C 90A9      LD	R10,Y+
    024D 90B9      LD	R11,Y+
    024E FDE2      SBRC	R30,2
    024F 9508      RET
    0250 90C9      LD	R12,Y+
    0251 90D9      LD	R13,Y+
    0252 FDE3      SBRC	R30,3
    0253 9508      RET
    0254 90E9      LD	R14,Y+
    0255 90F9      LD	R15,Y+
    0256 9508      RET
push_gset2:
    0257 937A      ST	R23,-Y
    0258 936A      ST	R22,-Y
    0259 940C0240  JMP	push_gset1

⌨️ 快捷键说明

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