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

📄 lcd.lst

📁 一个关于AVR单片机的例程
💻 LST
字号:
__text_start:
__start:
    00E5 E5CF      LDI	R28,0x5F
    00E6 E0D4      LDI	R29,4
    00E7 BFCD      OUT	0x3D,R28
    00E8 BFDE      OUT	0x3E,R29
    00E9 51C0      SUBI	R28,0x10
    00EA 40D0      SBCI	R29,0
    00EB EA0A      LDI	R16,0xAA
    00EC 8308      STD	Y+0,R16
    00ED 2400      CLR	R0
    00EE E6E1      LDI	R30,0x61
    00EF E0F0      LDI	R31,0
    00F0 E010      LDI	R17,0
    00F1 36E2      CPI	R30,0x62
    00F2 07F1      CPC	R31,R17
    00F3 F011      BEQ	0x00F6
    00F4 9201      ST	R0,Z+
    00F5 CFFB      RJMP	0x00F1
    00F6 8300      STD	Z+0,R16
    00F7 ECE8      LDI	R30,0xC8
    00F8 E0F1      LDI	R31,1
    00F9 E6A0      LDI	R26,0x60
    00FA E0B0      LDI	R27,0
    00FB E011      LDI	R17,1
    00FC 3CE9      CPI	R30,0xC9
    00FD 07F1      CPC	R31,R17
    00FE F021      BEQ	0x0103
    00FF 95C8      LPM
    0100 9631      ADIW	R30,1
    0101 920D      ST	R0,X+
    0102 CFF9      RJMP	0x00FC
    0103 940E0218  CALL	_main
_exit:
    0105 CFFF      RJMP	_exit
FILE: F:\单片机源程序\AVR单片机程序\Mega128\LCD128~1\lcd.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 "lcd.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:
    0106 2422      CLR	R2
    0107 BA2B      OUT	0x1B,R2
(0021)  DDRA  = 0x00; 
    0108 BA2A      OUT	0x1A,R2
(0022)  PORTC = 0x00; 
    0109 BA25      OUT	0x15,R2
(0023)  DDRC  = 0xFF;
    010A EF8F      LDI	R24,0xFF
    010B BB84      OUT	0x14,R24
    010C 9508      RET
_check_busy:
  temp                 --> R20
  cs                   --> R16
    010D 940E0228  CALL	push_gset1
(0024) }
(0025) 	  
(0026) void check_busy(uchar cs)               
(0027) { 
    010F C009      RJMP	0x0119
(0028)   uchar temp;
(0029)   while(temp)          
(0030)    { 
(0031)      if(cs)
    0110 2300      TST	R16
    0111 F021      BEQ	0x0116
(0032)         temp=R_staus&0X80;               //将忙状态读到temp中进行确定
    0112 91402005  LDS	R20,0x2005
    0114 7840      ANDI	R20,0x80
    0115 C003      RJMP	0x0119
(0033) 	 else
(0034) 	    temp=L_staus&0X80;
    0116 91402009  LDS	R20,0x2009
    0118 7840      ANDI	R20,0x80
    0119 2344      TST	R20
    011A F7A9      BNE	0x0110
    011B 940E022B  CALL	pop_gset1
    011D 9508      RET
_LCD_Clean:
  page                 --> R20
  y                    --> R22
    011E 940E0226  CALL	push_gset2
(0035) 	}
(0036) }
(0037) 
(0038) void LCD_Clean(void)
(0039) {
(0040)   unsigned char page=0,y;                //定义表示页和列的局部变量
    0120 2744      CLR	R20
(0041)   
(0042)   for(page=0;page<8;page++)
    0121 C021      RJMP	0x0143
(0043)      {
(0044) 	                                     //LCD左半屏的操作
(0045) 	   check_busy(0);
    0122 2700      CLR	R16
    0123 DFE9      RCALL	_check_busy
(0046) 	   L_command=LCD_PAGE+page;          //设置LCD左半屏页地址
    0124 2F84      MOV	R24,R20
    0125 5488      SUBI	R24,0x48
    0126 93802008  STS	0x2008,R24
(0047) 	   check_busy(0);
    0128 2700      CLR	R16
    0129 DFE3      RCALL	_check_busy
(0048) 	   L_command=LCD_Y; 
    012A E480      LDI	R24,0x40
    012B 93802008  STS	0x2008,R24
(0049) 	                                     //LCD右半屏的操作
(0050) 	  check_busy(1);
    012D E001      LDI	R16,1
    012E DFDE      RCALL	_check_busy
(0051) 	   R_command=LCD_PAGE+page;          //设置LCD右半屏页地址
    012F 2F84      MOV	R24,R20
    0130 5488      SUBI	R24,0x48
    0131 93802004  STS	0x2004,R24
(0052) 	  check_busy(1);
    0133 E001      LDI	R16,1
    0134 DFD8      RCALL	_check_busy
(0053) 	   R_command=LCD_Y;
    0135 E480      LDI	R24,0x40
    0136 93802004  STS	0x2004,R24
(0054) 	   
(0055) 	   for(y=0;y<64;y++)
    0138 2766      CLR	R22
    0139 C006      RJMP	0x0140
(0056) 	      {
(0057)             L_data=0x00;
    013A 2422      CLR	R2
    013B 9220200A  STS	0x200A,R2
(0058) 			R_data=0x00;
    013D 92202006  STS	0x2006,R2
    013F 9563      INC	R22
    0140 3460      CPI	R22,0x40
    0141 F3C0      BCS	0x013A
    0142 9543      INC	R20
    0143 3048      CPI	R20,0x8
    0144 F2E8      BCS	0x0122
    0145 940E021D  CALL	pop_gset2
    0147 9508      RET
(0059) 		  }  
(0060) 	 }
(0061) }
(0062)                                          
(0063) void LCD_Init(void)                     //LCD初始化子函数
(0064) {
(0065)   /*首先关闭12864的显示*/
(0066)   check_busy(0);                        //LCD左半屏正在工作,等待......
_LCD_Init:
    0148 2700      CLR	R16
    0149 DFC3      RCALL	_check_busy
(0067)   L_command=LCD_OFF;                    //先关闭LCD左半屏的显示
    014A E38E      LDI	R24,0x3E
    014B 93802008  STS	0x2008,R24
(0068)   check_busy(1);                        //LCD右半屏正在工作,等待......
    014D E001      LDI	R16,1
    014E DFBE      RCALL	_check_busy
(0069)   R_command=LCD_OFF;                    //先关闭LCD右半屏的显示
    014F E38E      LDI	R24,0x3E
    0150 93802004  STS	0x2004,R24
(0070)   
(0071)   /*开启12864的显示*/
(0072)   check_busy(0);
    0152 2700      CLR	R16
    0153 DFB9      RCALL	_check_busy
(0073)   L_command=LCD_ON;                     //打开LCD左半屏的显示
    0154 E38F      LDI	R24,0x3F
    0155 93802008  STS	0x2008,R24
(0074)   check_busy(1);
    0157 E001      LDI	R16,1
    0158 DFB4      RCALL	_check_busy
(0075)   R_command=LCD_ON;                     //打开LCD右半屏的显示
    0159 E38F      LDI	R24,0x3F
    015A 93802004  STS	0x2004,R24
(0076)   
(0077)   /*设置LCD显示的起始行*/
(0078)   check_busy(0);
    015C 2700      CLR	R16
    015D DFAF      RCALL	_check_busy
(0079)   L_command=LCD_X;                      //LCD左半屏起始行为0
    015E EC80      LDI	R24,0xC0
    015F 93802008  STS	0x2008,R24
(0080)   check_busy(1);
    0161 E001      LDI	R16,1
    0162 DFAA      RCALL	_check_busy
(0081)   R_command=LCD_X;                      //LCD右半屏起始行为0
    0163 EC80      LDI	R24,0xC0
    0164 93802004  STS	0x2004,R24
    0166 9508      RET
(0082) }
(0083) 
(0084) void init_devices(void)
(0085) {
(0086)  XMCRA = 0x00;                          //外部存储器控制
_init_devices:
    0167 2422      CLR	R2
    0168 9220006D  STS	0x6D,R2
(0087)  XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
    016A E087      LDI	R24,7
    016B 9380006C  STS	0x6C,R24
(0088) // mapping_init();
(0089)  port_init();
    016D DF98      RCALL	_port_init
(0090)  MCUCR = 0x80;                          //外部SRAM使能
    016E E880      LDI	R24,0x80
    016F BF85      OUT	0x35,R24
    0170 9508      RET
_write_Bchar:
  i                    --> R20
  n                    --> R18
  cs                   --> R16
    0171 940E0228  CALL	push_gset1
(0091) }
(0092) 
(0093) void write_Bchar(unsigned char cs,unsigned char n)   // 大写字母显示函数
(0094) {
(0095)   unsigned char i;
(0096)   for(i=0;i<6;i++)
    0173 2744      CLR	R20
    0174 C020      RJMP	0x0195
(0097)    {
(0098)     if(cs) R_data=big_char[n][i];             //右半屏显示
    0175 2300      TST	R16
    0176 F079      BEQ	0x0186
    0177 E086      LDI	R24,6
    0178 9F82      MUL	R24,R18
    0179 0110      MOVW	R2,R0
    017A E980      LDI	R24,0x90
    017B E090      LDI	R25,0
    017C 0E28      ADD	R2,R24
    017D 1E39      ADC	R3,R25
    017E 2FE4      MOV	R30,R20
    017F 27FF      CLR	R31
    0180 0DE2      ADD	R30,R2
    0181 1DF3      ADC	R31,R3
    0182 91E4      LPM	R30,0(Z)
    0183 93E02006  STS	0x2006,R30
    0185 C00E      RJMP	0x0194
(0099) 	else   L_data=big_char[n][i];             //左半屏显示
    0186 E086      LDI	R24,6
    0187 9F82      MUL	R24,R18
    0188 0110      MOVW	R2,R0
    0189 E980      LDI	R24,0x90
    018A E090      LDI	R25,0
    018B 0E28      ADD	R2,R24
    018C 1E39      ADC	R3,R25
    018D 2FE4      MOV	R30,R20
    018E 27FF      CLR	R31
    018F 0DE2      ADD	R30,R2
    0190 1DF3      ADC	R31,R3
    0191 91E4      LPM	R30,0(Z)
    0192 93E0200A  STS	0x200A,R30
    0194 9543      INC	R20
    0195 3046      CPI	R20,6
    0196 F2F0      BCS	0x0175
    0197 940E022B  CALL	pop_gset1
    0199 9508      RET
_write_Schar:
  i                    --> R20
  n                    --> R18
  cs                   --> R16
    019A 940E0228  CALL	push_gset1
(0100)    }  
(0101)  }  	
(0102)  
(0103)  void write_Schar(unsigned char cs,unsigned char n)  // 小写字母显示函数
(0104) {
(0105)   unsigned char i;
(0106)   for(i=0;i<6;i++)
    019C 2744      CLR	R20
    019D C020      RJMP	0x01BE
(0107)    {
(0108)     if(cs) R_data=small_char[n][i];            //右半屏显示
    019E 2300      TST	R16
    019F F079      BEQ	0x01AF
    01A0 E086      LDI	R24,6
    01A1 9F82      MUL	R24,R18
    01A2 0110      MOVW	R2,R0
    01A3 E28C      LDI	R24,0x2C
    01A4 E091      LDI	R25,1
    01A5 0E28      ADD	R2,R24
    01A6 1E39      ADC	R3,R25
    01A7 2FE4      MOV	R30,R20
    01A8 27FF      CLR	R31
    01A9 0DE2      ADD	R30,R2
    01AA 1DF3      ADC	R31,R3
    01AB 91E4      LPM	R30,0(Z)
    01AC 93E02006  STS	0x2006,R30
    01AE C00E      RJMP	0x01BD
(0109) 	else   L_data=small_char[n][i];            //左半屏显示
    01AF E086      LDI	R24,6
    01B0 9F82      MUL	R24,R18
    01B1 0110      MOVW	R2,R0
    01B2 E28C      LDI	R24,0x2C
    01B3 E091      LDI	R25,1
    01B4 0E28      ADD	R2,R24
    01B5 1E39      ADC	R3,R25
    01B6 2FE4      MOV	R30,R20
    01B7 27FF      CLR	R31
    01B8 0DE2      ADD	R30,R2
    01B9 1DF3      ADC	R31,R3
    01BA 91E4      LPM	R30,0(Z)
    01BB 93E0200A  STS	0x200A,R30
    01BD 9543      INC	R20
    01BE 3046      CPI	R20,6
    01BF F2F0      BCS	0x019E
    01C0 940E022B  CALL	pop_gset1
    01C2 9508      RET
_write_Nchar:
  i                    --> R20
  n                    --> R18
  cs                   --> R16
    01C3 940E0228  CALL	push_gset1
(0110)    }  
(0111)  }
(0112)  
(0113)  void write_Nchar(unsigned char cs,unsigned char n)  //数字显示函数
(0114) {
(0115)   unsigned char i;
(0116)   for(i=0;i<6;i++)
    01C5 2744      CLR	R20
    01C6 C020      RJMP	0x01E7
(0117)    {
(0118)     if(cs) R_data=num[n][i];                  //右半屏显示
    01C7 2300      TST	R16
    01C8 F079      BEQ	0x01D8
    01C9 E086      LDI	R24,6
    01CA 9F82      MUL	R24,R18
    01CB 0110      MOVW	R2,R0
    01CC E584      LDI	R24,0x54
    01CD E090      LDI	R25,0
    01CE 0E28      ADD	R2,R24
    01CF 1E39      ADC	R3,R25
    01D0 2FE4      MOV	R30,R20
    01D1 27FF      CLR	R31
    01D2 0DE2      ADD	R30,R2
    01D3 1DF3      ADC	R31,R3
    01D4 91E4      LPM	R30,0(Z)
    01D5 93E02006  STS	0x2006,R30
    01D7 C00E      RJMP	0x01E6
(0119) 	else   L_data=num[n][i];                  //左半屏显示
    01D8 E086      LDI	R24,6
    01D9 9F82      MUL	R24,R18
    01DA 0110      MOVW	R2,R0
    01DB E584      LDI	R24,0x54
    01DC E090      LDI	R25,0
    01DD 0E28      ADD	R2,R24
    01DE 1E39      ADC	R3,R25
    01DF 2FE4      MOV	R30,R20
    01E0 27FF      CLR	R31
    01E1 0DE2      ADD	R30,R2
    01E2 1DF3      ADC	R31,R3
    01E3 91E4      LPM	R30,0(Z)
    01E4 93E0200A  STS	0x200A,R30
    01E6 9543      INC	R20
    01E7 3046      CPI	R20,6
    01E8 F2F0      BCS	0x01C7
    01E9 940E022B  CALL	pop_gset1
    01EB 9508      RET
_display_char:
  i                    --> R20
    01EC 940E0228  CALL	push_gset1
(0120)    }  
(0121)  }
(0122)      
(0123)  void display_char(void)                    //字符显示函数
(0124) {  
(0125)   unsigned char i;
(0126)   static unsigned char adder=0;
(0127)   write_Bchar(0, 24);
    01EE E128      LDI	R18,0x18
    01EF 2700      CLR	R16
    01F0 DF80      RCALL	_write_Bchar
(0128)   write_Schar(0, 14);
    01F1 E02E      LDI	R18,0xE
    01F2 2700      CLR	R16
    01F3 DFA6      RCALL	_write_Schar
(0129)   write_Schar(0, 20);
    01F4 E124      LDI	R18,0x14
    01F5 2700      CLR	R16
    01F6 DFA3      RCALL	_write_Schar
(0130)   for(i=0;i<4;i++){L_data=0x00;}
    01F7 2744      CLR	R20
    01F8 C004      RJMP	0x01FD
    01F9 2422      CLR	R2
    01FA 9220200A  STS	0x200A,R2
    01FC 9543      INC	R20
    01FD 3044      CPI	R20,4
    01FE F3D0      BCS	0x01F9
(0131)   write_Bchar(0, 7);
    01FF E027      LDI	R18,7
    0200 2700      CLR	R16
    0201 DF6F      RCALL	_write_Bchar
(0132)   write_Schar(0, 20);
    0202 E124      LDI	R18,0x14
    0203 2700      CLR	R16
    0204 DF95      RCALL	_write_Schar
(0133)   adder++;
    0205 91800060  LDS	R24,adder
    0207 5F8F      SUBI	R24,0xFF
    0208 93800060  STS	adder,R24
(0134)   if(adder>15){flag=1;adder=0;}
    020A E08F      LDI	R24,0xF
    020B 90200060  LDS	R2,adder
    020D 1582      CP	R24,R2
    020E F430      BCC	0x0215
    020F E081      LDI	R24,1
    0210 93800061  STS	flag,R24
    0212 2422      CLR	R2
    0213 92200060  STS	adder,R2
    0215 940E022B  CALL	pop_gset1
    0217 9508      RET
(0135) }
(0136) 
(0137) 
(0138) void main(void)
(0139) {
(0140)   unsigned char i;
(0141)   init_devices();
_main:
  i                    --> Y+1
    0218 DF4E      RCALL	_init_devices
(0142)   LCD_Clean();
    0219 DF04      RCALL	_LCD_Clean
(0143)   LCD_Init();
    021A DF2D      RCALL	_LCD_Init
(0144)   display_char(); 
FILE: <library>
    021B DFD0      RCALL	_display_char
    021C 9508      RET
pop_gset2:
    021D E0E2      LDI	R30,2
    021E 940C022C  JMP	pop
push_gset5:
    0220 92FA      ST	R15,-Y
    0221 92EA      ST	R14,-Y
push_gset4:
    0222 92DA      ST	R13,-Y
    0223 92CA      ST	R12,-Y
push_gset3:
    0224 92BA      ST	R11,-Y
    0225 92AA      ST	R10,-Y
push_gset2:
    0226 937A      ST	R23,-Y
    0227 936A      ST	R22,-Y
push_gset1:
    0228 935A      ST	R21,-Y
    0229 934A      ST	R20,-Y
    022A 9508      RET
pop_gset1:
    022B E0E1      LDI	R30,1
pop:
    022C 9149      LD	R20,Y+
    022D 9159      LD	R21,Y+
    022E FDE0      SBRC	R30,0
    022F 9508      RET
    0230 9169      LD	R22,Y+
    0231 9179      LD	R23,Y+
    0232 FDE1      SBRC	R30,1
    0233 9508      RET
    0234 90A9      LD	R10,Y+
    0235 90B9      LD	R11,Y+
    0236 FDE2      SBRC	R30,2
    0237 9508      RET
    0238 90C9      LD	R12,Y+
    0239 90D9      LD	R13,Y+
    023A FDE3      SBRC	R30,3
    023B 9508      RET
    023C 90E9      LD	R14,Y+
    023D 90F9      LD	R15,Y+
    023E 9508      RET

⌨️ 快捷键说明

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