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

📄 avr_ks0108.lst

📁 用avr控制的ks0108型128×64显示程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    022B E5CF      LDI	R28,0x5F
    022C E0D4      LDI	R29,4
    022D BFCD      OUT	0x3D,R28
    022E BFDE      OUT	0x3E,R29
    022F 51C0      SUBI	R28,0x10
    0230 40D0      SBCI	R29,0
    0231 EA0A      LDI	R16,0xAA
    0232 8308      STD	Y+0,R16
    0233 2400      CLR	R0
    0234 E8EF      LDI	R30,0x8F
    0235 E0F0      LDI	R31,0
    0236 E010      LDI	R17,0
    0237 39E3      CPI	R30,0x93
    0238 07F1      CPC	R31,R17
    0239 F011      BEQ	0x023C
    023A 9201      ST	R0,Z+
    023B CFFB      RJMP	0x0237
    023C 8300      STD	Z+0,R16
    023D E2E6      LDI	R30,0x26
    023E E0F4      LDI	R31,4
    023F E6A0      LDI	R26,0x60
    0240 E0B0      LDI	R27,0
    0241 E014      LDI	R17,4
    0242 35E5      CPI	R30,0x55
    0243 07F1      CPC	R31,R17
    0244 F021      BEQ	0x0249
    0245 95C8      LPM
    0246 9631      ADIW	R30,1
    0247 920D      ST	R0,X+
    0248 CFF9      RJMP	0x0242
    0249 940E08F2  CALL	_main
_exit:
    024B CFFF      RJMP	_exit
FILE: E:\dongshanyiyu\12864\AVR_KS0108\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:
    024C 0000      NOP
    024D 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    024E 940E0999  CALL	push_gset2
    0250 01B8      MOVW	R22,R16
(0016)   }
(0017) 
(0018) void delay_nus(unsigned int n)       //N us延时函数
(0019)   {
(0020)    unsigned int i=0;
    0251 2744      CLR	R20
    0252 2755      CLR	R21
(0021)    for (i=0;i<n;i++)
    0253 C003      RJMP	0x0257
(0022)    delay_1us();
    0254 DFF7      RCALL	_delay_1us
    0255 5F4F      SUBI	R20,0xFF
    0256 4F5F      SBCI	R21,0xFF
    0257 1746      CP	R20,R22
    0258 0757      CPC	R21,R23
    0259 F3D0      BCS	0x0254
    025A 940E098A  CALL	pop_gset2
    025C 9508      RET
(0023)   }
(0024)   
(0025) void delay_1ms(void)                 //1ms延时函数
(0026)   {
(0027)    unsigned int i;
(0028)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    025D 2700      CLR	R16
    025E 2711      CLR	R17
    025F C002      RJMP	0x0262
    0260 5F0F      SUBI	R16,0xFF
    0261 4F1F      SBCI	R17,0xFF
    0262 3704      CPI	R16,0x74
    0263 E0E4      LDI	R30,4
    0264 071E      CPC	R17,R30
    0265 F3D0      BCS	0x0260
    0266 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0267 940E0999  CALL	push_gset2
    0269 01B8      MOVW	R22,R16
(0029)   }
(0030)   
(0031) void delay_nms(unsigned int n)       //N ms延时函数
(0032)   {
(0033)    unsigned int i=0;
    026A 2744      CLR	R20
    026B 2755      CLR	R21
(0034)    for (i=0;i<n;i++)
    026C C003      RJMP	0x0270
(0035)    {
(0036)       delay_1ms();
    026D DFEF      RCALL	_delay_1ms
    026E 5F4F      SUBI	R20,0xFF
    026F 4F5F      SBCI	R21,0xFF
    0270 1746      CP	R20,R22
    0271 0757      CPC	R21,R23
    0272 F3D0      BCS	0x026D
    0273 940E098A  CALL	pop_gset2
    0275 9508      RET
FILE: E:\dongshanyiyu\12864\AVR_KS0108\ks0108.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 <iom16v.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_RES_PORT  = &PORTB;
(0036) volatile unsigned char *LCD_EN_PORT  = &PORTB;
(0037) volatile unsigned char *LCD_CS2_PORT = &PORTB;
(0038) volatile unsigned char *LCD_CS1_PORT = &PORTB;
(0039) volatile unsigned char *LCD_RW_PORT  = &PORTB;
(0040) volatile unsigned char *LCD_DI_PORT  = &PORTB;
(0041) 
(0042) char LCD_RES_BIT  = BIT(5);
(0043) char LCD_EN_BIT  = BIT(4);
(0044) char LCD_CS2_BIT = BIT(3);
(0045) char LCD_CS1_BIT = BIT(2);
(0046) char LCD_RW_BIT  = BIT(1);
(0047) char LCD_DI_BIT  = BIT(0);
(0048) 
(0049) #define REST_LCD      	        *LCD_RES_PORT |= LCD_RES_BIT   
(0050) #define SET_LCD_E      	        *LCD_EN_PORT |= LCD_EN_BIT    
(0051) //LCD使能
(0052) #define CLEAR_LCD_E       	    *LCD_EN_PORT &= ~LCD_EN_BIT   
(0053) //LCD禁止
(0054) 
(0055) #define SET_LCD_DATA      	    *LCD_DI_PORT |= LCD_DI_BIT    
(0056) //选择指令端口
(0057) #define SET_LCD_CMD       	    *LCD_DI_PORT &= ~LCD_DI_BIT   
(0058) //选择数据端口
(0059) 
(0060) #define SET_LCD_READ      	    *LCD_RW_PORT |= LCD_RW_BIT    
(0061) //读模式
(0062) #define SET_LCD_WRITE      	    *LCD_RW_PORT &= ~LCD_RW_BIT   
(0063) //写模式
(0064) 
(0065) #define SET_LCD_CS2      	    *LCD_CS2_PORT |= LCD_CS2_BIT  
(0066) //左屏选择禁止
(0067) #define CLEAR_LCD_CS2      	    *LCD_CS2_PORT &= ~LCD_CS2_BIT 
(0068) //左屏选择使能
(0069) 
(0070) #define SET_LCD_CS1      	    *LCD_CS1_PORT |= LCD_CS1_BIT  
(0071) //左屏选择禁止
(0072) #define CLEAR_LCD_CS1      	    *LCD_CS1_PORT &= ~LCD_CS1_BIT 
(0073) //左屏选择使能
(0074) 
(0075) #define LEFT 0
(0076) #define RIGHT 1
(0077) #define CMD 0
(0078) #define DATA 1
(0079) 
(0080) void LCD_BUSY(unsigned char lr) //判断忙标志
(0081) {
(0082) //    unsigned char status;
(0083)     asm("cli");
_LCD_BUSY:
  lr                   --> R16
    0276 94F8      BCLR	7
(0084)     if(lr==LEFT)
    0277 2300      TST	R16
    0278 F4A1      BNE	0x028D
(0085)     {
(0086)         CLEAR_LCD_CS2; //cs2=0
    0279 90200074  LDS	R2,LCD_CS2_BIT
    027B 9420      COM	R2
    027C 91E0006A  LDS	R30,LCD_CS2_PORT
    027E 91F0006B  LDS	R31,LCD_CS2_PORT+1
    0280 8030      LDD	R3,Z+0
    0281 2032      AND	R3,R2
    0282 8230      STD	Z+0,R3
(0087)         SET_LCD_CS1;   //cs1=1
    0283 90200075  LDS	R2,LCD_CS1_BIT
    0285 91E0006C  LDS	R30,LCD_CS1_PORT
    0287 91F0006D  LDS	R31,LCD_CS1_PORT+1
    0289 8030      LDD	R3,Z+0
    028A 2832      OR	R3,R2
    028B 8230      STD	Z+0,R3
(0088)     }
    028C C013      RJMP	0x02A0
(0089)     else
(0090)     {
(0091)         SET_LCD_CS2;   //cs2=1
    028D 90200074  LDS	R2,LCD_CS2_BIT
    028F 91E0006A  LDS	R30,LCD_CS2_PORT
    0291 91F0006B  LDS	R31,LCD_CS2_PORT+1
    0293 8030      LDD	R3,Z+0
    0294 2832      OR	R3,R2
    0295 8230      STD	Z+0,R3
(0092)         CLEAR_LCD_CS1; //cs1=0
    0296 90200075  LDS	R2,LCD_CS1_BIT
    0298 9420      COM	R2
    0299 91E0006C  LDS	R30,LCD_CS1_PORT
    029B 91F0006D  LDS	R31,LCD_CS1_PORT+1
    029D 8030      LDD	R3,Z+0
    029E 2032      AND	R3,R2
    029F 8230      STD	Z+0,R3
(0093)     }	
(0094)     SET_LCD_CMD;
    02A0 90200077  LDS	R2,LCD_DI_BIT
    02A2 9420      COM	R2
    02A3 91E00070  LDS	R30,LCD_DI_PORT
    02A5 91F00071  LDS	R31,LCD_DI_PORT+1
    02A7 8030      LDD	R3,Z+0
    02A8 2032      AND	R3,R2
    02A9 8230      STD	Z+0,R3
(0095)     *LCD_DIR_PORT = 0x00;
    02AA 2422      CLR	R2
    02AB 91E00060  LDS	R30,LCD_DIR_PORT
    02AD 91F00061  LDS	R31,LCD_DIR_PORT+1
    02AF 8220      STD	Z+0,R2
(0096)     *LCD_OP_PORT = 0xff;		
    02B0 EF8F      LDI	R24,0xFF
    02B1 91E00064  LDS	R30,LCD_OP_PORT
    02B3 91F00065  LDS	R31,LCD_OP_PORT+1
    02B5 8380      STD	Z+0,R24
(0097)     SET_LCD_READ;
    02B6 90200076  LDS	R2,LCD_RW_BIT
    02B8 91E0006E  LDS	R30,LCD_RW_PORT
    02BA 91F0006F  LDS	R31,LCD_RW_PORT+1
    02BC 8030      LDD	R3,Z+0
    02BD 2832      OR	R3,R2
    02BE 8230      STD	Z+0,R3
(0098)     SET_LCD_E;					
    02BF 90200073  LDS	R2,LCD_EN_BIT
    02C1 91E00068  LDS	R30,LCD_EN_PORT
    02C3 91F00069  LDS	R31,LCD_EN_PORT+1
    02C5 8030      LDD	R3,Z+0
    02C6 2832      OR	R3,R2
    02C7 8230      STD	Z+0,R3
(0099)     asm("nop");	
    02C8 0000      NOP
(0100)     asm("nop");
    02C9 0000      NOP
(0101)     asm("nop");
    02CA 0000      NOP
(0102)     asm("nop");
    02CB 0000      NOP
    02CC C01B      RJMP	0x02E8
(0103)     while((*LCD_IP_PORT) & LCD_STATUS_BUSY)
(0104)     {
(0105)         CLEAR_LCD_E;	   		
    02CD 90200073  LDS	R2,LCD_EN_BIT
    02CF 9420      COM	R2
    02D0 91E00068  LDS	R30,LCD_EN_PORT
    02D2 91F00069  LDS	R31,LCD_EN_PORT+1
    02D4 8030      LDD	R3,Z+0
    02D5 2032      AND	R3,R2
    02D6 8230      STD	Z+0,R3
(0106)         asm("nop");
    02D7 0000      NOP
(0107)         asm("nop");
    02D8 0000      NOP
(0108)         asm("nop");
    02D9 0000      NOP
(0109)         asm("nop");
    02DA 0000      NOP
(0110)         SET_LCD_E;
    02DB 90200073  LDS	R2,LCD_EN_BIT
    02DD 91E00068  LDS	R30,LCD_EN_PORT
    02DF 91F00069  LDS	R31,LCD_EN_PORT+1
    02E1 8030      LDD	R3,Z+0
    02E2 2832      OR	R3,R2
    02E3 8230      STD	Z+0,R3
(0111)         asm("nop");
    02E4 0000      NOP
(0112)         asm("nop");
    02E5 0000      NOP
(0113)         asm("nop");
    02E6 0000      NOP
(0114)         asm("nop");
    02E7 0000      NOP
    02E8 91E00062  LDS	R30,LCD_IP_PORT
    02EA 91F00063  LDS	R31,LCD_IP_PORT+1
    02EC 8020      LDD	R2,Z+0
    02ED FC27      SBRC	R2,7
    02EE CFDE      RJMP	0x02CD
(0115)     }
(0116)     CLEAR_LCD_E;
    02EF 90200073  LDS	R2,LCD_EN_BIT
    02F1 9420      COM	R2
    02F2 91E00068  LDS	R30,LCD_EN_PORT
    02F4 91F00069  LDS	R31,LCD_EN_PORT+1
    02F6 8030      LDD	R3,Z+0
    02F7 2032      AND	R3,R2
    02F8 8230      STD	Z+0,R3
(0117)     SET_LCD_WRITE;
    02F9 90200076  LDS	R2,LCD_RW_BIT
    02FB 9420      COM	R2
    02FC 91E0006E  LDS	R30,LCD_RW_PORT
    02FE 91F0006F  LDS	R31,LCD_RW_PORT+1
    0300 8030      LDD	R3,Z+0
    0301 2032      AND	R3,R2
    0302 8230      STD	Z+0,R3
(0118)     *LCD_OP_PORT = 0xff;
    0303 EF8F      LDI	R24,0xFF
    0304 91E00064  LDS	R30,LCD_OP_PORT
    0306 91F00065  LDS	R31,LCD_OP_PORT+1
    0308 8380      STD	Z+0,R24
(0119)     asm("sei");//)asm("sei");
    0309 9478      BSET	7
    030A 9508      RET
_write_LCD:
  data                 --> Y+4
  cd                   --> R20
  lr                   --> R22
    030B 940E0999  CALL	push_gset2
    030D 2F42      MOV	R20,R18
    030E 2F60      MOV	R22,R16
(0120) }
(0121) 
(0122) void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) /*写入指令或数据*/
(0123) {	
(0124)     asm("cli");//)asm("cli");
    030F 94F8      BCLR	7
(0125)     LCD_BUSY(lr);
    0310 2F06      MOV	R16,R22
    0311 DF64      RCALL	_LCD_BUSY
(0126)     if(cd==CMD)
    0312 2344      TST	R20
    0313 F459      BNE	0x031F
(0127)     {
(0128)         SET_LCD_CMD;
    0314 90200077  LDS	R2,LCD_DI_BIT
    0316 9420      COM	R2
    0317 91E00070  LDS	R30,LCD_DI_PORT
    0319 91F00071  LDS	R31,LCD_DI_PORT+1
    031B 8030      LDD	R3,Z+0
    031C 2032      AND	R3,R2
    031D 8230      STD	Z+0,R3
(0129)     }
    031E C009      RJMP	0x0328
(0130)     else
(0131)     {
(0132)         SET_LCD_DATA;
    031F 90200077  LDS	R2,LCD_DI_BIT
    0321 91E00070  LDS	R30,LCD_DI_PORT
    0323 91F00071  LDS	R31,LCD_DI_PORT+1
    0325 8030      LDD	R3,Z+0
    0326 2832      OR	R3,R2
    0327 8230      STD	Z+0,R3
(0133)     }
(0134)     SET_LCD_WRITE; 
    0328 90200076  LDS	R2,LCD_RW_BIT
    032A 9420      COM	R2
    032B 91E0006E  LDS	R30,LCD_RW_PORT
    032D 91F0006F  LDS	R31,LCD_RW_PORT+1
    032F 8030      LDD	R3,Z+0
    0330 2032      AND	R3,R2
    0331 8230      STD	Z+0,R3
(0135)     SET_LCD_E;

⌨️ 快捷键说明

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