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

📄 main.lst

📁 LCD128*64 atmega16驱动 带仿真文件
💻 LST
字号:
__text_start:
__start:
    0096 EFCF      LDI	R28,0xFF
    0097 E1D0      LDI	R29,0x10
    0098 BFCD      OUT	0x3D,R28
    0099 BFDE      OUT	0x3E,R29
    009A 51C0      SUBI	R28,0x10
    009B 40D0      SBCI	R29,0
    009C EA0A      LDI	R16,0xAA
    009D 8308      STD	Y+0,R16
    009E 2400      CLR	R0
    009F E0E0      LDI	R30,0
    00A0 E0F1      LDI	R31,1
    00A1 E011      LDI	R17,1
    00A2 30E1      CPI	R30,1
    00A3 07F1      CPC	R31,R17
    00A4 F011      BEQ	0x00A7
    00A5 9201      ST	R0,Z+
    00A6 CFFB      RJMP	0x00A2
    00A7 8300      STD	Z+0,R16
    00A8 E2EC      LDI	R30,0x2C
    00A9 E0F1      LDI	R31,1
    00AA E0A0      LDI	R26,0
    00AB E0B1      LDI	R27,1
    00AC E011      LDI	R17,1
    00AD 32EC      CPI	R30,0x2C
    00AE 07F1      CPC	R31,R17
    00AF F021      BEQ	0x00B4
    00B0 95C8      LPM
    00B1 9631      ADIW	R30,1
    00B2 920D      ST	R0,X+
    00B3 CFF9      RJMP	0x00AD
    00B4 940E0184  CALL	_main
_exit:
    00B6 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\zhuji\桌面\新建文~2\main.c
(0001) // Project :12864 LCD Display
(0002) // ICC-AVR application builder :2008-3-23 
(0003) // Target : M128
(0004) // Crystal: 8.0000Mhz
(0005) // Description : display chinese 
(0006) // 纵向取模方式 16*16字体
(0007) 
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "chinese.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:
    00B7 2422      CLR	R2
    00B8 BA2B      OUT	0x1B,R2
(0021)  DDRA  = 0x00; 
    00B9 BA2A      OUT	0x1A,R2
(0022)  PORTC = 0x00; 
    00BA BA25      OUT	0x15,R2
(0023)  DDRC  = 0xFF;
    00BB EF8F      LDI	R24,0xFF
    00BC BB84      OUT	0x14,R24
(0024) }
    00BD 9508      RET
_check_busy:
  temp                 --> R20
  cs                   --> R16
    00BE 940E0199  CALL	push_gset1
(0025) 	  
(0026) void check_busy(uchar cs)                  //查忙函数          
(0027) { 
    00C0 C009      RJMP	0x00CA
(0028)   uchar temp;
(0029)   while(temp)          
(0030)    { 
(0031)      if(cs)
    00C1 2300      TST	R16
    00C2 F021      BEQ	0x00C7
(0032)         temp=R_staus&0X80;                  //将忙状态读到temp中进行确定
    00C3 91402005  LDS	R20,0x2005
    00C5 7840      ANDI	R20,0x80
    00C6 C003      RJMP	0x00CA
(0033) 	 else
(0034) 	    temp=L_staus&0X80;
    00C7 91402009  LDS	R20,0x2009
    00C9 7840      ANDI	R20,0x80
    00CA 2344      TST	R20
    00CB F7A9      BNE	0x00C1
(0035) 	}
(0036) }
    00CC 940E019C  CALL	pop_gset1
    00CE 9508      RET
_LCD_Clean:
  page                 --> R20
  y                    --> R22
    00CF 940E01B0  CALL	push_gset2
(0037) 
(0038) void LCD_Clean(void)
(0039) {
(0040)   unsigned char page=0,y;                   //定义表示页和列的局部变量
    00D1 2744      CLR	R20
(0041)   
(0042)   for(page=0;page<8;page++)
    00D2 C021      RJMP	0x00F4
(0043)      {
(0044) 	                                        //LCD左半屏的操作
(0045) 	   check_busy(0);
    00D3 2700      CLR	R16
    00D4 DFE9      RCALL	_check_busy
(0046) 	   L_command=LCD_PAGE+page;             //设置LCD左半屏页地址
    00D5 2F84      MOV	R24,R20
    00D6 5488      SUBI	R24,0x48
    00D7 93802008  STS	0x2008,R24
(0047) 	   check_busy(0);
    00D9 2700      CLR	R16
    00DA DFE3      RCALL	_check_busy
(0048) 	   L_command=LCD_Y; 
    00DB E480      LDI	R24,0x40
    00DC 93802008  STS	0x2008,R24
(0049) 	                                        //LCD右半屏的操作
(0050) 	   check_busy(1);
    00DE E001      LDI	R16,1
    00DF DFDE      RCALL	_check_busy
(0051) 	   R_command=LCD_PAGE+page;             //设置LCD右半屏页地址
    00E0 2F84      MOV	R24,R20
    00E1 5488      SUBI	R24,0x48
    00E2 93802004  STS	0x2004,R24
(0052) 	   check_busy(1);
    00E4 E001      LDI	R16,1
    00E5 DFD8      RCALL	_check_busy
(0053) 	   R_command=LCD_Y;
    00E6 E480      LDI	R24,0x40
    00E7 93802004  STS	0x2004,R24
(0054) 	   
(0055) 	   for(y=0;y<64;y++)
    00E9 2766      CLR	R22
    00EA C006      RJMP	0x00F1
(0056) 	      {
(0057)             L_data=0x00;
    00EB 2422      CLR	R2
    00EC 9220200A  STS	0x200A,R2
(0058) 			R_data=0x00;
    00EE 92202006  STS	0x2006,R2
    00F0 9563      INC	R22
    00F1 3460      CPI	R22,0x40
    00F2 F3C0      BCS	0x00EB
    00F3 9543      INC	R20
    00F4 3048      CPI	R20,0x8
    00F5 F2E8      BCS	0x00D3
(0059) 		  }  
(0060) 	 }
(0061) }
    00F6 940E0193  CALL	pop_gset2
    00F8 9508      RET
(0062)                                          
(0063) void LCD_Init(void)                         //LCD初始化子函数
(0064) {
(0065)   /*首先关闭12864的显示*/
(0066)   check_busy(0);                            //LCD左半屏正在工作,等待......
_LCD_Init:
    00F9 2700      CLR	R16
    00FA DFC3      RCALL	_check_busy
(0067)   L_command=LCD_OFF;                        //先关闭LCD左半屏的显示
    00FB E38E      LDI	R24,0x3E
    00FC 93802008  STS	0x2008,R24
(0068)   check_busy(1);                            //LCD右半屏正在工作,等待......
    00FE E001      LDI	R16,1
    00FF DFBE      RCALL	_check_busy
(0069)   R_command=LCD_OFF;                        //先关闭LCD右半屏的显示
    0100 E38E      LDI	R24,0x3E
    0101 93802004  STS	0x2004,R24
(0070)   
(0071)   /*开启12864的显示*/
(0072)   check_busy(0);
    0103 2700      CLR	R16
    0104 DFB9      RCALL	_check_busy
(0073)   L_command=LCD_ON;                         //打开LCD左半屏的显示
    0105 E38F      LDI	R24,0x3F
    0106 93802008  STS	0x2008,R24
(0074)   check_busy(1);
    0108 E001      LDI	R16,1
    0109 DFB4      RCALL	_check_busy
(0075)   R_command=LCD_ON;                         //打开LCD右半屏的显示
    010A E38F      LDI	R24,0x3F
    010B 93802004  STS	0x2004,R24
(0076)   
(0077)   /*设置LCD显示的起始行*/
(0078)   check_busy(0);
    010D 2700      CLR	R16
    010E DFAF      RCALL	_check_busy
(0079)   L_command=LCD_X;                          //LCD左半屏起始行为0
    010F EC80      LDI	R24,0xC0
    0110 93802008  STS	0x2008,R24
(0080)   check_busy(1);
    0112 E001      LDI	R16,1
    0113 DFAA      RCALL	_check_busy
(0081)   R_command=LCD_X;                          //LCD右半屏起始行为0
    0114 EC80      LDI	R24,0xC0
    0115 93802004  STS	0x2004,R24
(0082) }
    0117 9508      RET
(0083) 
(0084) void init_devices(void)
(0085) {
(0086)  XMCRA = 0x00;                              //外部存储器控制
_init_devices:
    0118 2422      CLR	R2
    0119 9220006D  STS	0x6D,R2
(0087)  XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0);     //外存储高位地址屏蔽,释放端口C
    011B E087      LDI	R24,7
    011C 9380006C  STS	0x6C,R24
(0088)  port_init();
    011E DF98      RCALL	_port_init
(0089)  MCUCR = 0x80;                              //外部SRAM使能
    011F E880      LDI	R24,0x80
    0120 BF85      OUT	0x35,R24
(0090) }
    0121 9508      RET
_write_chineseH:
  i                    --> R20
  datas                --> R22
  y                    --> Y+4
  page                 --> R18
  cs                   --> R16
    0122 940E01B0  CALL	push_gset2
    0124 816E      LDD	R22,Y+6
    0125 817F      LDD	R23,Y+7
(0091) 
(0092)  
(0093) /*******************cs为左右屏选,page为页数选择(0~15)********************************
(0094)  *******************y为水平位置选择(0~3),datas指针指向汉字存储的数组地址 ********************/
(0095) 
(0096)  
(0097) void write_chineseH(uchar cs,uchar page,uchar y,const unsigned char *datas) //上半部分显示
(0098) {
(0099)   uchar i;
(0100)   R_command=LCD_PAGE+page;                  //设置LCD右半屏页地址
    0126 2F82      MOV	R24,R18
    0127 5488      SUBI	R24,0x48
    0128 93802004  STS	0x2004,R24
(0101)   L_command=LCD_PAGE+page;                  //设置LCD左半屏页地址
    012A 2F82      MOV	R24,R18
    012B 5488      SUBI	R24,0x48
    012C 93802008  STS	0x2008,R24
(0102)   R_command=LCD_Y+y*16;                     //设置水平显示位置
    012E E180      LDI	R24,0x10
    012F 800C      LDD	R0,Y+4
    0130 9D80      MUL	R24,R0
    0131 2D80      MOV	R24,R0
    0132 5C80      SUBI	R24,0xC0
    0133 93802004  STS	0x2004,R24
(0103)   L_command=LCD_Y+y*16;
    0135 E180      LDI	R24,0x10
    0136 800C      LDD	R0,Y+4
    0137 9D80      MUL	R24,R0
    0138 2D80      MOV	R24,R0
    0139 5C80      SUBI	R24,0xC0
    013A 93802008  STS	0x2008,R24
(0104)   for(i=0;i<16;i++)
    013C 2744      CLR	R20
    013D C00E      RJMP	0x014C
(0105)     {
(0106)     if(cs) R_data=*datas;                   //右半屏显示
    013E 2300      TST	R16
    013F F029      BEQ	0x0145
    0140 01FB      MOVW	R30,R22
    0141 91E4      LPM	R30,0(Z)
    0142 93E02006  STS	0x2006,R30
    0144 C004      RJMP	0x0149
(0107) 	else   L_data=*datas;                   //左半屏显示
    0145 01FB      MOVW	R30,R22
    0146 91E4      LPM	R30,0(Z)
    0147 93E0200A  STS	0x200A,R30
(0108) 	*datas++;
    0149 5F6F      SUBI	R22,0xFF
    014A 4F7F      SBCI	R23,0xFF
    014B 9543      INC	R20
    014C 3140      CPI	R20,0x10
    014D F380      BCS	0x013E
(0109)     }
(0110) }
    014E 940E0193  CALL	pop_gset2
    0150 9508      RET
_write_chineseL:
  i                    --> R20
  datas                --> R22
  y                    --> Y+6
  page                 --> R20
  cs                   --> R10
    0151 940E01B4  CALL	push_gset3
    0153 2F42      MOV	R20,R18
    0154 2EA0      MOV	R10,R16
    0155 8568      LDD	R22,Y+8
    0156 8579      LDD	R23,Y+9
(0111) 
(0112) void write_chineseL(uchar cs,uchar page,uchar y,const unsigned char *datas) //下半部分显示
(0113) {
(0114)  uchar i;
(0115)  check_busy(1);
    0157 E001      LDI	R16,1
    0158 DF65      RCALL	_check_busy
(0116)  R_command=LCD_PAGE+page;                   //设置LCD右半屏页地址
    0159 2F84      MOV	R24,R20
    015A 5488      SUBI	R24,0x48
    015B 93802004  STS	0x2004,R24
(0117)  L_command=LCD_PAGE+page;                   //设置LCD左半屏页地址
    015D 2F84      MOV	R24,R20
    015E 5488      SUBI	R24,0x48
    015F 93802008  STS	0x2008,R24
(0118)  R_command=LCD_Y+y*16;                      //设置水平显示位置
    0161 E180      LDI	R24,0x10
    0162 800E      LDD	R0,Y+6
    0163 9D80      MUL	R24,R0
    0164 2D80      MOV	R24,R0
    0165 5C80      SUBI	R24,0xC0
    0166 93802004  STS	0x2004,R24
(0119)  L_command=LCD_Y+y*16;
    0168 E180      LDI	R24,0x10
    0169 800E      LDD	R0,Y+6
    016A 9D80      MUL	R24,R0
    016B 2D80      MOV	R24,R0
    016C 5C80      SUBI	R24,0xC0
    016D 93802008  STS	0x2008,R24
(0120)  for(i=0;i<16;i++)
    016F 2744      CLR	R20
    0170 C00E      RJMP	0x017F
(0121)   {
(0122)    if(cs) R_data=*datas;                    //右半屏显示
    0171 20AA      TST	R10
    0172 F029      BEQ	0x0178
    0173 01FB      MOVW	R30,R22
    0174 91E4      LPM	R30,0(Z)
    0175 93E02006  STS	0x2006,R30
    0177 C004      RJMP	0x017C
(0123)    else   L_data=*datas;                    //左半屏显示
    0178 01FB      MOVW	R30,R22
    0179 91E4      LPM	R30,0(Z)
    017A 93E0200A  STS	0x200A,R30
(0124)    *datas++;
    017C 5F6F      SUBI	R22,0xFF
    017D 4F7F      SBCI	R23,0xFF
    017E 9543      INC	R20
    017F 3140      CPI	R20,0x10
    0180 F380      BCS	0x0171
(0125)   }	
(0126) }
    0181 940E0196  CALL	pop_gset3
    0183 9508      RET
_main:
    0184 9724      SBIW	R28,4
(0127) 
(0128) void main(void)
(0129) {
(0130)   init_devices();
    0185 DF92      RCALL	_init_devices
(0131)   LCD_Clean();
    0186 DF48      RCALL	_LCD_Clean
(0132)   LCD_Init();
    0187 DF71      RCALL	_LCD_Init
(0133)  write_chineseH(0,0,2,you1);
    0188 E88C      LDI	R24,0x8C
    0189 E090      LDI	R25,0
    018A 839B      STD	Y+3,R25
    018B 838A      STD	Y+2,R24
    018C E082      LDI	R24,2
    018D 8388      STD	Y+0,R24
    018E 2722      CLR	R18
    018F 2700      CLR	R16
    0190 DF91      RCALL	_write_chineseH
(0134) // write_chineseL(0,1,2,you2); 
(0135) // write_chineseH(1,0,0,hu1);
(0136)  //write_chineseL(1,1,0,hu2);  
(0137) }
FILE: <library>
    0191 9624      ADIW	R28,4
    0192 9508      RET
pop_gset2:
    0193 E0E2      LDI	R30,2
    0194 940C019D  JMP	pop
pop_gset3:
    0196 E0E4      LDI	R30,4
    0197 940C019D  JMP	pop
push_gset1:
    0199 935A      ST	R21,-Y
    019A 934A      ST	R20,-Y
    019B 9508      RET
pop_gset1:
    019C E0E1      LDI	R30,1
pop:
    019D 9149      LD	R20,Y+
    019E 9159      LD	R21,Y+
    019F FDE0      SBRC	R30,0
    01A0 9508      RET
    01A1 9169      LD	R22,Y+
    01A2 9179      LD	R23,Y+
    01A3 FDE1      SBRC	R30,1
    01A4 9508      RET
    01A5 90A9      LD	R10,Y+
    01A6 90B9      LD	R11,Y+
    01A7 FDE2      SBRC	R30,2
    01A8 9508      RET
    01A9 90C9      LD	R12,Y+
    01AA 90D9      LD	R13,Y+
    01AB FDE3      SBRC	R30,3
    01AC 9508      RET
    01AD 90E9      LD	R14,Y+
    01AE 90F9      LD	R15,Y+
    01AF 9508      RET
push_gset2:
    01B0 937A      ST	R23,-Y
    01B1 936A      ST	R22,-Y
    01B2 940C0199  JMP	push_gset1
push_gset3:
    01B4 92BA      ST	R11,-Y
    01B5 92AA      ST	R10,-Y
    01B6 940C01B0  JMP	push_gset2

⌨️ 快捷键说明

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