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

📄 pro.lst

📁 数字频率计数字频率计数字频率计数字频率计
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    005A E5CF      LDI	R28,0x5F
    005B E0D4      LDI	R29,4
    005C BFCD      OUT	0x3D,R28
    005D BFDE      OUT	0x3E,R29
    005E 51C0      SUBI	R28,0x10
    005F 40D0      SBCI	R29,0
    0060 EA0A      LDI	R16,0xAA
    0061 8308      STD	Y+0,R16
    0062 2400      CLR	R0
    0063 ECE0      LDI	R30,0xC0
    0064 E0F0      LDI	R31,0
    0065 E010      LDI	R17,0
    0066 3CEE      CPI	R30,0xCE
    0067 07F1      CPC	R31,R17
    0068 F011      BEQ	0x006B
    0069 9201      ST	R0,Z+
    006A CFFB      RJMP	0x0066
    006B 8300      STD	Z+0,R16
    006C E5E4      LDI	R30,0x54
    006D E0F0      LDI	R31,0
    006E E6A0      LDI	R26,0x60
    006F E0B0      LDI	R27,0
    0070 E010      LDI	R17,0
    0071 3BE4      CPI	R30,0xB4
    0072 07F1      CPC	R31,R17
    0073 F021      BEQ	0x0078
    0074 95C8      LPM
    0075 9631      ADIW	R30,1
    0076 920D      ST	R0,X+
    0077 CFF9      RJMP	0x0071
    0078 940E04F8  CALL	_main
_exit:
    007A CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    007B 940E064C  CALL	push_gset2
    007D 01B8      MOVW	R22,R16
FILE: E:\张秋伟\我的实验\数字频率计\LCD_PORT.h
(0001) #include <iom16v.h>			//包含型号头文件
(0002) #include <macros.h>			//包含"位"操作头文件
(0003) 
(0004) /******************数据类型宏定义******************/
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007) 
(0008) /*******************************************
(0009) 函数名称: Delayus
(0010) 功    能: 延时指定微秒(8M晶振)
(0011) 参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0012) 返回值  : 无
(0013) /********************************************/
(0014) void Delayus(uint US)		  
(0015) {
(0016)  uint i;
(0017)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    007E E005      LDI	R16,5
    007F E010      LDI	R17,0
    0080 019B      MOVW	R18,R22
    0081 940E0600  CALL	empy16s
    0083 01B8      MOVW	R22,R16
    0084 9576      LSR	R23
    0085 9567      ROR	R22
    0086 9576      LSR	R23
    0087 9567      ROR	R22
(0018)  for( i=0;i<US;i++); 
    0088 2744      CLR	R20
    0089 2755      CLR	R21
    008A C002      RJMP	0x008D
    008B 5F4F      SUBI	R20,0xFF
    008C 4F5F      SBCI	R21,0xFF
    008D 1746      CP	R20,R22
    008E 0757      CPC	R21,R23
    008F F3D8      BCS	0x008B
    0090 940E0640  CALL	pop_gset2
    0092 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    0093 940E064C  CALL	push_gset2
(0019) }
(0020) /*******************************************
(0021) 函数名称: Delayms
(0022) 功    能: 延时指定毫秒(8M晶振)
(0023) 参    数: MS--延时的毫秒数
(0024) 返回值  : 无
(0025) /********************************************/
(0026) void Delayms(uint MS)		  
(0027) {
(0028)  uint i,j;
(0029)  for( i=0;i<MS;i++)
    0095 2744      CLR	R20
    0096 2755      CLR	R21
    0097 C00B      RJMP	0x00A3
(0030)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    0098 2766      CLR	R22
    0099 2777      CLR	R23
    009A C002      RJMP	0x009D
    009B 5F6F      SUBI	R22,0xFF
    009C 4F7F      SBCI	R23,0xFF
    009D 3765      CPI	R22,0x75
    009E E0E4      LDI	R30,4
    009F 077E      CPC	R23,R30
    00A0 F3D0      BCS	0x009B
    00A1 5F4F      SUBI	R20,0xFF
    00A2 4F5F      SBCI	R21,0xFF
    00A3 1740      CP	R20,R16
    00A4 0751      CPC	R21,R17
    00A5 F390      BCS	0x0098
    00A6 940E0640  CALL	pop_gset2
    00A8 9508      RET
FILE: E:\张秋伟\我的实验\数字频率计\12864.c
(0001) /*******************************************
(0002)   文件:12864.C
(0003)   环境:编译为ICC AVR6.31
(0004) ********************************************
(0005) 1 VSS -->接地
(0006) 2 VDD -->电源VCC
(0007) 3 V0  -->高电平
(0008) 4 RS(CS) --> PB4
(0009) 5 RW(STD)-->PB5
(0010) 6 E      --> PB6
(0011) 7 ~~~14 -->PA0~~PA7 (输出数据总线)
(0012) 15 PSB-->VCC
(0013) 16 NC
(0014) 17 RST-->VCC
(0015) 18 NC
(0016) 19 LEDA -->VCC
(0017) 20 LEDB -->GND
(0018) /******************************************/
(0019) #include <iom16v.h>			//包含型号头文件
(0020) #include <macros.h>			//包含"位"操作头文件
(0021) #include "LCD_PORT.h"		//包含自定义常量头文件
(0022) 
(0023) 
(0024) /*******************************************
(0025) 函数名称: LCD12864_portini
(0026) 功    能: 初始化12864液晶用到的IO口
(0027) 参    数: 无
(0028) 返回值  : 无
(0029) /********************************************/
(0030) void LCD12864_portini(void)
(0031) {
(0032) 	LCDb_CTRL_DDR |= BIT(LCDb_RS)|BIT(LCDb_RW)|BIT(LCDb_E)|BIT(LCDb_RST);//配置控制管脚为输出
_LCD12864_portini:
    00A9 B387      IN	R24,0x17
    00AA 6F80      ORI	R24,0xF0
    00AB BB87      OUT	0x17,R24
(0033) 	LCDb_DATA_DDR |= 0xFF;  //配置数据管脚为输出
    00AC B38A      IN	R24,0x1A
    00AD 6F8F      ORI	R24,0xFF
    00AE BB8A      OUT	0x1A,R24
(0034) 	LCDb_SET_RST;		//不使能复位端
    00AF 9AC7      SBI	0x18,7
    00B0 9508      RET
_LCD12864_readbyte:
  dByte                --> R20
  DatCmd               --> R20
    00B1 940E064E  CALL	push_gset1
    00B3 2F40      MOV	R20,R16
(0035) }
(0036) /*******************************************
(0037) 函数名称: LCD12864_readbyte
(0038) 功    能: 从12864液晶读出一个字节数据或者指令
(0039) 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
(0040) 返回值  : dByte--读回的数据或者指令
(0041) /********************************************/
(0042) uchar LCD12864_readbyte(uchar DatCmd)
(0043) {
(0044)  	uchar dByte;
(0045) 	if (DatCmd == iCmd)		 //指令操作
    00B4 2344      TST	R20
    00B5 F411      BNE	0x00B8
(0046) 		LCDb_CLR_RS;
    00B6 98C4      CBI	0x18,4
    00B7 C001      RJMP	0x00B9
(0047) 	else
(0048) 		LCDb_SET_RS;
    00B8 9AC4      SBI	0x18,4
(0049) 		
(0050) 	LCDb_SET_RW;	   	  	 //读操作
    00B9 9AC5      SBI	0x18,5
(0051) 	LCDb_SET_E;
    00BA 9AC6      SBI	0x18,6
(0052) 	LCDb_DATA_DDR=0x00;	 //数据总线定义为输入
    00BB 2422      CLR	R2
    00BC BA2A      OUT	0x1A,R2
(0053) 	dByte=LCDb_DI;			 //读数据或者指令
    00BD B349      IN	R20,0x19
(0054) 	Delayms(1);				 //时序调整
    00BE E001      LDI	R16,1
    00BF E010      LDI	R17,0
    00C0 DFD2      RCALL	_Delayms
(0055) 	LCDb_CLR_E;	
    00C1 98C6      CBI	0x18,6
(0056) 	LCDb_DATA_DDR|=0xff;	 //数据总线还原为输出
    00C2 B38A      IN	R24,0x1A
    00C3 6F8F      ORI	R24,0xFF
    00C4 BB8A      OUT	0x1A,R24
(0057) 	return dByte;
    00C5 2F04      MOV	R16,R20
    00C6 940E0651  CALL	pop_gset1
    00C8 9508      RET
_LCD12864_sendbyte:
  dByte                --> R20
  DatCmd               --> R22
    00C9 940E064C  CALL	push_gset2
    00CB 2F42      MOV	R20,R18
    00CC 2F60      MOV	R22,R16
(0058) }
(0059) /*******************************************
(0060) 函数名称: LCD12864_sendbyte
(0061) 功    能: 向12864液晶写入一个字节数据或者指令
(0062) 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
(0063) 	  	  dByte--为写入12864的数据或者指令
(0064) 返回值  : 无
(0065) /********************************************/
(0066) void LCD12864_sendbyte(uchar DatCmd, uchar dByte)
(0067) {
(0068) 	if (DatCmd == iCmd)		//指令操作
    00CD 2366      TST	R22
    00CE F411      BNE	0x00D1
(0069) 		LCDb_CLR_RS;
    00CF 98C4      CBI	0x18,4
    00D0 C001      RJMP	0x00D2
(0070) 	else
(0071) 		LCDb_SET_RS;
    00D1 9AC4      SBI	0x18,4
(0072) 		
(0073) 	LCDb_CLR_RW;			//写操作
    00D2 98C5      CBI	0x18,5
(0074) 	LCDb_SET_E;
    00D3 9AC6      SBI	0x18,6
(0075) 	LCDb_DO = dByte;		//写入数据
    00D4 BB4B      OUT	0x1B,R20
(0076) 	Delayus(100);
    00D5 E604      LDI	R16,0x64
    00D6 E010      LDI	R17,0
    00D7 DFA3      RCALL	_Delayus
(0077) 	LCDb_CLR_E;	
    00D8 98C6      CBI	0x18,6
    00D9 940E0640  CALL	pop_gset2
    00DB 9508      RET
_LCD12864_sendstr:
  ptString             --> R20
    00DC 940E064E  CALL	push_gset1
    00DE 01A8      MOVW	R20,R16
(0078) }
(0079) /*******************************************
(0080) 函数名称: LCD12864_sendstr
(0081) 功    能: 向12864液晶写入一个字符串
(0082) 参    数: ptString--字符串指针
(0083) 返回值  : 无
(0084) /********************************************/
(0085) void LCD12864_sendstr(uchar *ptString)
(0086) {
    00DF C005      RJMP	0x00E5
(0087) 	while((*ptString)!='\0')		 //字符串未结束一直写
(0088) 	{
(0089) 		LCD12864_sendbyte(iDat, *ptString++);
    00E0 01FA      MOVW	R30,R20
    00E1 9121      LD	R18,Z+
    00E2 01AF      MOVW	R20,R30
    00E3 E001      LDI	R16,1
    00E4 DFE4      RCALL	_LCD12864_sendbyte
    00E5 01FA      MOVW	R30,R20
    00E6 8020      LDD	R2,Z+0
    00E7 2022      TST	R2
    00E8 F7B9      BNE	0x00E0
    00E9 940E0651  CALL	pop_gset1
    00EB 9508      RET
(0090) 	}
(0091) }
(0092) /*******************************************
(0093) 函数名称: LCD12864_clear
(0094) 功    能: 12864液晶清屏
(0095) 参    数: 无
(0096) 返回值  : 无
(0097) /********************************************/
(0098) void LCD12864_clear(void)
(0099) {
(0100) 	LCD12864_sendbyte(iCmd,LCDb_CLS);
_LCD12864_clear:
    00EC E021      LDI	R18,1
    00ED 2700      CLR	R16
    00EE DFDA      RCALL	_LCD12864_sendbyte
(0101) 	Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
    00EF E002      LDI	R16,2
    00F0 E010      LDI	R17,0
    00F1 DFA1      RCALL	_Delayms
    00F2 9508      RET
_LCD12864_readBF:
  busy                 --> R20
    00F3 940E064E  CALL	push_gset1
(0102) }
(0103) /*******************************************
(0104) 函数名称: LCD12864_readBF
(0105) 功    能: 12864液晶清屏
(0106) 参    数: 无
(0107) 返回值  : busy--为1时忙,为0时可以接收指令
(0108) /********************************************/
(0109) uchar LCD12864_readBF(void)
(0110) {	  
(0111) 	uchar busy;
(0112) 	busy=LCD12864_readbyte(iCmd);		//读回BF标志和地址
    00F5 2700      CLR	R16
    00F6 DFBA      RCALL	_LCD12864_readbyte
    00F7 2F40      MOV	R20,R16
(0113) 	if(busy&0x80)						//如果忙,返回忙状态
    00F8 FF07      SBRS	R16,7
    00F9 C002      RJMP	0x00FC
(0114) 		busy=1;
    00FA E041      LDI	R20,1
    00FB C001      RJMP	0x00FD
(0115) 	else	   							//不忙,可以写入
(0116) 		busy=0;
    00FC 2744      CLR	R20
(0117) 	return busy;
    00FD 2F04      MOV	R16,R20
    00FE 940E0651  CALL	pop_gset1
    0100 9508      RET
_LCD12864_gotoXY:
  Col                  --> R20
  Row                  --> R22
    0101 940E064C  CALL	push_gset2
    0103 2F42      MOV	R20,R18
    0104 2F60      MOV	R22,R16
(0118) }
(0119) /*******************************************
(0120) 函数名称: LCD12864_gotoXY
(0121) 功    能: 移动到指定位置
(0122) 参    数: Row--指定的行
(0123) 	  	  Col--指定的列
(0124) 返回值  : 无
(0125) /********************************************/
(0126) void LCD12864_gotoXY(uchar Row, uchar Col)
(0127) {	
(0128) 	switch (Row)		  //选择行
    0105 2777      CLR	R23
    0106 3062      CPI	R22,2
    0107 E0E0      LDI	R30,0
    0108 077E      CPC	R23,R30
    0109 F049      BEQ	0x0113
    010A 3063      CPI	R22,3
    010B E0E0      LDI	R30,0
    010C 077E      CPC	R23,R30
    010D F051      BEQ	0x0118
    010E 3064      CPI	R22,4
    010F E0E0      LDI	R30,0
    0110 077E      CPC	R23,R30
    0111 F059      BEQ	0x011D
    0112 C00F      RJMP	0x0122
(0129) 	{
(0130) 		case 2:
(0131) 			LCD12864_sendbyte(iCmd, LCDb_L2 + Col); break;	//写入第2行的指定列
    0113 2F24      MOV	R18,R20
    0114 5720      SUBI	R18,0x70
    0115 2700      CLR	R16
    0116 DFB2      RCALL	_LCD12864_sendbyte
    0117 C00E      RJMP	0x0126
(0132) 		case 3:
(0133) 			LCD12864_sendbyte(iCmd, LCDb_L3 + Col); break;	//写入第3行的指定列
    0118 2F24      MOV	R18,R20
    0119 5728      SUBI	R18,0x78
    011A 2700      CLR	R16
    011B DFAD      RCALL	_LCD12864_sendbyte
    011C C009      RJMP	0x0126
(0134) 		case 4:
(0135) 			LCD12864_sendbyte(iCmd, LCDb_L4 + Col); break;	//写入第4行的指定列	
    011D 2F24      MOV	R18,R20
    011E 5628      SUBI	R18,0x68
    011F 2700      CLR	R16
    0120 DFA8      RCALL	_LCD12864_sendbyte
    0121 C004      RJMP	0x0126
(0136) 		default:
(0137) 			LCD12864_sendbyte(iCmd, LCDb_L1 + Col); break;	//写入第1行的指定列	
    0122 2F24      MOV	R18,R20
    0123 5820      SUBI	R18,0x80
    0124 2700      CLR	R16
    0125 DFA3      RCALL	_LCD12864_sendbyte
    0126 940E0640  CALL	pop_gset2
    0128 9508      RET
(0138) 	}
(0139) }
(0140) /*******************************************
(0141) 函数名称: LCD12864_initial
(0142) 功    能: 12864液晶初始化
(0143) 参    数: 无
(0144) 返回值  : 无
(0145) /********************************************/
(0146) void LCD12864_initial(void)
(0147) {
(0148) 	Delayms(100);				// 等待内部复位
_LCD12864_initial:
    0129 E604      LDI	R16,0x64
    012A E010      LDI	R17,0
    012B DF67      RCALL	_Delayms
(0149) 	LCD12864_portini();			//端口初始化
    012C DF7C      RCALL	_LCD12864_portini
(0150) 	
(0151) 	LCD12864_sendbyte(iCmd, LCDb_FUNCTION);	//功能、模式设定

⌨️ 快捷键说明

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