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

📄 nrf.lst

📁 基于m16的nrf905接收发送程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0037) 
(0038) //延时1S
(0039) void delay_ns( uchar n )
(0040) {
(0041)     uchar i;
(0042) 	for( i = 0; i < n; i++ )
     223 24AA      CLR	R10
     224 C004      RJMP	0x0229
(0043) 	{
(0044)   	 	delay_nms( 1000 );
     225 EE08      LDI	R16,0xE8
     226 E013      LDI	R17,3
     227 DFEA      RCALL	_delay_nms
     228 94A3      INC	R10
     229 14AC      CP	R10,R12
     22A F3D0      BCS	0x0225
     22B 90C9      LD	R12,Y+
     22C 90A9      LD	R10,Y+
     22D 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\nrftest\lcd.c
(0001) #define _LCD_C_
(0002) #include "LCD.h"
(0003) #include <iom16v.h>
(0004) //==========================================
(0005) //函数名称:液晶模块使能
(0006) //函数作用: 使能液晶
(0007) //入口参数: 无
(0008) //返回类型:无
(0009) //==========================================
(0010) void LCD_en_write(void)
(0011) {
(0012)   EN_SET;
_LCD_en_write:
     22E 9A93      SBI	0x12,3
(0013)   delay_nus(4);
     22F E004      LDI	R16,4
     230 E010      LDI	R17,0
     231 940E 01FA CALL	_delay_nus
(0014)   EN_CLR;
     233 9893      CBI	0x12,3
     234 9508      RET
_LCD_write_command:
  command              --> R20
     235 934A      ST	R20,-Y
     236 2F40      MOV	R20,R16
(0015) }
(0016) 
(0017) //==========================================
(0018) //函数名称:写指令
(0019) //函数作用:
(0020) //入口参数: 液晶指令command
(0021) //返回类型:无
(0022) //==========================================
(0023) void LCD_write_command(uchar command)
(0024) {
(0025)   delay_nus( 16 );
     237 E100      LDI	R16,0x10
     238 E010      LDI	R17,0
     239 940E 01FA CALL	_delay_nus
(0026)   RS_CLR;
     23B 9892      CBI	0x12,2
(0027)   DB &= 0X0F;           //清高四位
     23C B382      IN	R24,0x12
     23D 708F      ANDI	R24,0xF
     23E BB82      OUT	0x12,R24
(0028)   DB |= command & 0xf0; //写高四位
     23F 2F84      MOV	R24,R20
     240 7F80      ANDI	R24,0xF0
     241 B222      IN	R2,0x12
     242 2A28      OR	R2,R24
     243 BA22      OUT	0x12,R2
(0029)   LCD_en_write();
     244 DFE9      RCALL	_LCD_en_write
(0030)   command=command << 4;   //低四位移到高四位
     245 2F84      MOV	R24,R20
     246 708F      ANDI	R24,0xF
     247 9582      SWAP	R24
     248 2F48      MOV	R20,R24
(0031)   DB &= 0x0f;             //清高四位
     249 B382      IN	R24,0x12
     24A 708F      ANDI	R24,0xF
     24B BB82      OUT	0x12,R24
(0032)   DB |= command & 0xf0;   //写低四位
     24C 2F84      MOV	R24,R20
     24D 7F80      ANDI	R24,0xF0
     24E B222      IN	R2,0x12
     24F 2A28      OR	R2,R24
     250 BA22      OUT	0x12,R2
(0033)   LCD_en_write();
     251 DFDC      RCALL	_LCD_en_write
     252 9149      LD	R20,Y+
     253 9508      RET
_LCD_write_data:
  DATA                 --> R20
     254 934A      ST	R20,-Y
     255 2F40      MOV	R20,R16
(0034)   //delay_nms(2);         //清屏指令时间很长, 保险起见,可以增加
(0035) }
(0036) 
(0037) //==========================================
(0038) //函数名称:写数据
(0039) //函数作用:
(0040) //入口参数: 数据DATA
(0041) //返回类型:无
(0042) //==========================================
(0043) void LCD_write_data(uchar DATA)
(0044) {
(0045)   delay_nus(16);
     256 E100      LDI	R16,0x10
     257 E010      LDI	R17,0
     258 940E 01FA CALL	_delay_nus
(0046)   RS_SET;           //RS=1
     25A 9A92      SBI	0x12,2
(0047)   DB &= 0X0f;       //清高四位
     25B B382      IN	R24,0x12
     25C 708F      ANDI	R24,0xF
     25D BB82      OUT	0x12,R24
(0048)   DB |= DATA&0xf0;  //写高四位
     25E 2F84      MOV	R24,R20
     25F 7F80      ANDI	R24,0xF0
     260 B222      IN	R2,0x12
     261 2A28      OR	R2,R24
     262 BA22      OUT	0x12,R2
(0049)   LCD_en_write();
     263 DFCA      RCALL	_LCD_en_write
(0050)   DATA = DATA << 4; //低四位移到高四位
     264 2F84      MOV	R24,R20
     265 708F      ANDI	R24,0xF
     266 9582      SWAP	R24
     267 2F48      MOV	R20,R24
(0051)   DB &= 0X0f;       //清高四位
     268 B382      IN	R24,0x12
     269 708F      ANDI	R24,0xF
     26A BB82      OUT	0x12,R24
(0052)   DB |= DATA&0xf0;  //写低四位
     26B 2F84      MOV	R24,R20
     26C 7F80      ANDI	R24,0xF0
     26D B222      IN	R2,0x12
     26E 2A28      OR	R2,R24
     26F BA22      OUT	0x12,R2
(0053)   LCD_en_write();
     270 DFBD      RCALL	_LCD_en_write
     271 9149      LD	R20,Y+
     272 9508      RET
(0054) }
(0055) 
(0056) //==========================================
(0057) //函数名称:液晶初始化函数
(0058) //函数作用:
(0059) //入口参数: 无
(0060) //返回类型:无
(0061) //==========================================
(0062) void LCD_init( void )
(0063) {
(0064)   DB_DDR_OUT;
_LCD_init:
     273 B381      IN	R24,0x11
     274 6F80      ORI	R24,0xF0
     275 BB81      OUT	0x11,R24
     276 B381      IN	R24,0x11
     277 608C      ORI	R24,0xC
     278 BB81      OUT	0x11,R24
(0065)   LCD_write_command(0x28);
     279 E208      LDI	R16,0x28
     27A DFBA      RCALL	_LCD_write_command
(0066)   LCD_en_write();           //********总结这里一定要加这液晶使能*********
     27B DFB2      RCALL	_LCD_en_write
(0067)   delay_nus(20);
     27C E104      LDI	R16,0x14
     27D E010      LDI	R17,0
     27E 940E 01FA CALL	_delay_nus
(0068)   LCD_write_command(0x28);  //4位显示
     280 E208      LDI	R16,0x28
     281 DFB3      RCALL	_LCD_write_command
(0069)   LCD_write_command(0x0c);  //显示开
     282 E00C      LDI	R16,0xC
     283 DFB1      RCALL	_LCD_write_command
(0070)   LCD_write_command(0x01);  //清屏
     284 E001      LDI	R16,1
     285 DFAF      RCALL	_LCD_write_command
(0071)   delay_nms(5);             //延时一定要长
     286 E005      LDI	R16,5
     287 E010      LDI	R17,0
     288 940E 0212 CALL	_delay_nms
     28A 9508      RET
_LCD_set_rc:
  address              --> R20
  c                    --> R22
  r                    --> R10
     28B 940E 0562 CALL	push_xgsetF00C
     28D 2F62      MOV	R22,R18
     28E 2EA0      MOV	R10,R16
(0072) }
(0073) 
(0074) //==========================================
(0075) //函数名称:写地址
(0076) //函数作用:
(0077) //入口参数: 行位置r, 列位置c
(0078) //返回类型:无
(0079) //==========================================
(0080) void LCD_set_rc( uchar r, uchar c )
(0081) {
(0082)     uchar address;
(0083) 
(0084)     if (r == 1)
     28F 2D8A      MOV	R24,R10
     290 3081      CPI	R24,1
     291 F419      BNE	0x0295
(0085)     address = 0x80 + c;
     292 2F46      MOV	R20,R22
     293 5840      SUBI	R20,0x80
     294 C005      RJMP	0x029A
(0086)     else if(r == 2)
     295 2D8A      MOV	R24,R10
     296 3082      CPI	R24,2
     297 F411      BNE	0x029A
(0087)     address = 0xc0 + c;
     298 2F46      MOV	R20,R22
     299 5440      SUBI	R20,0x40
(0088) 
(0089)     LCD_write_command( address );
     29A 2F04      MOV	R16,R20
     29B DF99      RCALL	_LCD_write_command
     29C 940C 0569 JMP	pop_xgsetF00C
_LCD_write_string:
  s                    --> R20
  c                    --> R12
  r                    --> R10
     29E 940E 0570 CALL	push_xgset303C
     2A0 2EC2      MOV	R12,R18
     2A1 2EA0      MOV	R10,R16
     2A2 814E      LDD	R20,Y+6
     2A3 815F      LDD	R21,Y+7
(0090) }
(0091) 
(0092) //==========================================
(0093) //函数名称:写字符串
(0094) //函数作用: 在指定位置写一串字符串
(0095) //入口参数: 行位置r, 列位置c, 字符串*s
(0096) //返回类型:无
(0097) //==========================================
(0098) void LCD_write_string(uchar r, uchar c, uchar *s)
(0099) {
(0100)     LCD_set_rc( r, c ); //写地址
     2A4 2D2C      MOV	R18,R12
     2A5 2D0A      MOV	R16,R10
     2A6 DFE4      RCALL	_LCD_set_rc
     2A7 C005      RJMP	0x02AD
(0101) 
(0102)     while( *s )     	 	// 写显示字符
(0103)     {
(0104)       LCD_write_data( *s );
     2A8 01FA      MOVW	R30,R20
     2A9 8100      LDD	R16,Z+0
     2AA DFA9      RCALL	_LCD_write_data
(0105)       s++;
     2AB 5F4F      SUBI	R20,0xFF
     2AC 4F5F      SBCI	R21,0xFF
     2AD 01FA      MOVW	R30,R20
     2AE 8020      LDD	R2,Z+0
     2AF 2022      TST	R2
     2B0 F7B9      BNE	0x02A8
     2B1 940C 0577 JMP	pop_xgset303C
_LCD_write_char:
  DATA                 --> Y,+2
  c                    --> R12
  r                    --> R10
     2B3 92AA      ST	R10,-Y
     2B4 92CA      ST	R12,-Y
     2B5 2EC2      MOV	R12,R18
     2B6 2EA0      MOV	R10,R16
(0106)     }
(0107) }
(0108) 
(0109) void LCD_write_char(uchar r, uchar c, uchar DATA)				   //写字符
(0110) {
(0111)  	 LCD_set_rc( r, c );
     2B7 2D2C      MOV	R18,R12
     2B8 2D0A      MOV	R16,R10
     2B9 DFD1      RCALL	_LCD_set_rc
(0112) 	 LCD_write_data( DATA );
     2BA 810A      LDD	R16,Y+2
     2BB DF98      RCALL	_LCD_write_data
     2BC 90C9      LD	R12,Y+
     2BD 90A9      LD	R10,Y+
     2BE 9508      RET
_LCD_write_array:
  i                    --> R10
  array                --> R12
  c                    --> R22
  r                    --> R20
     2BF 940E 057E CALL	push_xgsetF03C
     2C1 2F62      MOV	R22,R18
     2C2 2F40      MOV	R20,R16
     2C3 9721      SBIW	R28,1
     2C4 84C9      LDD	R12,Y+9
     2C5 84DA      LDD	R13,Y+10
(0113) }
(0114) 
(0115) //==========================================
(0116) //函数名称:写字符数组
(0117) //函数作用: 在指定位置写一串字符串
(0118) //入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
(0119) //返回类型:无
(0120) //==========================================
(0121) void LCD_write_array( uchar r, uchar c, uchar array[] )
(0122) {
(0123)  	uchar i = 0;
     2C6 24AA      CLR	R10
     2C7 C02A      RJMP	0x02F2
(0124)     while( array[i] != '\0' )
(0125) 	{
(0126) 	 	 LCD_write_char( r, c, array[i] );
     2C8 2DEA      MOV	R30,R10
     2C9 27FF      CLR	R31
     2CA 0DEC      ADD	R30,R12
     2CB 1DFD      ADC	R31,R13
     2CC 8020      LDD	R2,Z+0
     2CD 8228      STD	Y+0,R2
     2CE 2F26      MOV	R18,R22
     2CF 2F04      MOV	R16,R20
     2D0 DFE2      RCALL	_LCD_write_char
(0127) 	     if( ++c == 16 )
     2D1 2F86      MOV	R24,R22
     2D2 5F8F      SUBI	R24,0xFF
     2D3 2F68      MOV	R22,R24
     2D4 3160      CPI	R22,0x10
     2D5 F4D9      BNE	0x02F1
(0128) 		 {
(0129) 		     if( r == 1 )
     2D6 3041      CPI	R20,1
     2D7 F461      BNE	0x02E4
(0130) 			 {   
(0131) 			     c = 0;
     2D8 2766      CLR	R22
(0132) 				 r = 2;
     2D9 E042      LDI	R20,2
(0133) 		  	  	 LCD_write_char( r, c, array[i] );
     2DA 2DEA      MOV	R30,R10
     2DB 27FF      CLR	R31
     2DC 0DEC      ADD	R30,R12
     2DD 1DFD      ADC	R31,R13
     2DE 8020      LDD	R2,Z+0
     2DF 8228      STD	Y+0,R2
     2E0 2F26      MOV	R18,R22
     2E1 2F04      MOV	R16,R20
     2E2 DFD0      RCALL	_LCD_write_char
(0134) 			 }
     2E3 C00D      RJMP	0x02F1
(0135) 			 
(0136) 			 else if( r == 2 )
     2E4 3042      CPI	R20,2
     2E5 F459      BNE	0x02F1
(0137) 			 {
(0138) 			  	 c = 0;
     2E6 2766      CLR	R22
(0139) 				 r = 1;
     2E7 E041      LDI	R20,1
(0140) 				 LCD_write_char( r, c, array[i] );
     2E8 2DEA      MOV	R30,R10
     2E9 27FF      CLR	R31
     2EA 0DEC      ADD	R30,R12
     2EB 1DFD      ADC	R31,R13
     2EC 8020      LDD	R2,Z+0
     2ED 8228      STD	Y+0,R2
     2EE 2F26      MOV	R18,R22
     2EF 2F04      MOV	R16,R20
     2F0 DFC2      RCALL	_LCD_write_char
(0141) 		     }
(0142) 	     }
(0143) 		 i++;
     2F1 94A3      INC	R10
     2F2 2DEA      MOV	R30,R10
     2F3 27FF      CLR	R31
     2F4 0DEC      ADD	R30,R12
     2F5 1DFD      ADC	R31,R13
     2F6 8020      LDD	R2,Z+0
     2F7 2022      TST	R2
     2F8 F009      BEQ	0x02FA
     2F9 CFCE      RJMP	0x02C8
     2FA 9621      ADIW	R28,1
     2FB 940C 0587 JMP	pop_xgsetF03C
_lengh_longint:
  data_n               --> R20
  datatmp              --> Y,+0
  datalongint          --> Y,+5
     2FD 940E 04D3 CALL	push_arg4
     2FF 934A      ST	R20,-Y
     300 9724      SBIW	R28,4
(0144) 	}  
(0145) }
(0146) 
(0147) //返回整形数据的长度
(0148) char lengh_longint( long unsigned datalongint )
(0149) {
(0150)     long signed datatmp = datalongint;
     301 802D      LDD	R2,Y+5
     302 803E      LDD	R3,Y+6
     303 804F      LDD	R4,Y+7
     304 8458      LDD	R5,Y+8
     305 8228      STD	Y+0,R2
     306 8239      STD	Y+1,R3
     307 824A      STD	Y+2,R4
     308 825B      STD	Y+3,R5
(0151)     uchar data_n = 0;
     309 2744      CLR	R20
     30A C013      RJMP	0x031E
(0152)     while( datatmp != 0 )
(0153)     {
(0154)         datatmp /= 10;
     30B E08A      LDI	R24,0xA
     30C E090      LDI	R25,0
     30D E0A0      LDI	R26,0
     30E E0B0      LDI	R27,0
     30F 8108      LDD	R16,Y+0

⌨️ 快捷键说明

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