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

📄 1602xi.lst

📁 lcd液晶驱动显示原代码 根据硬件自己修改
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0063)    lcd_control_port&=~lcd_EN;//重设E=0 
    00B8 98AA      CBI	0x15,2
    00B9 D062      RCALL	pop_gset1
    00BA 9508      RET
(0064) } 
(0065) 
(0066) //正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。 
(0067) //检测忙信号,等待LCD空闲函数 
(0068) void wait_enable(void) 
(0069) { 
(0070)    lcd_busy_ddr&=~busy;//设置busy口为输入 
_wait_enable:
    00BB 98BF      CBI	0x17,7
(0071)    lcd_control_port&=~lcd_RS;//RS=0 
    00BC 98A8      CBI	0x15,0
(0072)    lcd_control_port|=lcd_RW;//RW=1 
    00BD 9AA9      SBI	0x15,1
(0073)    NOP(); 
    00BE 0000      NOP
(0074)    lcd_control_port|=lcd_EN;//E=1 
    00BF 9AAA      SBI	0x15,2
(0075)    while(lcd_busy_pin&busy);//等待LCD_DB7为0 
    00C0 99B7      SBIC	0x16,7
    00C1 CFFE      RJMP	0x00C0
(0076)    lcd_control_port&=~lcd_EN;//重设E=0 
    00C2 98AA      CBI	0x15,2
(0077)    lcd_busy_ddr|=busy;//设置busy口为输出 
    00C3 9ABF      SBI	0x17,7
    00C4 9508      RET
_lcd_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00C5 D051      RCALL	push_gset2
    00C6 2F42      MOV	R20,R18
    00C7 2F60      MOV	R22,R16
(0078) } 
(0079) /**LCD_set_xy:设置LCD显示的起始位置输入参数:x、y :  
(0080)                     显示字符串的位置,X:0-15,Y:0-1 
(0081)                     LCD第一行显示寄存器地址:0X80-0X8F 
(0082)                     LCD第一行显示寄存器地址:0XC0-0XCF   ***/ 
(0083) void lcd_set_xy( unsigned char x, unsigned char y ) 
(0084) { 
(0085)     unsigned char address; 
(0086)     if (y == 0)  
    00C8 2344      TST	R20
    00C9 F419      BNE	0x00CD
(0087)        address = 0x80 + x; 
    00CA 2F46      MOV	R20,R22
    00CB 5840      SUBI	R20,0x80
    00CC C002      RJMP	0x00CF
(0088)     else  
(0089)         address = 0xc0 + x; 
    00CD 2F46      MOV	R20,R22
    00CE 5440      SUBI	R20,0x40
(0090)     lcd_write_command(address,1);//一定需要检查忙信号,所以为1 
    00CF E021      LDI	R18,1
    00D0 2F04      MOV	R16,R20
    00D1 DFCE      RCALL	_lcd_write_command
    00D2 D03A      RCALL	pop_gset2
    00D3 9508      RET
_display_a_char:
  char_data            --> Y+4
  y                    --> R22
  x                    --> R20
    00D4 D042      RCALL	push_gset2
    00D5 2F62      MOV	R22,R18
    00D6 2F40      MOV	R20,R16
(0091) } 
(0092) //显示一个字符函数 
(0093) void display_a_char(unsigned char x,unsigned char y,unsigned char char_data)//char_data为要显示的字符 
(0094) { 
(0095)     lcd_set_xy(x,y); 
    00D7 2F26      MOV	R18,R22
    00D8 2F04      MOV	R16,R20
    00D9 DFEB      RCALL	_lcd_set_xy
(0096)     lcd_write_data(char_data); 
    00DA 810C      LDD	R16,Y+4
    00DB DFD3      RCALL	_lcd_write_data
    00DC D030      RCALL	pop_gset2
    00DD 9508      RET
_display_a_string:
  ptr                  --> R20
  y                    --> R10
  x                    --> R22
    00DE D036      RCALL	push_gset3
    00DF 2EA2      MOV	R10,R18
    00E0 2F60      MOV	R22,R16
    00E1 814E      LDD	R20,Y+6
    00E2 815F      LDD	R21,Y+7
(0097) } 
(0098) 
(0099) //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符 
(0100) //显示一行连续字符串函数 
(0101) 
(0102) void display_a_string(unsigned char x,unsigned char y,unsigned char *ptr) 
(0103) { 
(0104) //ptr:指向无符号字符型变量的指针变量,指针也就是地址,指字符串数组的首指针 
(0105)     lcd_set_xy(x,y); 
    00E3 2D2A      MOV	R18,R10
    00E4 2F06      MOV	R16,R22
    00E5 DFDF      RCALL	_lcd_set_xy
    00E6 C005      RJMP	0x00EC
(0106)    while(*ptr)//当ptr='\0'(空指针null)跳出循环 
(0107)     { 
(0108)      lcd_write_data(*ptr);//*ptr,指向该地址的内容 
    00E7 01FA      MOVW	R30,R20
    00E8 8100      LDD	R16,Z+0
    00E9 DFC5      RCALL	_lcd_write_data
(0109)      ptr++; 
    00EA 5F4F      SUBI	R20,0xFF
    00EB 4F5F      SBCI	R21,0xFF
    00EC 01FA      MOVW	R30,R20
    00ED 8020      LDD	R2,Z+0
    00EE 2022      TST	R2
    00EF F7B9      BNE	0x00E7
    00F0 D01E      RCALL	pop_gset3
    00F1 9508      RET
_display_a_fluid:
  ptr                  --> R20
  y                    --> R10
  x                    --> R22
    00F2 D022      RCALL	push_gset3
    00F3 2EA2      MOV	R10,R18
    00F4 2F60      MOV	R22,R16
    00F5 814E      LDD	R20,Y+6
    00F6 815F      LDD	R21,Y+7
(0110)     } 
(0111) }
(0112) /*********************流动字幕***********************/
(0113) void display_a_fluid(unsigned char x,unsigned char y,unsigned char *ptr) 
(0114) 	   			{ lcd_write_command(0x07,1);//流动字幕
    00F7 E021      LDI	R18,1
    00F8 E007      LDI	R16,7
    00F9 DFA6      RCALL	_lcd_write_command
(0115) 	   			  lcd_set_xy(x,y);
    00FA 2D2A      MOV	R18,R10
    00FB 2F06      MOV	R16,R22
    00FC DFC8      RCALL	_lcd_set_xy
    00FD C008      RJMP	0x0106
(0116) 	   			  while(*ptr)
(0117) 				    {
(0118) 	   			     lcd_write_data(*ptr);
    00FE 01FA      MOVW	R30,R20
    00FF 8100      LDD	R16,Z+0
    0100 DFAE      RCALL	_lcd_write_data
(0119) 				     delay_nms(200);
    0101 EC08      LDI	R16,0xC8
    0102 E010      LDI	R17,0
    0103 DF63      RCALL	_delay_nms
(0120) 					 ptr++;
    0104 5F4F      SUBI	R20,0xFF
    0105 4F5F      SBCI	R21,0xFF
    0106 01FA      MOVW	R30,R20
    0107 8020      LDD	R2,Z+0
    0108 2022      TST	R2
    0109 F7A1      BNE	0x00FE
    010A D004      RCALL	pop_gset3
    010B 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\1602\main.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "LCD1602.h"
(0004) #define   set   0x10
(0005) //PD^4
(0006) #define   add   0x20
(0007) //PD^5
(0008) #define   sub   0x40
(0009) //PD^6
(0010) #define   enter 0x80
(0011) //PD^7
(0012) 
(0013) //#pragma abs_address:0x1B00
(0014) //#pragma end_abs_address 
(0015) unsigned char string[]="0123456789";
(0016) unsigned char welcome[]="Welcome";
(0017) unsigned char temperature[]="Temper:  0 C"; 
(0018) unsigned char temperset[]  ="Temset:  0 C";
(0019) //unsigned char temper[]={0};               //设置温度缓冲区
(0020) //unsigned char wendu[]={0};
(0021) //unsigned char wenduset=0;
(0022)  
(0023) /*void key(void)
(0024) {unsigned char testkey=0;
(0025)  DDRD&=0X0F;
(0026)  PORTD|=0xf0;
(0027)  if(!(set&PIND)
(0028)      {delay_nus(100);
(0029) 	  if(!(set&PIND)
(0030)            {lcd_write_command(0x0e,0);//光标开
(0031) 		    
(0032) 		    lcd_write_command(0x01,1);
(0033) 		    
(0034) 	       
(0035) 	 }
(0036)  
(0037) 
(0038) }*/
(0039) 
(0040) /*void BCD(unsigned int count)
(0041)      {
(0042) 	  unsigned i, temp;
(0043) 	  for(i=0;i<3;i++)
(0044) 	   	   {temp=count%10;
(0045) 		   temper[3-i]=temp;
(0046) 		   count=count/10;		   
(0047) 		   }	  
(0048) 	
(0049) 	 }
(0050) 	*/
(0051) void main(void) 
(0052) { 
FILE: <library>
_main:
    010C 9508      RET
pop_gset2:
    010D E0E2      LDI	R30,2
    010E C00E      RJMP	pop
pop_gset3:
    010F E0E4      LDI	R30,4
    0110 C00C      RJMP	pop
push_gset5:
    0111 92FA      ST	R15,-Y
    0112 92EA      ST	R14,-Y
push_gset4:
    0113 92DA      ST	R13,-Y
    0114 92CA      ST	R12,-Y
push_gset3:
    0115 92BA      ST	R11,-Y
    0116 92AA      ST	R10,-Y
push_gset2:
    0117 937A      ST	R23,-Y
    0118 936A      ST	R22,-Y
push_gset1:
    0119 935A      ST	R21,-Y
    011A 934A      ST	R20,-Y
    011B 9508      RET
pop_gset1:
    011C E0E1      LDI	R30,1
pop:
    011D 9149      LD	R20,Y+
    011E 9159      LD	R21,Y+
    011F FDE0      SBRC	R30,0
    0120 9508      RET
    0121 9169      LD	R22,Y+
    0122 9179      LD	R23,Y+
    0123 FDE1      SBRC	R30,1
    0124 9508      RET
    0125 90A9      LD	R10,Y+
    0126 90B9      LD	R11,Y+
    0127 FDE2      SBRC	R30,2
    0128 9508      RET
    0129 90C9      LD	R12,Y+
    012A 90D9      LD	R13,Y+
    012B FDE3      SBRC	R30,3
    012C 9508      RET
    012D 90E9      LD	R14,Y+
    012E 90F9      LD	R15,Y+
    012F 9508      RET

⌨️ 快捷键说明

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