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

📄 ds12887.lst

📁 12C887 的驱动程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    00FE EFCF      LDI	R28,0xFF
    00FF E1D0      LDI	R29,0x10
    0100 BFCD      OUT	0x3D,R28
    0101 BFDE      OUT	0x3E,R29
    0102 51C0      SUBI	R28,0x10
    0103 40D0      SBCI	R29,0
    0104 EA0A      LDI	R16,0xAA
    0105 8308      STD	Y+0,R16
    0106 2400      CLR	R0
    0107 E7E0      LDI	R30,0x70
    0108 E0F2      LDI	R31,2
    0109 E012      LDI	R17,2
    010A 38E5      CPI	R30,0x85
    010B 07F1      CPC	R31,R17
    010C F011      BEQ	0x010F
    010D 9201      ST	R0,Z+
    010E CFFB      RJMP	0x010A
    010F 8300      STD	Z+0,R16
    0110 E8EC      LDI	R30,0x8C
    0111 E0F0      LDI	R31,0
    0112 E0A0      LDI	R26,0
    0113 E0B1      LDI	R27,1
    0114 E011      LDI	R17,1
    0115 3FEC      CPI	R30,0xFC
    0116 07F1      CPC	R31,R17
    0117 F021      BEQ	0x011C
    0118 95C8      LPM
    0119 9631      ADIW	R30,1
    011A 920D      ST	R0,X+
    011B CFF9      RJMP	0x0115
    011C 940E040F  CALL	_main
_exit:
    011E CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\USING07-07\Mega128\12c887\lcd.c
(0001) #include <iom128v.h>
(0002) #include <macros.h>
(0003) #include "lcd.h"
(0004) typedef unsigned char uchar;
(0005) typedef unsigned int uint;
(0006) 
(0007) void port_init(void)
(0008) {
(0009)  //访问外部ram的总线端口
(0010)  PORTA = 0x00;
_port_init:
    011F 2422      CLR	R2
    0120 BA2B      OUT	0x1B,R2
(0011)  DDRA  = 0x00; 
    0121 BA2A      OUT	0x1A,R2
(0012)  PORTC = 0x00; 
    0122 BA25      OUT	0x15,R2
(0013)  DDRC  = 0xFF;
    0123 EF8F      LDI	R24,0xFF
    0124 BB84      OUT	0x14,R24
    0125 9508      RET
_check_busy:
  temp                 --> R20
  cs                   --> R16
    0126 940E048F  CALL	push_gset1
(0014) }
(0015) 	  
(0016) void check_busy(uchar cs)               
(0017) { 
    0128 C009      RJMP	0x0132
(0018)   uchar temp;
(0019)   while(temp)          
(0020)    { 
(0021)      if(cs)
    0129 2300      TST	R16
    012A F021      BEQ	0x012F
(0022)         temp=R_staus&0X80;               //将忙状态读到temp中进行确定
    012B 91409900  LDS	R20,0x9900
    012D 7840      ANDI	R20,0x80
    012E C003      RJMP	0x0132
(0023) 	 else
(0024) 	    temp=L_staus&0X80;
    012F 91409500  LDS	R20,0x9500
    0131 7840      ANDI	R20,0x80
    0132 2344      TST	R20
    0133 F7A9      BNE	0x0129
    0134 940E0492  CALL	pop_gset1
    0136 9508      RET
_lcdcommand:
  com                  --> R20
  cs                   --> R22
    0137 940E048D  CALL	push_gset2
    0139 2F42      MOV	R20,R18
    013A 2F60      MOV	R22,R16
(0025) 	}
(0026) }
(0027) 
(0028) 
(0029) void lcdcommand(uchar cs,uchar com)
(0030) { 
(0031)  if(cs)
    013B 2366      TST	R22
    013C F029      BEQ	0x0142
(0032)    {	
(0033)     check_busy(1);
    013D E001      LDI	R16,1
    013E DFE7      RCALL	_check_busy
(0034)     R_command=com;
    013F 93409800  STS	0x9800,R20
(0035)    }
    0141 C004      RJMP	0x0146
(0036)   else
(0037)    { 	
(0038)     check_busy(0);
    0142 2700      CLR	R16
    0143 DFE2      RCALL	_check_busy
(0039)     L_command=com;
    0144 93409400  STS	0x9400,R20
(0040)    }
    0146 940E047E  CALL	pop_gset2
    0148 9508      RET
_lcddatas:
  dd                   --> R20
  cs                   --> R22
    0149 940E048D  CALL	push_gset2
    014B 2F42      MOV	R20,R18
    014C 2F60      MOV	R22,R16
(0041) }
(0042) 
(0043) /*************************向LCD写数据函数*************************/
(0044) 
(0045) void lcddatas(char cs,uchar dd)
(0046) {  
(0047)  if(cs)
    014D 2366      TST	R22
    014E F029      BEQ	0x0154
(0048)    {
(0049)     check_busy(1);
    014F E001      LDI	R16,1
    0150 DFD5      RCALL	_check_busy
(0050)     R_data=dd;
    0151 93409A00  STS	0x9A00,R20
(0051)    }
    0153 C004      RJMP	0x0158
(0052)  else
(0053)    {
(0054)     check_busy(0);
    0154 2700      CLR	R16
    0155 DFD0      RCALL	_check_busy
(0055)     L_data=dd;
    0156 93409600  STS	0x9600,R20
(0056)     }
    0158 940E047E  CALL	pop_gset2
    015A 9508      RET
_LCD_Clean:
  x                    --> R20
  y                    --> R22
    015B 940E048D  CALL	push_gset2
(0057) }
(0058) 
(0059) /**************************** LCD清屏函数*******************************/
(0060) 
(0061) void LCD_Clean(void)
(0062) {
(0063)  unsigned char x,y;	 	
(0064)  for(x=0xb8;x<=0xbf;x++)                                 //一页一页的写
    015D EB48      LDI	R20,0xB8
    015E C018      RJMP	0x0177
(0065)    {	
(0066)      lcdcommand(0,x); 
    015F 2F24      MOV	R18,R20
    0160 2700      CLR	R16
    0161 DFD5      RCALL	_lcdcommand
(0067)      lcdcommand(1,x);                                    //设定X方向地址,X地址不能自增。要靠程序加
    0162 2F24      MOV	R18,R20
    0163 E001      LDI	R16,1
    0164 DFD2      RCALL	_lcdcommand
(0068)      lcdcommand(0,LCD_Y);                                //设置Y的初始地址,Y可自加
    0165 E420      LDI	R18,0x40
    0166 2700      CLR	R16
    0167 DFCF      RCALL	_lcdcommand
(0069)      lcdcommand(1,LCD_Y);
    0168 E420      LDI	R18,0x40
    0169 E001      LDI	R16,1
    016A DFCC      RCALL	_lcdcommand
(0070)      for(y=0;y<64;y++)
    016B 2766      CLR	R22
    016C C007      RJMP	0x0174
(0071)        {  	
(0072)          lcddatas(0,0x00);
    016D 2722      CLR	R18
    016E 2700      CLR	R16
    016F DFD9      RCALL	_lcddatas
(0073)          lcddatas(1,0x00);                               //Y地址可以自增
    0170 2722      CLR	R18
    0171 E001      LDI	R16,1
    0172 DFD6      RCALL	_lcddatas
    0173 9563      INC	R22
    0174 3460      CPI	R22,0x40
    0175 F3B8      BCS	0x016D
    0176 9543      INC	R20
    0177 EB8F      LDI	R24,0xBF
    0178 1784      CP	R24,R20
    0179 F728      BCC	0x015F
    017A 940E047E  CALL	pop_gset2
    017C 9508      RET
(0074)        }		      
(0075)     }
(0076) }
(0077)                                          
(0078) void LCD_Init(void)                     //LCD初始化子函数
(0079) {
(0080)   /*首先关闭12864的显示*/
(0081)   check_busy(0);                        //LCD左半屏正在工作,等待......
_LCD_Init:
    017D 2700      CLR	R16
    017E DFA7      RCALL	_check_busy
(0082)   L_command=LCD_OFF;                    //先关闭LCD左半屏的显示
    017F E38E      LDI	R24,0x3E
    0180 93809400  STS	0x9400,R24
(0083)   check_busy(1);                        //LCD右半屏正在工作,等待......
    0182 E001      LDI	R16,1
    0183 DFA2      RCALL	_check_busy
(0084)   R_command=LCD_OFF;                    //先关闭LCD右半屏的显示
    0184 E38E      LDI	R24,0x3E
    0185 93809800  STS	0x9800,R24
(0085)   
(0086)   /*开启12864的显示*/
(0087)   check_busy(0);
    0187 2700      CLR	R16
    0188 DF9D      RCALL	_check_busy
(0088)   L_command=LCD_ON;                     //打开LCD左半屏的显示
    0189 E38F      LDI	R24,0x3F
    018A 93809400  STS	0x9400,R24
(0089)   check_busy(1);
    018C E001      LDI	R16,1
    018D DF98      RCALL	_check_busy
(0090)   R_command=LCD_ON;                     //打开LCD右半屏的显示
    018E E38F      LDI	R24,0x3F
    018F 93809800  STS	0x9800,R24
(0091)   
(0092)   /*设置LCD显示的起始行*/
(0093)   check_busy(0);
    0191 2700      CLR	R16
    0192 DF93      RCALL	_check_busy
(0094)   L_command=LCD_X;                      //LCD左半屏起始行为0
    0193 EC80      LDI	R24,0xC0
    0194 93809400  STS	0x9400,R24
(0095)   check_busy(1);
    0196 E001      LDI	R16,1
    0197 DF8E      RCALL	_check_busy
(0096)   R_command=LCD_X;                      //LCD右半屏起始行为0
    0198 EC80      LDI	R24,0xC0
    0199 93809800  STS	0x9800,R24
    019B 9508      RET
(0097) }
(0098) 
(0099) void init_devices(void)
(0100) {
(0101)  XMCRA = 0x00;                          //外部存储器控制
_init_devices:
    019C 2422      CLR	R2
    019D 9220006D  STS	0x6D,R2
(0102)  XMCRB = 0x00; //外存储高位地址屏蔽,释放端口C
    019F 9220006C  STS	0x6C,R2
(0103)  port_init();
    01A1 DF7D      RCALL	_port_init
(0104)  MCUCR = 0x80;                          //外部SRAM使能
    01A2 E880      LDI	R24,0x80
    01A3 BF85      OUT	0x35,R24
    01A4 9508      RET
_displaychar_left:
  i                    --> R20
  y                    --> Y+4
  x                    --> R20
  array                --> R22
    01A5 940E048D  CALL	push_gset2
    01A7 2F42      MOV	R20,R18
    01A8 01B8      MOVW	R22,R16
(0105) }
(0106) 
(0107) /**********************************LCD字符显示函数(8*8)**********************************************/
(0108) 
(0109) void displaychar_left(uchar *array,uchar x,uchar y)        
(0110)  {
(0111)   uchar i;
(0112)   lcdcommand(0,LCD_PAGE+x);
    01A9 2F24      MOV	R18,R20
    01AA 5428      SUBI	R18,0x48
    01AB 2700      CLR	R16
    01AC DF8A      RCALL	_lcdcommand
(0113)   lcdcommand(0,LCD_Y+y);
    01AD 812C      LDD	R18,Y+4
    01AE 5C20      SUBI	R18,0xC0
    01AF 2700      CLR	R16
    01B0 DF86      RCALL	_lcdcommand
(0114)   for(i=0;i<8;i++)
    01B1 2744      CLR	R20
    01B2 C008      RJMP	0x01BB
(0115)     {
(0116) 	 lcddatas(0,*(array+i));
    01B3 2FE4      MOV	R30,R20
    01B4 27FF      CLR	R31
    01B5 0FE6      ADD	R30,R22
    01B6 1FF7      ADC	R31,R23
    01B7 8120      LDD	R18,Z+0
    01B8 2700      CLR	R16
    01B9 DF8F      RCALL	_lcddatas
    01BA 9543      INC	R20
    01BB 3048      CPI	R20,0x8
    01BC F3B0      BCS	0x01B3
    01BD 940E047E  CALL	pop_gset2
    01BF 9508      RET
_displaychar_right:
  i                    --> R20
  y                    --> Y+4
  x                    --> R20
  array                --> R22
    01C0 940E048D  CALL	push_gset2
    01C2 2F42      MOV	R20,R18
    01C3 01B8      MOVW	R22,R16
(0117) 	}
(0118)  }
(0119) 
(0120) 
(0121) void displaychar_right(uchar *array,uchar x,uchar y)        
(0122) {
(0123)   uchar i;
(0124)   lcdcommand(1,LCD_PAGE+x);
    01C4 2F24      MOV	R18,R20
    01C5 5428      SUBI	R18,0x48
    01C6 E001      LDI	R16,1
    01C7 DF6F      RCALL	_lcdcommand
(0125)   lcdcommand(1,LCD_Y+y);
    01C8 812C      LDD	R18,Y+4
    01C9 5C20      SUBI	R18,0xC0
    01CA E001      LDI	R16,1
    01CB DF6B      RCALL	_lcdcommand
(0126)   for(i=0;i<8;i++)
    01CC 2744      CLR	R20
    01CD C008      RJMP	0x01D6
(0127)      {
(0128) 	  lcddatas(1,*(array+i));
    01CE 2FE4      MOV	R30,R20
    01CF 27FF      CLR	R31
    01D0 0FE6      ADD	R30,R22
    01D1 1FF7      ADC	R31,R23
    01D2 8120      LDD	R18,Z+0
    01D3 E001      LDI	R16,1
    01D4 DF74      RCALL	_lcddatas
    01D5 9543      INC	R20
    01D6 3048      CPI	R20,0x8
    01D7 F3B0      BCS	0x01CE
    01D8 940E047E  CALL	pop_gset2
    01DA 9508      RET
_display_char:
  heng                 --> R10
  zong                 --> R22
  array2               --> R20
  array1               --> R12
    01DB 940E0489  CALL	push_gset4
    01DD 01A9      MOVW	R20,R18
    01DE 0168      MOVW	R12,R16
    01DF 9721      SBIW	R28,1
    01E0 8569      LDD	R22,Y+9
    01E1 84AB      LDD	R10,Y+11
(0129) 	  }
(0130) }
(0131) 
(0132)      
(0133) void display_char(uchar*array1,uchar*array2,uchar zong,uchar heng)         
(0134) {
(0135)   if((heng>=0)&&(heng<=7))       
    01E2 2D8A      MOV	R24,R10
    01E3 3080      CPI	R24,0
    01E4 F080      BCS	0x01F5
    01E5 E087      LDI	R24,7
    01E6 158A      CP	R24,R10
    01E7 F068      BCS	0x01F5
(0136) 	{displaychar_left(array1,zong,heng*8);	displaychar_left(array2,zong+1,heng*8);}
    01E8 E088      LDI	R24,0x8
    01E9 9D8A      MUL	R24,R10
    01EA 8208      STD	Y+0,R0
    01EB 2F26      MOV	R18,R22
    01EC 0186      MOVW	R16,R12
    01ED DFB7      RCALL	_displaychar_left
    01EE E088      LDI	R24,0x8
    01EF 9D8A      MUL	R24,R10
    01F0 8208      STD	Y+0,R0
    01F1 2F26      MOV	R18,R22
    01F2 5F2F      SUBI	R18,0xFF
    01F3 018A      MOVW	R16,R20
    01F4 DFB0      RCALL	_displaychar_left
(0137) 				 
(0138)   if((heng>=8)&&(heng<=15))        
    01F5 2D8A      MOV	R24,R10
    01F6 3088      CPI	R24,0x8
    01F7 F0A0      BCS	0x020C
    01F8 E08F      LDI	R24,0xF
    01F9 158A      CP	R24,R10
    01FA F088      BCS	0x020C
(0139)     {displaychar_right(array1,zong,(heng-8)*8);	displaychar_right(array2,zong+1,(heng-8)*8);}
    01FB E088      LDI	R24,0x8
    01FC 9D8A      MUL	R24,R10
    01FD 2D80      MOV	R24,R0
    01FE 5480      SUBI	R24,0x40
    01FF 8388      STD	Y+0,R24
    0200 2F26      MOV	R18,R22
    0201 0186      MOVW	R16,R12
    0202 DFBD      RCALL	_displaychar_right
    0203 E088      LDI	R24,0x8
    0204 9D8A      MUL	R24,R10
    0205 2D80      MOV	R24,R0
    0206 5480      SUBI	R24,0x40
    0207 8388      STD	Y+0,R24
    0208 2F26      MOV	R18,R22
    0209 5F2F      SUBI	R18,0xFF
    020A 018A      MOVW	R16,R20
    020B DFB4      RCALL	_displaychar_right
    020C 9621      ADIW	R28,1
    020D 940E0484  CALL	pop_gset4
    020F 9508      RET
_displayL:
  i                    --> R20
  y                    --> Y+4
  x                    --> R20
  array                --> R22
    0210 940E048D  CALL	push_gset2
    0212 2F42      MOV	R20,R18

⌨️ 快捷键说明

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