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

📄 yi1602.lst

📁 AVR单片机开发版资料测试程序里的源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    005E E5CF      LDI	R28,0x5F
    005F E0D4      LDI	R29,4
    0060 BFCD      OUT	P3D,R28
    0061 BFDE      OUT	P3E,R29
    0062 51C0      SUBI	R28,0x10
    0063 40D0      SBCI	R29,0
    0064 EA0A      LDI	R16,0xAA
    0065 8308      STD	R16,0+Y
    0066 2400      CLR	R0
    0067 E7EB      LDI	R30,0x7B
    0068 E0F0      LDI	R31,0
    0069 E010      LDI	R17,0
    006A 37EB      CPI	R30,0x7B
    006B 07F1      CPC	R31,R17
    006C F011      BEQ	0x006F
    006D 9201      ST	R0,Z+
    006E CFFB      RJMP	0x006A
    006F 8300      STD	R16,0+Z
    0070 EAE0      LDI	R30,0xA0
    0071 E0F0      LDI	R31,0
    0072 E6A0      LDI	R26,0x60
    0073 E0B0      LDI	R27,0
    0074 E010      LDI	R17,0
    0075 3BEB      CPI	R30,0xBB
    0076 07F1      CPC	R31,R17
    0077 F021      BEQ	0x007C
    0078 95C8      LPM
    0079 9631      ADIW	R30,1
    007A 920D      ST	R0,X+
    007B CFF9      RJMP	0x0075
    007C 940E0186  CALL	_main
_exit:
    007E CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    007F 940E01DB  CALL	push_gset2
    0081 01B8      MOVW	R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002)   文件:AVR_PQ1A.H
(0003)   功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005) 
(0006) #include <iom16v.h>			//包含型号头文件
(0007) #include <macros.h>			//包含"位"操作头文件
(0008) 
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012) 
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2	//LED锁存器控制端
(0015) #define SEGLK PA3	//数码管段选锁存器控制端
(0016) #define BITLK PA4	//数码管位选锁存器控制端
(0017) 
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功    能: 延时指定微秒(8M晶振)
(0024) 参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值  : 无
(0026) /********************************************/
(0027) void Delayus(uint US)		  
(0028) {
(0029)  uint i;
(0030)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    0082 E005      LDI	R16,5
    0083 E010      LDI	R17,0
    0084 019B      MOVW	R18,R22
    0085 940E01B4  CALL	empy16s
    0087 01B8      MOVW	R22,R16
    0088 9576      LSR	R23
    0089 9567      ROR	R22
    008A 9576      LSR	R23
    008B 9567      ROR	R22
(0031)  for( i=0;i<US;i++); 
    008C 2744      CLR	R20
    008D 2755      CLR	R21
    008E C002      RJMP	0x0091
    008F 5F4F      SUBI	R20,0xFF
    0090 4F5F      SBCI	R21,0xFF
    0091 1746      CP	R20,R22
    0092 0757      CPC	R21,R23
    0093 F3D8      BCS	0x008F
(0032) }
    0094 940E01DF  CALL	pop_gset2
    0096 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    0097 940E01DB  CALL	push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功    能: 延时指定毫秒(8M晶振)
(0036) 参    数: MS--延时的毫秒数
(0037) 返回值  : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)		  
(0040) {
(0041)  uint i,j;
(0042)  for( i=0;i<MS;i++)
    0099 2744      CLR	R20
    009A 2755      CLR	R21
    009B C00B      RJMP	0x00A7
(0043)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    009C 2766      CLR	R22
    009D 2777      CLR	R23
    009E C002      RJMP	0x00A1
    009F 5F6F      SUBI	R22,0xFF
    00A0 4F7F      SBCI	R23,0xFF
    00A1 3765      CPI	R22,0x75
    00A2 E0E4      LDI	R30,4
    00A3 077E      CPC	R23,R30
    00A4 F3D0      BCS	0x009F
    00A5 5F4F      SUBI	R20,0xFF
    00A6 4F5F      SBCI	R21,0xFF
    00A7 1740      CP	R20,R16
    00A8 0751      CPC	R21,R17
    00A9 F390      BCS	0x009C
(0044) }
    00AA 940E01DF  CALL	pop_gset2
    00AC 9508      RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功    能: 初始化实验板,关闭全部功能
(0048) 参    数: 无
(0049) 返回值  : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) 	DDRA=0xFF;	//将四个IO口全部配置为输出
_Board_init:
    00AD EF8F      LDI	R24,0xFF
    00AE BB8A      OUT	P1A,R24
(0054) 	DDRB=0xFF;
    00AF BB87      OUT	P17,R24
(0055) 	DDRC=0xFF;
    00B0 BB84      OUT	P14,R24
(0056) 	DDRD=0xFF;
    00B1 BB81      OUT	P11,R24
(0057) 
(0058) 	SPCR=0x00;	//还原SPI口,使其为正常端口	
    00B2 2422      CLR	R2
    00B3 B82D      OUT	P0D,R2
(0059) 
(0060) 	PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
    00B4 9ADE      SBI	P1B,6
(0061) 	PORTC&=~BIT(PC6);	  //(RELAY)初始化继电器为常闭连接状态	
    00B5 98AE      CBI	P15,6
(0062) 	PORTA&=~BIT(PA1);	//关闭SPI总线DA
    00B6 98D9      CBI	P1B,1
(0063) 	PORTB=0xFF;	//关闭LED
    00B7 BB88      OUT	P18,R24
(0064) 	PORTA|=BIT(LEDLK);	//锁存数据,使LED熄灭
    00B8 9ADA      SBI	P1B,2
(0065)  	Delayus(5);		
    00B9 E005      LDI	R16,5
    00BA E010      LDI	R17,0
    00BB DFC3      RCALL	_Delayus
(0066)  	PORTA&=~BIT(LEDLK);
    00BC 98DA      CBI	P1B,2
(0067) 	
(0068) 	PORTB=0x00;	   //输出段选
    00BD 2422      CLR	R2
    00BE BA28      OUT	P18,R2
(0069)  	PORTA|=BIT(SEGLK);		  
    00BF 9ADB      SBI	P1B,3
(0070)  	Delayus(50);			  
    00C0 E302      LDI	R16,0x32
    00C1 E010      LDI	R17,0
    00C2 DFBC      RCALL	_Delayus
(0071)  	PORTA&=~BIT(SEGLK);	    
    00C3 98DB      CBI	P1B,3
(0072)  	
(0073)  	PORTB=0xFF;	   //输出位选
    00C4 EF8F      LDI	R24,0xFF
    00C5 BB88      OUT	P18,R24
(0074)  	PORTA|=BIT(BITLK);		   
    00C6 9ADC      SBI	P1B,4
(0075)  	Delayus(50);				   
    00C7 E302      LDI	R16,0x32
    00C8 E010      LDI	R17,0
    00C9 DFB5      RCALL	_Delayus
(0076)  	PORTA&=~BIT(BITLK);	   
    00CA 98DC      CBI	P1B,4
(0077) 	
(0078) 	PORTD=0xFF;
    00CB EF8F      LDI	R24,0xFF
    00CC BB82      OUT	P12,R24
(0079) 	PORTA|=BIT(PA7);
    00CD 9ADF      SBI	P1B,7
(0080) 	Delayus(50);
    00CE E302      LDI	R16,0x32
    00CF E010      LDI	R17,0
    00D0 DFAE      RCALL	_Delayus
(0081) 	PORTA&=~BIT(PA7);
    00D1 98DF      CBI	P1B,7
(0082) 
(0083) 	
(0084) }
    00D2 9508      RET
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
(0001) /*******************************************
(0002)   文件:YJ1602.C
(0003)   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
(0004)   硬件:ATMEGA16芯片
(0005)   日期:2006年12月10日 
(0006)   功能:驱动开发板上的1602液晶
(0007)   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h>			//包含型号头文件
(0010) #include <macros.h>			//包含"位"操作头文件
(0011) #include <stdio.h>			//标准输入输出头文件
(0012) #include <AVR_PQ1A.h>		//包含自定义常量头文件
(0013) 
(0014) #pragma data:code
(0015) const uchar CGRAM[LCDa_CGMAX] =
(0016) {
(0017) 	//8*5字模
(0018) 	0x00,0x01,0x1F,0x11,0x1F,0x01,0x01,0x01,		// 第1、2行显示"中"字
(0019) 	0x00,0x00,0x1E,0x02,0x1E,0x00,0x00,0x00,		
(0020) 	0x00,0x01,0x1F,0x04,0x02,0x01,0x02,0x04,		// 第3、4行显示"文"字
(0021) 	0x00,0x00,0x1f,0x04,0x08,0x10,0x08,0x04,		
(0022) 	0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01,		// 第5、6行显示心型
(0023) 	0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,		
(0024) 	0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01,		// 第7、8行显示心型
(0025) 	0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,		
(0026) };
(0027) #pragma data:data
(0028) /*******************************************
(0029) 函数名称: LCD1602_portini
(0030) 功    能: 初始化1602液晶用到的IO口
(0031) 参    数: 无
(0032) 返回值  : 无
(0033) /********************************************/
(0034) void LCD1602_portini(void)
(0035) {
(0036) 	LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
_LCD1602_portini:
    00D3 B381      IN	R24,P11
    00D4 6780      ORI	R24,0x70
    00D5 BB81      OUT	P11,R24
(0037) 	LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
    00D6 B387      IN	R24,P17
    00D7 6F8F      ORI	R24,0xFF
    00D8 BB87      OUT	P17,R24
(0038) }
    00D9 9508      RET
_LCD1602_readbyte:
  dByte                --> R20
  DatCmd               --> R20
    00DA 940E01C4  CALL	push_gset1
    00DC 2F40      MOV	R20,R16
(0039) /*******************************************
(0040) 函数名称: LCD1602_readbyte
(0041) 功    能: 从1602液晶读出一个字节数据或者指令
(0042) 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
(0043) 返回值  : dByte--读回的数据或者指令
(0044) /********************************************/
(0045) uchar LCD1602_readbyte(uchar DatCmd)
(0046) {
(0047)  	uchar dByte;
(0048) 	if (DatCmd == iCmd)		 //指令操作
    00DD 2344      TST	R20
    00DE F411      BNE	0x00E1
(0049) 		LCDa_CLR_RS;
    00DF 9894      CBI	P12,4
    00E0 C001      RJMP	0x00E2
(0050) 	else
(0051) 		LCDa_SET_RS;
    00E1 9A94      SBI	P12,4
(0052) 		
(0053) 	LCDa_SET_RW;	   	  	 //读操作
    00E2 9A95      SBI	P12,5
(0054) 	LCDa_SET_E;
    00E3 9A96      SBI	P12,6
(0055) 	LCDa_DATA_DDR=0x00;	 //数据总线定义为输入
    00E4 2422      CLR	R2
    00E5 BA27      OUT	P17,R2
(0056) 	dByte=LCDa_DI;			 //读数据或者指令
    00E6 B346      IN	R20,P16
(0057) 	Delayms(1);				 //时序调整
    00E7 E001      LDI	R16,1
    00E8 E010      LDI	R17,0
    00E9 DFAD      RCALL	_Delayms
(0058) 	LCDa_CLR_E;	
    00EA 9896      CBI	P12,6
(0059) 	LCDa_DATA_DDR|=0xff;	 //数据总线还原为输出
    00EB B387      IN	R24,P17
    00EC 6F8F      ORI	R24,0xFF
    00ED BB87      OUT	P17,R24
(0060) 	return dByte;
    00EE 2F04      MOV	R16,R20
    00EF 940E01C7  CALL	pop_gset1
    00F1 9508      RET
_LCD1602_sendbyte:
  dByte                --> R20
  DatCmd               --> R22
    00F2 940E01DB  CALL	push_gset2
    00F4 2F42      MOV	R20,R18
    00F5 2F60      MOV	R22,R16
(0061) }
(0062) /*******************************************
(0063) 函数名称: LCD1602_sendbyte
(0064) 功    能: 向1602液晶写入一个字节数据或者指令
(0065) 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
(0066) 	  	  dByte--为写入1602的数据或者指令
(0067) 返回值  : 无
(0068) /********************************************/
(0069) void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
(0070) {
(0071) 	if (DatCmd == iCmd)		//指令操作
    00F6 2366      TST	R22
    00F7 F411      BNE	0x00FA
(0072) 		LCDa_CLR_RS;
    00F8 9894      CBI	P12,4
    00F9 C001      RJMP	0x00FB
(0073) 	else
(0074) 		LCDa_SET_RS;
    00FA 9A94      SBI	P12,4
(0075) 		
(0076) 	LCDa_CLR_RW;			//写操作
    00FB 9895      CBI	P12,5
(0077) 	LCDa_SET_E;
    00FC 9A96      SBI	P12,6
(0078) 	LCDa_DO = dByte;		//写入数据
    00FD BB48      OUT	P18,R20
(0079) 	Delayms(1);
    00FE E001      LDI	R16,1
    00FF E010      LDI	R17,0
    0100 DF96      RCALL	_Delayms
(0080) 	LCDa_CLR_E;	
    0101 9896      CBI	P12,6
(0081) }
    0102 940E01DF  CALL	pop_gset2
    0104 9508      RET
_LCD1602_sendstr:
  ptString             --> R20
    0105 940E01C4  CALL	push_gset1
    0107 01A8      MOVW	R20,R16
(0082) /*******************************************
(0083) 函数名称: LCD1602_sendstr
(0084) 功    能: 向1602液晶写入一个字符串
(0085) 参    数: ptString--字符串指针
(0086) 返回值  : 无
(0087) /********************************************/
(0088) void LCD1602_sendstr(uchar *ptString)
(0089) {
    0108 C005      RJMP	0x010E
(0090) 	while((*ptString)!='\0')		 //字符串未结束
(0091) 	{
(0092) 		LCD1602_sendbyte(iDat, *ptString++);
    0109 01FA      MOVW	R30,R20

⌨️ 快捷键说明

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