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

📄 ks0108.lst

📁 AVR(ATmega16)的LCD_KS0108控制器的驱动程序。
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0B1A E5CF      LDI	R28,0x5F
    0B1B E0D4      LDI	R29,4
    0B1C BFCD      OUT	0x3D,R28
    0B1D BFDE      OUT	0x3E,R29
    0B1E 51CE      SUBI	R28,0x1E
    0B1F 40D0      SBCI	R29,0
    0B20 EA0A      LDI	R16,0xAA
    0B21 8308      STD	Y+0,R16
    0B22 2400      CLR	R0
    0B23 E6E0      LDI	R30,0x60
    0B24 E0F0      LDI	R31,0
    0B25 E010      LDI	R17,0
    0B26 36E0      CPI	R30,0x60
    0B27 07F1      CPC	R31,R17
    0B28 F011      BEQ	0x0B2B
    0B29 9201      ST	R0,Z+
    0B2A CFFB      RJMP	0x0B26
    0B2B 8300      STD	Z+0,R16
    0B2C E3E4      LDI	R30,0x34
    0B2D E1F6      LDI	R31,0x16
    0B2E E6A0      LDI	R26,0x60
    0B2F E0B0      LDI	R27,0
    0B30 E116      LDI	R17,0x16
    0B31 33E4      CPI	R30,0x34
    0B32 07F1      CPC	R31,R17
    0B33 F021      BEQ	0x0B38
    0B34 95C8      LPM
    0B35 9631      ADIW	R30,1
    0B36 920D      ST	R0,X+
    0B37 CFF9      RJMP	0x0B31
    0B38 940E0C53  CALL	_main
_exit:
    0B3A CFFF      RJMP	_exit
FILE: D:\PROGRA~1\AVRTOO~1\Icc\include\delay.h
(0001) void delay_1us(void)                 //1us延时函数 
(0002)   { 
(0003)    asm("nop"); 
_delay_1us:
    0B3B 0000      NOP
    0B3C 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0B3D 940E0C82  CALL	push_gset2
    0B3F 01B8      MOVW	R22,R16
(0004)   } 
(0005) 
(0006) void delay_nus(unsigned int n)       //N us延时函数 
(0007)   { 
(0008)    unsigned int i=0; 
    0B40 2744      CLR	R20
    0B41 2755      CLR	R21
(0009)    for (i=0;i<n;i++) 
    0B42 C003      RJMP	0x0B46
(0010)    delay_1us(); 
    0B43 DFF7      RCALL	_delay_1us
    0B44 5F4F      SUBI	R20,0xFF
    0B45 4F5F      SBCI	R21,0xFF
    0B46 1746      CP	R20,R22
    0B47 0757      CPC	R21,R23
    0B48 F3D0      BCS	0x0B43
    0B49 940E0C73  CALL	pop_gset2
    0B4B 9508      RET
(0011)   } 
(0012)    
(0013) void delay_1ms(void)                 //1ms延时函数 
(0014)   { 
(0015)    unsigned int i; 
(0016)    for (i=0;i<1140;i++); 
_delay_1ms:
  i                    --> R16
    0B4C 2700      CLR	R16
    0B4D 2711      CLR	R17
    0B4E C002      RJMP	0x0B51
    0B4F 5F0F      SUBI	R16,0xFF
    0B50 4F1F      SBCI	R17,0xFF
    0B51 3704      CPI	R16,0x74
    0B52 E0E4      LDI	R30,4
    0B53 071E      CPC	R17,R30
    0B54 F3D0      BCS	0x0B4F
    0B55 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0B56 940E0C82  CALL	push_gset2
    0B58 01B8      MOVW	R22,R16
(0017)   } 
(0018)    
(0019) void delay_nms(unsigned int n)       //N ms延时函数 
(0020)   { 
(0021)    unsigned int i=0; 
    0B59 2744      CLR	R20
    0B5A 2755      CLR	R21
(0022)    for (i=0;i<n;i++) 
    0B5B C003      RJMP	0x0B5F
(0023)    delay_1ms(); 
    0B5C DFEF      RCALL	_delay_1ms
    0B5D 5F4F      SUBI	R20,0xFF
    0B5E 4F5F      SBCI	R21,0xFF
    0B5F 1746      CP	R20,R22
    0B60 0757      CPC	R21,R23
    0B61 F3D0      BCS	0x0B5C
    0B62 940E0C73  CALL	pop_gset2
    0B64 9508      RET
_LCD_WriteC:
  cmd                  --> R20
    0B65 940E0C84  CALL	push_gset1
    0B67 2F40      MOV	R20,R16
FILE: C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\LCD_KS0108\LCD.h
(0001) /*-----------------------------------------------------
(0002)  显示开/关:    0x3E:Off,0x3F:On
(0003)  设置列(y)地址: 0x40+y,y:0-63
(0004)  设置页(x)地址: 0xB8+x,x:0-7
(0005)  设置起始行:    0xC0+l,l:0-63
(0006)  写显示数据:    0x**
(0007)   DI  R/W    Function
(0008)   0    0      写指令
(0009)   1    0      写数据
(0010)  引脚连接:
(0011)    CS1:PA0
(0012)    CS2:PA1
(0013)    DI: PA2
(0014)    RW: PA3
(0015)    E:  PA4
(0016)    DB0-DB7:PB0-PB7
(0017)  ------------------------------------------------------*/
(0018)  
(0019)  #define uchar unsigned char
(0020)  #define uint  unsigned int 
(0021)  
(0022)  #define L  0x10
(0023)  #define R  0x20
(0024)  #define LR 0x30
(0025)  
(0026)  #define CS1_PORT PORTA
(0027)  #define CS2_PORT PORTA
(0028)  #define DI_PORT  PORTA
(0029)  #define RW_PORT  PORTA
(0030)  #define E_PORT  PORTA
(0031)  
(0032)  #define CS1_DDR DDRA
(0033)  #define CS2_DDR DDRA
(0034)  #define RW_DDR  DDRA
(0035)  #define E_DDR  DDRA
(0036)  #define DI_DDR  DDRA
(0037)  
(0038)  #define DATA_PORT PORTB
(0039)  #define DATA_DDR  DDRB
(0040)  #define DATA_IN   PINB
(0041)  
(0042)  #define LCD_DI   (1<<PA2)
(0043)  #define LCD_CS1  (1<<PA0)
(0044)  #define LCD_CS2  (1<<PA1)
(0045)  #define LCD_RW   (1<<PA3)
(0046)  #define LCD_E   (1<<PA4)
(0047)  #define LCD_DATA_OUT  0xff
(0048)  #define LCD_DATA_IN   0x00
(0049)  
(0050)  #define Set_RW_0  RW_PORT&=~LCD_RW
(0051)  #define Set_RW_1  RW_PORT|=LCD_RW
(0052)  #define Set_E_0  E_PORT&=~LCD_E
(0053)  #define Set_E_1  E_PORT|=LCD_E
(0054)  #define Set_DI_I  DI_PORT&=~LCD_DI   //instruction
(0055)  #define Set_DI_D  DI_PORT|=LCD_DI    //data
(0056)  #define Set_CS1_0  CS1_PORT&=~LCD_CS1
(0057)  #define Set_CS1_1  CS1_PORT|=LCD_CS1
(0058)  #define Set_CS2_0  CS2_PORT&=~LCD_CS2
(0059)  #define Set_CS2_1  CS2_PORT|=LCD_CS2
(0060)  
(0061)  void LCD_WriteC(uchar cmd)
(0062) {Set_RW_0;
    0B68 98DB      CBI	0x1B,3
(0063)  Set_DI_I;
    0B69 98DA      CBI	0x1B,2
(0064)  Set_E_0;
    0B6A 98DC      CBI	0x1B,4
(0065)  DATA_PORT=cmd;
    0B6B BB48      OUT	0x18,R20
(0066)  Set_E_1;
    0B6C 9ADC      SBI	0x1B,4
(0067)  delay_nus(1);
    0B6D E001      LDI	R16,1
    0B6E E010      LDI	R17,0
    0B6F DFCD      RCALL	_delay_nus
(0068)  Set_E_0;
    0B70 98DC      CBI	0x1B,4
(0069)  delay_nus(20);
    0B71 E104      LDI	R16,0x14
    0B72 E010      LDI	R17,0
    0B73 DFC9      RCALL	_delay_nus
    0B74 940E0C87  CALL	pop_gset1
    0B76 9508      RET
_LCD_WriteD:
  data                 --> R20
    0B77 940E0C84  CALL	push_gset1
    0B79 2F40      MOV	R20,R16
(0070) }
(0071)  void LCD_WriteD(uchar data)
(0072) {Set_RW_0;
    0B7A 98DB      CBI	0x1B,3
(0073)  Set_DI_D;
    0B7B 9ADA      SBI	0x1B,2
(0074)  Set_E_0;
    0B7C 98DC      CBI	0x1B,4
(0075)  DATA_PORT=data;
    0B7D BB48      OUT	0x18,R20
(0076)  Set_E_1;
    0B7E 9ADC      SBI	0x1B,4
(0077)  delay_nus(1);
    0B7F E001      LDI	R16,1
    0B80 E010      LDI	R17,0
    0B81 DFBB      RCALL	_delay_nus
(0078)  Set_E_0;
    0B82 98DC      CBI	0x1B,4
(0079)  delay_nus(20);
    0B83 E104      LDI	R16,0x14
    0B84 E010      LDI	R17,0
    0B85 DFB7      RCALL	_delay_nus
    0B86 940E0C87  CALL	pop_gset1
    0B88 9508      RET
_Set_XY:
  y                    --> R20
  x                    --> R22
    0B89 940E0C82  CALL	push_gset2
    0B8B 2F42      MOV	R20,R18
    0B8C 2F60      MOV	R22,R16
(0080) }
(0081)  /*------------------------------------
(0082)  设置显示位置坐标
(0083)  x:页地址:0-7 :0xB8+x
(0084)  y:列地址:0-63:0x40+y
(0085)  -------------------------------------*/
(0086)  void Set_XY(uchar x,uchar y)
(0087)  {x+=0xB8;
    0B8D 5468      SUBI	R22,0x48
(0088)   y+=0x40;
    0B8E 5C40      SUBI	R20,0xC0
(0089)   LCD_WriteC(x);
    0B8F 2F06      MOV	R16,R22
    0B90 DFD4      RCALL	_LCD_WriteC
(0090)   LCD_WriteC(y);
    0B91 2F04      MOV	R16,R20
    0B92 DFD2      RCALL	_LCD_WriteC
    0B93 940E0C73  CALL	pop_gset2
    0B95 9508      RET
_Set_Startline:
  i                    --> R20
    0B96 940E0C84  CALL	push_gset1
    0B98 2F40      MOV	R20,R16
(0091)  }
(0092)  /*-------------------------------------
(0093)   设置起始行 0xC0+i,i:0-63
(0094)   -------------------------------------*/
(0095)  void Set_Startline(uchar i)
(0096)  {
(0097)   LCD_WriteC(i+0xC0);
    0B99 2F04      MOV	R16,R20
    0B9A 5400      SUBI	R16,0x40
    0B9B DFC9      RCALL	_LCD_WriteC
    0B9C 940E0C87  CALL	pop_gset1
    0B9E 9508      RET
(0098)  }
(0099)  /*-------------------------------------
(0100)  左右屏幕选择:
(0101)     L:左;R:右;LR:左右
(0102)  ---------------------------------------*/
(0103)  void LCD_Select(uchar x)
(0104) {if(x==L){
_LCD_Select:
  x                    --> R16
    0B9F 3100      CPI	R16,0x10
    0BA0 F419      BNE	0x0BA4
(0105)      Set_CS1_1;
    0BA1 9AD8      SBI	0x1B,0
(0106)      Set_CS2_0;}
    0BA2 98D9      CBI	0x1B,1
    0BA3 C00C      RJMP	0x0BB0
(0107)  else if(x==R){
    0BA4 3200      CPI	R16,0x20
    0BA5 F419      BNE	0x0BA9
(0108)      Set_CS1_0;
    0BA6 98D8      CBI	0x1B,0
(0109)      Set_CS2_1;}
    0BA7 9AD9      SBI	0x1B,1
    0BA8 C007      RJMP	0x0BB0
(0110)  else if(x==LR){
    0BA9 3300      CPI	R16,0x30
    0BAA F419      BNE	0x0BAE
(0111)      Set_CS2_1;
    0BAB 9AD9      SBI	0x1B,1
(0112)      Set_CS1_1;}
    0BAC 9AD8      SBI	0x1B,0
    0BAD C002      RJMP	0x0BB0
(0113)  else{
(0114)      Set_CS1_0;
    0BAE 98D8      CBI	0x1B,0
(0115) 	 Set_CS2_0;}
    0BAF 98D9      CBI	0x1B,1
    0BB0 9508      RET
_LCD_Clear:
  i                    --> R20
  j                    --> R22
  k                    --> R22
    0BB1 940E0C82  CALL	push_gset2
    0BB3 2F60      MOV	R22,R16
(0116) }
(0117)  /*-----------------------------------
(0118)  清屏:
(0119)      从k(0-7)行开始清屏
(0120)  ------------------------------------*/
(0121)  void LCD_Clear(uchar k)
(0122) {uchar i,j;
(0123)  LCD_Select(LR);
    0BB4 E300      LDI	R16,0x30
    0BB5 DFE9      RCALL	_LCD_Select
(0124)  for(i=k;i<8;i++){
    0BB6 2F46      MOV	R20,R22
    0BB7 C00B      RJMP	0x0BC3
(0125)      Set_XY(i,0);
    0BB8 2722      CLR	R18
    0BB9 2F04      MOV	R16,R20
    0BBA DFCE      RCALL	_Set_XY
(0126) 	 for(j=0;j<64;j++){
    0BBB 2766      CLR	R22
    0BBC C003      RJMP	0x0BC0
(0127) 	     LCD_WriteD(0x00);}}
    0BBD 2700      CLR	R16
    0BBE DFB8      RCALL	_LCD_WriteD
    0BBF 9563      INC	R22
    0BC0 3460      CPI	R22,0x40
    0BC1 F3D8      BCS	0x0BBD
    0BC2 9543      INC	R20
    0BC3 3048      CPI	R20,0x8
    0BC4 F398      BCS	0x0BB8
    0BC5 940E0C73  CALL	pop_gset2
    0BC7 9508      RET
(0128) }
(0129)  /*---------------------------
(0130)  LCD初始化
(0131)  显示开/关:0x3E:Off,0x3F:On
(0132)  ----------------------------*/
(0133)  void LCD_Init()
(0134) {CS1_DDR|=LCD_CS1;
_LCD_Init:
    0BC8 9AD0      SBI	0x1A,0
(0135)  CS2_DDR|=LCD_CS2;
    0BC9 9AD1      SBI	0x1A,1
(0136)  RW_DDR|=LCD_RW;
    0BCA 9AD3      SBI	0x1A,3
(0137)  E_DDR|=LCD_E;
    0BCB 9AD4      SBI	0x1A,4
(0138)  DI_DDR|=LCD_DI;          
    0BCC 9AD2      SBI	0x1A,2
(0139)  DATA_DDR=LCD_DATA_OUT;//设置各端口为输出                       
    0BCD EF8F      LDI	R24,0xFF

⌨️ 快捷键说明

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