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

📄 mega32-lcm.lst

📁 proteus实例集锦
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0246 E5CF      LDI	R28,0x5F
    0247 E0D8      LDI	R29,0x8
    0248 BFCD      OUT	0x3D,R28
    0249 BFDE      OUT	0x3E,R29
    024A 51C0      SUBI	R28,0x10
    024B 40D0      SBCI	R29,0
    024C EA0A      LDI	R16,0xAA
    024D 8308      STD	Y+0,R16
    024E 2400      CLR	R0
    024F ECE5      LDI	R30,0xC5
    0250 E0F0      LDI	R31,0
    0251 E010      LDI	R17,0
    0252 3CE9      CPI	R30,0xC9
    0253 07F1      CPC	R31,R17
    0254 F011      BEQ	0x0257
    0255 9201      ST	R0,Z+
    0256 CFFB      RJMP	0x0252
    0257 8300      STD	Z+0,R16
    0258 E2E6      LDI	R30,0x26
    0259 E0F4      LDI	R31,4
    025A E6A0      LDI	R26,0x60
    025B E0B0      LDI	R27,0
    025C E014      LDI	R17,4
    025D 38EB      CPI	R30,0x8B
    025E 07F1      CPC	R31,R17
    025F F021      BEQ	0x0264
    0260 95C8      LPM
    0261 9631      ADIW	R30,1
    0262 920D      ST	R0,X+
    0263 CFF9      RJMP	0x025D
    0264 940E0900  CALL	_main
_exit:
    0266 CFFF      RJMP	_exit
FILE: E:\PROTEU~1.7\User\MEGA32-LCM\MEGA32-LCM\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 系统时钟:8M
(0004) -----------------------------------------------------------------------*/
(0005) 
(0006)  void delay_1us(void);                 //1us延时函数
(0007)  void delay_nus(unsigned int n);       //N us延时函数
(0008)  void delay_1ms(void) ;                //1ms延时函数
(0009)  void delay_nms(unsigned int n) ;      //N ms延时函数
(0010)  
(0011)  /***********************************************************************/
(0012)  /**********************************************************************/
(0013) void delay_1us(void)                 //1us延时函数
(0014)   {
(0015)    asm("nop");
_delay_1us:
    0267 0000      NOP
(0016)   }
    0268 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0269 940E09DB  CALL	push_gset2
    026B 01B8      MOVW	R22,R16
(0017) 
(0018) void delay_nus(unsigned int n)       //N us延时函数
(0019)   {
(0020)    unsigned int i=0;
    026C 2744      CLR	R20
    026D 2755      CLR	R21
(0021)    for (i=0;i<n;i++)
    026E C003      RJMP	0x0272
(0022)    delay_1us();
    026F DFF7      RCALL	_delay_1us
    0270 5F4F      SUBI	R20,0xFF
    0271 4F5F      SBCI	R21,0xFF
    0272 1746      CP	R20,R22
    0273 0757      CPC	R21,R23
    0274 F3D0      BCS	0x026F
(0023)   }
    0275 940E09BB  CALL	pop_gset2
    0277 9508      RET
(0024)   
(0025) void delay_1ms(void)                 //1ms延时函数
(0026)   {
(0027)    unsigned int i;
(0028)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    0278 2700      CLR	R16
    0279 2711      CLR	R17
    027A C002      RJMP	0x027D
    027B 5F0F      SUBI	R16,0xFF
    027C 4F1F      SBCI	R17,0xFF
    027D 3704      CPI	R16,0x74
    027E E0E4      LDI	R30,4
    027F 071E      CPC	R17,R30
    0280 F3D0      BCS	0x027B
(0029)   }
    0281 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0282 940E09DB  CALL	push_gset2
    0284 01B8      MOVW	R22,R16
(0030)   
(0031) void delay_nms(unsigned int n)       //N ms延时函数
(0032)   {
(0033)    unsigned int i=0;
    0285 2744      CLR	R20
    0286 2755      CLR	R21
(0034)    for (i=0;i<n;i++)
    0287 C003      RJMP	0x028B
(0035)    {
(0036)       delay_1ms();
    0288 DFEF      RCALL	_delay_1ms
    0289 5F4F      SUBI	R20,0xFF
    028A 4F5F      SBCI	R21,0xFF
    028B 1746      CP	R20,R22
    028C 0757      CPC	R21,R23
    028D F3D0      BCS	0x0288
(0037)    }   
(0038)   }
    028E 940E09BB  CALL	pop_gset2
    0290 9508      RET
FILE: E:\PROTEU~1.7\User\MEGA32-LCM\MEGA32-LCM\DISPLAY.C
(0001) /*
(0002) KS0108 128*64 LCD C语言驱动
(0003) LCD引脚定义
(0004) 1---GND 
(0005) 2---VCC
(0006) 3---VLCD
(0007) 4---D/I
(0008) 5---R/W
(0009) 6---E
(0010) 7到14 D0-D7
(0011) 15--CS1
(0012) 16--CS2
(0013) 17--RESET
(0014) 18--VEE
(0015) 19--SW
(0016) 20--NC 
(0017) */
(0018) #include <iom32v.h>
(0019) #include <macros.h>
(0020) #include "delay.h"
(0021) unsigned char CurOffset,CurRow,CurPage,CurCol;	
(0022) #define uchar unsigned char
(0023) /*  常量定义  */
(0024) #define  LCD_STATUS_BUSY 0x80
(0025) #define  START_LINE0   0xc0
(0026) #define  DISPLAY_ON    0x3f
(0027) #define  DISPLAY_OFF   0x3e
(0028) #define  PARA1         0x40
(0029) //#define  BIT(x)  (1<<x)
(0030) //PORTA---数据口  PORTB----控制口
(0031) volatile unsigned char *LCD_DIR_PORT = &DDRA;
(0032) volatile unsigned char *LCD_IP_PORT  = &PINA;
(0033) volatile unsigned char *LCD_OP_PORT  = &PORTA;
(0034) 
(0035) volatile unsigned char *LCD_EN_PORT  = &PORTB;
(0036) volatile unsigned char *LCD_CS2_PORT = &PORTC;
(0037) volatile unsigned char *LCD_CS1_PORT = &PORTC;
(0038) volatile unsigned char *LCD_RW_PORT  = &PORTC;
(0039) volatile unsigned char *LCD_DI_PORT  = &PORTC;
(0040) 
(0041) char LCD_EN_BIT  = BIT(4);
(0042) char LCD_CS2_BIT = BIT(3);
(0043) char LCD_CS1_BIT = BIT(2);
(0044) char LCD_RW_BIT  = BIT(5);
(0045) char LCD_DI_BIT  = BIT(4);
(0046) 
(0047) #define SET_LCD_E      	        *LCD_EN_PORT |= LCD_EN_BIT    //LCD使能
(0048) #define CLEAR_LCD_E       	    *LCD_EN_PORT &= ~LCD_EN_BIT   //LCD禁止
(0049) 
(0050) #define SET_LCD_DATA      	    *LCD_DI_PORT |= LCD_DI_BIT    //选择指令端口
(0051) #define SET_LCD_CMD       	    *LCD_DI_PORT &= ~LCD_DI_BIT   //选择数据端口
(0052) 
(0053) #define SET_LCD_READ      	    *LCD_RW_PORT |= LCD_RW_BIT    //读模式
(0054) #define SET_LCD_WRITE      	    *LCD_RW_PORT &= ~LCD_RW_BIT   //写模式
(0055) 
(0056) #define SET_LCD_CS2      	    *LCD_CS2_PORT |= LCD_CS2_BIT  //左屏选择禁止
(0057) #define CLEAR_LCD_CS2      	    *LCD_CS2_PORT &= ~LCD_CS2_BIT //左屏选择使能
(0058) 
(0059) #define SET_LCD_CS1      	    *LCD_CS1_PORT |= LCD_CS1_BIT  //左屏选择禁止
(0060) #define CLEAR_LCD_CS1      	    *LCD_CS1_PORT &= ~LCD_CS1_BIT //左屏选择使能
(0061) 
(0062) #define LEFT 0
(0063) #define RIGHT 1
(0064) #define CMD 0
(0065) #define DATA 1
(0066) 
(0067) void LCD_BUSY(unsigned char lr) //判断忙标志
(0068) {
(0069)     unsigned char status;
(0070)     _CLI();
_LCD_BUSY:
  status               --> Y+1
  lr                   --> R16
    0291 94F8      BCLR	7
(0071)     if(lr==LEFT)
    0292 2300      TST	R16
    0293 F4A1      BNE	0x02A8
(0072)     {
(0073)         CLEAR_LCD_CS2; //cs2=0
    0294 90200071  LDS	R2,0x71
    0296 9420      COM	R2
    0297 91E00068  LDS	R30,0x68
    0299 91F00069  LDS	R31,0x69
    029B 8030      LDD	R3,Z+0
    029C 2032      AND	R3,R2
    029D 8230      STD	Z+0,R3
(0074)         SET_LCD_CS1;   //cs1=1
    029E 90200072  LDS	R2,0x72
    02A0 91E0006A  LDS	R30,0x6A
    02A2 91F0006B  LDS	R31,0x6B
    02A4 8030      LDD	R3,Z+0
    02A5 2832      OR	R3,R2
    02A6 8230      STD	Z+0,R3
(0075)     }
    02A7 C013      RJMP	0x02BB
(0076)     else
(0077)     {
(0078)         SET_LCD_CS2;   //cs2=1
    02A8 90200071  LDS	R2,0x71
    02AA 91E00068  LDS	R30,0x68
    02AC 91F00069  LDS	R31,0x69
    02AE 8030      LDD	R3,Z+0
    02AF 2832      OR	R3,R2
    02B0 8230      STD	Z+0,R3
(0079)         CLEAR_LCD_CS1; //cs1=0
    02B1 90200072  LDS	R2,0x72
    02B3 9420      COM	R2
    02B4 91E0006A  LDS	R30,0x6A
    02B6 91F0006B  LDS	R31,0x6B
    02B8 8030      LDD	R3,Z+0
    02B9 2032      AND	R3,R2
    02BA 8230      STD	Z+0,R3
(0080)     }	
(0081)     SET_LCD_CMD;
    02BB 90200074  LDS	R2,0x74
    02BD 9420      COM	R2
    02BE 91E0006E  LDS	R30,0x6E
    02C0 91F0006F  LDS	R31,0x6F
    02C2 8030      LDD	R3,Z+0
    02C3 2032      AND	R3,R2
    02C4 8230      STD	Z+0,R3
(0082)     *LCD_DIR_PORT = 0x00;
    02C5 2422      CLR	R2
    02C6 91E00060  LDS	R30,0x60
    02C8 91F00061  LDS	R31,0x61
    02CA 8220      STD	Z+0,R2
(0083)     *LCD_OP_PORT = 0xff;		
    02CB EF8F      LDI	R24,0xFF
    02CC 91E00064  LDS	R30,0x64
    02CE 91F00065  LDS	R31,0x65
    02D0 8380      STD	Z+0,R24
(0084)     SET_LCD_READ;
    02D1 90200073  LDS	R2,0x73
    02D3 91E0006C  LDS	R30,0x6C
    02D5 91F0006D  LDS	R31,0x6D
    02D7 8030      LDD	R3,Z+0
    02D8 2832      OR	R3,R2
    02D9 8230      STD	Z+0,R3
(0085)     SET_LCD_E;					
    02DA 90200070  LDS	R2,0x70
    02DC 91E00066  LDS	R30,0x66
    02DE 91F00067  LDS	R31,0x67
    02E0 8030      LDD	R3,Z+0
    02E1 2832      OR	R3,R2
    02E2 8230      STD	Z+0,R3
(0086)     _NOP();	
    02E3 0000      NOP
(0087)     _NOP();
    02E4 0000      NOP
(0088)     _NOP();
    02E5 0000      NOP
(0089)     _NOP();
    02E6 0000      NOP
    02E7 C016      RJMP	0x02FE
(0090)     while((*LCD_IP_PORT) & LCD_STATUS_BUSY)
(0091)     {
(0092)         CLEAR_LCD_E;	   		
    02E8 90200070  LDS	R2,0x70
    02EA 9420      COM	R2
    02EB 91E00066  LDS	R30,0x66
    02ED 91F00067  LDS	R31,0x67
    02EF 8030      LDD	R3,Z+0
    02F0 2032      AND	R3,R2
    02F1 8230      STD	Z+0,R3
(0093)         _NOP();
    02F2 0000      NOP
(0094)         _NOP();
    02F3 0000      NOP
(0095)         _NOP();
    02F4 0000      NOP
(0096)         _NOP();
    02F5 0000      NOP
(0097)         SET_LCD_E;
    02F6 90200070  LDS	R2,0x70
    02F8 2832      OR	R3,R2
    02F9 8230      STD	Z+0,R3
(0098)         _NOP();
    02FA 0000      NOP
(0099)         _NOP();
    02FB 0000      NOP
(0100)         _NOP();
    02FC 0000      NOP
(0101)         _NOP();
    02FD 0000      NOP
    02FE 91E00062  LDS	R30,0x62
    0300 91F00063  LDS	R31,0x63
    0302 8020      LDD	R2,Z+0
    0303 FC27      SBRC	R2,7
    0304 CFE3      RJMP	0x02E8
(0102)     }
(0103)     CLEAR_LCD_E;
    0305 90200070  LDS	R2,0x70
    0307 9420      COM	R2
    0308 91E00066  LDS	R30,0x66
    030A 91F00067  LDS	R31,0x67
    030C 8030      LDD	R3,Z+0
    030D 2032      AND	R3,R2
    030E 8230      STD	Z+0,R3
(0104)     SET_LCD_WRITE;
    030F 90200073  LDS	R2,0x73
    0311 9420      COM	R2
    0312 91E0006C  LDS	R30,0x6C
    0314 91F0006D  LDS	R31,0x6D
    0316 8030      LDD	R3,Z+0
    0317 2032      AND	R3,R2
    0318 8230      STD	Z+0,R3
(0105)     *LCD_OP_PORT = 0xff;
    0319 EF8F      LDI	R24,0xFF
    031A 91E00064  LDS	R30,0x64
    031C 91F00065  LDS	R31,0x65
    031E 8380      STD	Z+0,R24
(0106)     asm("sei");//)asm("sei");
    031F 9478      BSET	7
(0107) }
    0320 9508      RET
_write_LCD:
  data                 --> Y+4
  cd                   --> R20
  lr                   --> R22
    0321 940E09DB  CALL	push_gset2
    0323 2F42      MOV	R20,R18
    0324 2F60      MOV	R22,R16
(0108) 
(0109) void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) /*写入指令或数据*/
(0110) {	
(0111)     _CLI();//_CLI();
    0325 94F8      BCLR	7
(0112)     LCD_BUSY(lr);
    0326 2F06      MOV	R16,R22
    0327 DF69      RCALL	_LCD_BUSY
(0113)     if(cd==CMD)
    0328 2344      TST	R20
    0329 F459      BNE	0x0335
(0114)     {
(0115)         SET_LCD_CMD;
    032A 90200074  LDS	R2,0x74
    032C 9420      COM	R2
    032D 91E0006E  LDS	R30,0x6E
    032F 91F0006F  LDS	R31,0x6F
    0331 8030      LDD	R3,Z+0
    0332 2032      AND	R3,R2
    0333 8230      STD	Z+0,R3
(0116)     }
    0334 C009      RJMP	0x033E
(0117)     else
(0118)     {
(0119)         SET_LCD_DATA;
    0335 90200074  LDS	R2,0x74
    0337 91E0006E  LDS	R30,0x6E
    0339 91F0006F  LDS	R31,0x6F
    033B 8030      LDD	R3,Z+0
    033C 2832      OR	R3,R2
    033D 8230      STD	Z+0,R3
(0120)     }
(0121)     SET_LCD_WRITE; 
    033E 90200073  LDS	R2,0x73
    0340 9420      COM	R2
    0341 91E0006C  LDS	R30,0x6C
    0343 91F0006D  LDS	R31,0x6D
    0345 8030      LDD	R3,Z+0
    0346 2032      AND	R3,R2
    0347 8230      STD	Z+0,R3
(0122)     SET_LCD_E;
    0348 90200070  LDS	R2,0x70
    034A 91E00066  LDS	R30,0x66
    034C 91F00067  LDS	R31,0x67
    034E 8030      LDD	R3,Z+0
    034F 2832      OR	R3,R2
    0350 8230      STD	Z+0,R3
(0123)     *LCD_DIR_PORT = 0xff;
    0351 EF8F      LDI	R24,0xFF
    0352 91E00060  LDS	R30,0x60
    0354 91F00061  LDS	R31,0x61
    0356 8380      STD	Z+0,R24
(0124)     *LCD_OP_PORT = data;
    0357 91E00064  LDS	R30,0x64
    0359 91F00065  LDS	R31,0x65
    035B 800C      LDD	R0,Y+4
    035C 8200      STD	Z+0,R0
(0125)     _NOP();
    035D 0000      NOP

⌨️ 快捷键说明

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