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

📄 lcd.lst

📁 一个关于AVR单片机的例程
💻 LST
字号:
__text_start:
__start:
    007A E5CF      LDI	R28,0x5F
    007B E0D4      LDI	R29,4
    007C BFCD      OUT	0x3D,R28
    007D BFDE      OUT	0x3E,R29
    007E 51C0      SUBI	R28,0x10
    007F 40D0      SBCI	R29,0
    0080 EA0A      LDI	R16,0xAA
    0081 8308      STD	Y+0,R16
    0082 2400      CLR	R0
    0083 E6E0      LDI	R30,0x60
    0084 E0F0      LDI	R31,0
    0085 E010      LDI	R17,0
    0086 36E1      CPI	R30,0x61
    0087 07F1      CPC	R31,R17
    0088 F011      BEQ	0x008B
    0089 9201      ST	R0,Z+
    008A CFFB      RJMP	0x0086
    008B 8300      STD	Z+0,R16
    008C EFE4      LDI	R30,0xF4
    008D E0F0      LDI	R31,0
    008E E6A0      LDI	R26,0x60
    008F E0B0      LDI	R27,0
    0090 E010      LDI	R17,0
    0091 3FE4      CPI	R30,0xF4
    0092 07F1      CPC	R31,R17
    0093 F021      BEQ	0x0098
    0094 95C8      LPM
    0095 9631      ADIW	R30,1
    0096 920D      ST	R0,X+
    0097 CFF9      RJMP	0x0091
    0098 940E0168  CALL	_main
_exit:
    009A CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\LCD128~1\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 chinese 
(0007) // 纵向取模方式 16*16字体
(0008) 
(0009) #include <iom128v.h>
(0010) #include <macros.h>
(0011) #include "chinese.h"
(0012) #include "lcd.h"
(0013) typedef unsigned char uchar;
(0014) typedef unsigned int uint;
(0015) 
(0016) unsigned char flag;
(0017) 
(0018) void port_init(void)
(0019) {
(0020)  //访问外部ram的总线端口
(0021)  PORTA = 0x00;
_port_init:
    009B 2422      CLR	R2
    009C BA2B      OUT	0x1B,R2
(0022)  DDRA  = 0x00; 
    009D BA2A      OUT	0x1A,R2
(0023)  PORTC = 0x00; 
    009E BA25      OUT	0x15,R2
(0024)  DDRC  = 0xFF;
    009F EF8F      LDI	R24,0xFF
    00A0 BB84      OUT	0x14,R24
    00A1 9508      RET
_check_busy:
  temp                 --> R20
  cs                   --> R16
    00A2 940E01A0  CALL	push_gset1
(0025) }
(0026) 	  
(0027) void check_busy(uchar cs)                  //查忙函数          
(0028) { 
    00A4 C009      RJMP	0x00AE
(0029)   uchar temp;
(0030)   while(temp)          
(0031)    { 
(0032)      if(cs)
    00A5 2300      TST	R16
    00A6 F021      BEQ	0x00AB
(0033)         temp=R_staus&0X80;                  //将忙状态读到temp中进行确定
    00A7 91402005  LDS	R20,0x2005
    00A9 7840      ANDI	R20,0x80
    00AA C003      RJMP	0x00AE
(0034) 	 else
(0035) 	    temp=L_staus&0X80;
    00AB 91402009  LDS	R20,0x2009
    00AD 7840      ANDI	R20,0x80
    00AE 2344      TST	R20
    00AF F7A9      BNE	0x00A5
    00B0 940E01A3  CALL	pop_gset1
    00B2 9508      RET
_LCD_Clean:
  page                 --> R20
  y                    --> R22
    00B3 940E019E  CALL	push_gset2
(0036) 	}
(0037) }
(0038) 
(0039) void LCD_Clean(void)
(0040) {
(0041)   unsigned char page=0,y;                   //定义表示页和列的局部变量
    00B5 2744      CLR	R20
(0042)   
(0043)   for(page=0;page<8;page++)
    00B6 C021      RJMP	0x00D8
(0044)      {
(0045) 	                                        //LCD左半屏的操作
(0046) 	   check_busy(0);
    00B7 2700      CLR	R16
    00B8 DFE9      RCALL	_check_busy
(0047) 	   L_command=LCD_PAGE+page;             //设置LCD左半屏页地址
    00B9 2F84      MOV	R24,R20
    00BA 5488      SUBI	R24,0x48
    00BB 93802008  STS	0x2008,R24
(0048) 	   check_busy(0);
    00BD 2700      CLR	R16
    00BE DFE3      RCALL	_check_busy
(0049) 	   L_command=LCD_Y; 
    00BF E480      LDI	R24,0x40
    00C0 93802008  STS	0x2008,R24
(0050) 	                                        //LCD右半屏的操作
(0051) 	   check_busy(1);
    00C2 E001      LDI	R16,1
    00C3 DFDE      RCALL	_check_busy
(0052) 	   R_command=LCD_PAGE+page;             //设置LCD右半屏页地址
    00C4 2F84      MOV	R24,R20
    00C5 5488      SUBI	R24,0x48
    00C6 93802004  STS	0x2004,R24
(0053) 	   check_busy(1);
    00C8 E001      LDI	R16,1
    00C9 DFD8      RCALL	_check_busy
(0054) 	   R_command=LCD_Y;
    00CA E480      LDI	R24,0x40
    00CB 93802004  STS	0x2004,R24
(0055) 	   
(0056) 	   for(y=0;y<64;y++)
    00CD 2766      CLR	R22
    00CE C006      RJMP	0x00D5
(0057) 	      {
(0058)             L_data=0x00;
    00CF 2422      CLR	R2
    00D0 9220200A  STS	0x200A,R2
(0059) 			R_data=0x00;
    00D2 92202006  STS	0x2006,R2
    00D4 9563      INC	R22
    00D5 3460      CPI	R22,0x40
    00D6 F3C0      BCS	0x00CF
    00D7 9543      INC	R20
    00D8 3048      CPI	R20,0x8
    00D9 F2E8      BCS	0x00B7
    00DA 940E0192  CALL	pop_gset2
    00DC 9508      RET
(0060) 		  }  
(0061) 	 }
(0062) }
(0063)                                          
(0064) void LCD_Init(void)                         //LCD初始化子函数
(0065) {
(0066)   /*首先关闭12864的显示*/
(0067)   check_busy(0);                            //LCD左半屏正在工作,等待......
_LCD_Init:
    00DD 2700      CLR	R16
    00DE DFC3      RCALL	_check_busy
(0068)   L_command=LCD_OFF;                        //先关闭LCD左半屏的显示
    00DF E38E      LDI	R24,0x3E
    00E0 93802008  STS	0x2008,R24
(0069)   check_busy(1);                            //LCD右半屏正在工作,等待......
    00E2 E001      LDI	R16,1
    00E3 DFBE      RCALL	_check_busy
(0070)   R_command=LCD_OFF;                        //先关闭LCD右半屏的显示
    00E4 E38E      LDI	R24,0x3E
    00E5 93802004  STS	0x2004,R24
(0071)   
(0072)   /*开启12864的显示*/
(0073)   check_busy(0);
    00E7 2700      CLR	R16
    00E8 DFB9      RCALL	_check_busy
(0074)   L_command=LCD_ON;                         //打开LCD左半屏的显示
    00E9 E38F      LDI	R24,0x3F
    00EA 93802008  STS	0x2008,R24
(0075)   check_busy(1);
    00EC E001      LDI	R16,1
    00ED DFB4      RCALL	_check_busy
(0076)   R_command=LCD_ON;                         //打开LCD右半屏的显示
    00EE E38F      LDI	R24,0x3F
    00EF 93802004  STS	0x2004,R24
(0077)   
(0078)   /*设置LCD显示的起始行*/
(0079)   check_busy(0);
    00F1 2700      CLR	R16
    00F2 DFAF      RCALL	_check_busy
(0080)   L_command=LCD_X;                          //LCD左半屏起始行为0
    00F3 EC80      LDI	R24,0xC0
    00F4 93802008  STS	0x2008,R24
(0081)   check_busy(1);
    00F6 E001      LDI	R16,1
    00F7 DFAA      RCALL	_check_busy
(0082)   R_command=LCD_X;                          //LCD右半屏起始行为0
    00F8 EC80      LDI	R24,0xC0
    00F9 93802004  STS	0x2004,R24
    00FB 9508      RET
(0083) }
(0084) 
(0085) void init_devices(void)
(0086) {
(0087)  XMCRA = 0x00;                              //外部存储器控制
_init_devices:
    00FC 2422      CLR	R2
    00FD 9220006D  STS	0x6D,R2
(0088)  XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0);     //外存储高位地址屏蔽,释放端口C
    00FF E087      LDI	R24,7
    0100 9380006C  STS	0x6C,R24
(0089)  port_init();
    0102 DF98      RCALL	_port_init
(0090)  MCUCR = 0x80;                              //外部SRAM使能
    0103 E880      LDI	R24,0x80
    0104 BF85      OUT	0x35,R24
    0105 9508      RET
_write_chineseH:
  i                    --> R20
  datas                --> R22
  y                    --> Y+4
  page                 --> R18
  cs                   --> R16
    0106 940E019E  CALL	push_gset2
    0108 816E      LDD	R22,Y+6
    0109 817F      LDD	R23,Y+7
(0091) }
(0092) 
(0093)  
(0094) /*******************cs为左右屏选,page为页数选择(0~15)********************************
(0095)  *******************y为水平位置选择(0~3),datas指针指向汉字存储的数组地址 ********************/
(0096) 
(0097)  
(0098) void write_chineseH(uchar cs,uchar page,uchar y,const unsigned char *datas) //上半部分显示
(0099) {
(0100)   uchar i;
(0101)   R_command=LCD_PAGE+page;                  //设置LCD右半屏页地址
    010A 2F82      MOV	R24,R18
    010B 5488      SUBI	R24,0x48
    010C 93802004  STS	0x2004,R24
(0102)   L_command=LCD_PAGE+page;                  //设置LCD左半屏页地址
    010E 2F82      MOV	R24,R18
    010F 5488      SUBI	R24,0x48
    0110 93802008  STS	0x2008,R24
(0103)   R_command=LCD_Y+y*16;                     //设置水平显示位置
    0112 E180      LDI	R24,0x10
    0113 800C      LDD	R0,Y+4
    0114 9D80      MUL	R24,R0
    0115 2D80      MOV	R24,R0
    0116 5C80      SUBI	R24,0xC0
    0117 93802004  STS	0x2004,R24
(0104)   L_command=LCD_Y+y*16;
    0119 E180      LDI	R24,0x10
    011A 800C      LDD	R0,Y+4
    011B 9D80      MUL	R24,R0
    011C 2D80      MOV	R24,R0
    011D 5C80      SUBI	R24,0xC0
    011E 93802008  STS	0x2008,R24
(0105)   for(i=0;i<16;i++)
    0120 2744      CLR	R20
    0121 C00E      RJMP	0x0130
(0106)     {
(0107)     if(cs) R_data=*datas;                   //右半屏显示
    0122 2300      TST	R16
    0123 F029      BEQ	0x0129
    0124 01FB      MOVW	R30,R22
    0125 91E4      LPM	R30,0(Z)
    0126 93E02006  STS	0x2006,R30
    0128 C004      RJMP	0x012D
(0108) 	else   L_data=*datas;                   //左半屏显示
    0129 01FB      MOVW	R30,R22
    012A 91E4      LPM	R30,0(Z)
    012B 93E0200A  STS	0x200A,R30
(0109) 	*datas++;
    012D 5F6F      SUBI	R22,0xFF
    012E 4F7F      SBCI	R23,0xFF
    012F 9543      INC	R20
    0130 3140      CPI	R20,0x10
    0131 F380      BCS	0x0122
    0132 940E0192  CALL	pop_gset2
    0134 9508      RET
_write_chineseL:
  i                    --> R20
  datas                --> R22
  y                    --> Y+6
  page                 --> R20
  cs                   --> R10
    0135 940E019C  CALL	push_gset3
    0137 2F42      MOV	R20,R18
    0138 2EA0      MOV	R10,R16
    0139 8568      LDD	R22,Y+8
    013A 8579      LDD	R23,Y+9
(0110)     }
(0111) }
(0112) 
(0113) void write_chineseL(uchar cs,uchar page,uchar y,const unsigned char *datas) //下半部分显示
(0114) {
(0115)  uchar i;
(0116)  check_busy(1);
    013B E001      LDI	R16,1
    013C DF65      RCALL	_check_busy
(0117)  R_command=LCD_PAGE+page;                   //设置LCD右半屏页地址
    013D 2F84      MOV	R24,R20
    013E 5488      SUBI	R24,0x48
    013F 93802004  STS	0x2004,R24
(0118)  L_command=LCD_PAGE+page;                   //设置LCD左半屏页地址
    0141 2F84      MOV	R24,R20
    0142 5488      SUBI	R24,0x48
    0143 93802008  STS	0x2008,R24
(0119)  R_command=LCD_Y+y*16;                      //设置水平显示位置
    0145 E180      LDI	R24,0x10
    0146 800E      LDD	R0,Y+6
    0147 9D80      MUL	R24,R0
    0148 2D80      MOV	R24,R0
    0149 5C80      SUBI	R24,0xC0
    014A 93802004  STS	0x2004,R24
(0120)  L_command=LCD_Y+y*16;
    014C E180      LDI	R24,0x10
    014D 800E      LDD	R0,Y+6
    014E 9D80      MUL	R24,R0
    014F 2D80      MOV	R24,R0
    0150 5C80      SUBI	R24,0xC0
    0151 93802008  STS	0x2008,R24
(0121)  for(i=0;i<16;i++)
    0153 2744      CLR	R20
    0154 C00E      RJMP	0x0163
(0122)   {
(0123)    if(cs) R_data=*datas;                    //右半屏显示
    0155 20AA      TST	R10
    0156 F029      BEQ	0x015C
    0157 01FB      MOVW	R30,R22
    0158 91E4      LPM	R30,0(Z)
    0159 93E02006  STS	0x2006,R30
    015B C004      RJMP	0x0160
(0124)    else   L_data=*datas;                    //左半屏显示
    015C 01FB      MOVW	R30,R22
    015D 91E4      LPM	R30,0(Z)
    015E 93E0200A  STS	0x200A,R30
(0125)    *datas++;
    0160 5F6F      SUBI	R22,0xFF
    0161 4F7F      SBCI	R23,0xFF
    0162 9543      INC	R20
    0163 3140      CPI	R20,0x10
    0164 F380      BCS	0x0155
    0165 940E0195  CALL	pop_gset3
    0167 9508      RET
_main:
    0168 9724      SBIW	R28,4
(0126)   }	
(0127) }
(0128) 
(0129) void main(void)
(0130) {
(0131)   init_devices();
    0169 DF92      RCALL	_init_devices
(0132)   LCD_Clean();
    016A DF48      RCALL	_LCD_Clean
(0133)   LCD_Init();
    016B DF71      RCALL	_LCD_Init
(0134)  write_chineseH(0,0,2,you1);
    016C E584      LDI	R24,0x54
    016D E090      LDI	R25,0
    016E 839B      STD	Y+3,R25
    016F 838A      STD	Y+2,R24
    0170 E082      LDI	R24,2
    0171 8388      STD	Y+0,R24
    0172 2722      CLR	R18
    0173 2700      CLR	R16
    0174 DF91      RCALL	_write_chineseH
(0135)  write_chineseL(0,1,2,you2); 
    0175 E684      LDI	R24,0x64
    0176 E090      LDI	R25,0
    0177 839B      STD	Y+3,R25
    0178 838A      STD	Y+2,R24
    0179 E082      LDI	R24,2
    017A 8388      STD	Y+0,R24
    017B E021      LDI	R18,1
    017C 2700      CLR	R16
    017D DFB7      RCALL	_write_chineseL
(0136)  write_chineseH(1,0,0,hu1);
    017E ED84      LDI	R24,0xD4
    017F E090      LDI	R25,0
    0180 839B      STD	Y+3,R25
    0181 838A      STD	Y+2,R24
    0182 2422      CLR	R2
    0183 8228      STD	Y+0,R2
    0184 2722      CLR	R18
    0185 E001      LDI	R16,1
    0186 DF7F      RCALL	_write_chineseH
(0137)  write_chineseL(1,1,0,hu2);  
FILE: <library>
    0187 EE84      LDI	R24,0xE4
    0188 E090      LDI	R25,0
    0189 839B      STD	Y+3,R25
    018A 838A      STD	Y+2,R24
    018B 2422      CLR	R2
    018C 8228      STD	Y+0,R2
    018D E021      LDI	R18,1
    018E E001      LDI	R16,1
    018F DFA5      RCALL	_write_chineseL
    0190 9624      ADIW	R28,4
    0191 9508      RET
pop_gset2:
    0192 E0E2      LDI	R30,2
    0193 940C01A4  JMP	pop
pop_gset3:
    0195 E0E4      LDI	R30,4
    0196 940C01A4  JMP	pop
push_gset5:
    0198 92FA      ST	R15,-Y
    0199 92EA      ST	R14,-Y
push_gset4:
    019A 92DA      ST	R13,-Y
    019B 92CA      ST	R12,-Y
push_gset3:
    019C 92BA      ST	R11,-Y
    019D 92AA      ST	R10,-Y
push_gset2:
    019E 937A      ST	R23,-Y
    019F 936A      ST	R22,-Y
push_gset1:
    01A0 935A      ST	R21,-Y
    01A1 934A      ST	R20,-Y
    01A2 9508      RET
pop_gset1:
    01A3 E0E1      LDI	R30,1
pop:
    01A4 9149      LD	R20,Y+
    01A5 9159      LD	R21,Y+
    01A6 FDE0      SBRC	R30,0
    01A7 9508      RET
    01A8 9169      LD	R22,Y+
    01A9 9179      LD	R23,Y+
    01AA FDE1      SBRC	R30,1
    01AB 9508      RET
    01AC 90A9      LD	R10,Y+
    01AD 90B9      LD	R11,Y+
    01AE FDE2      SBRC	R30,2
    01AF 9508      RET
    01B0 90C9      LD	R12,Y+
    01B1 90D9      LD	R13,Y+
    01B2 FDE3      SBRC	R30,3
    01B3 9508      RET
    01B4 90E9      LD	R14,Y+
    01B5 90F9      LD	R15,Y+
    01B6 9508      RET

⌨️ 快捷键说明

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