1602.lst

来自「10K到5MHz的频率测量」· LST 代码 · 共 1,887 行 · 第 1/4 页

LST
1,887
字号
__text_start:
__start:
      36 E5CF      LDI	R28,0x5F
      37 E0D4      LDI	R29,4
      38 BFCD      OUT	0x3D,R28
      39 BFDE      OUT	0x3E,R29
      3A 51CE      SUBI	R28,0x1E
      3B 40D0      SBCI	R29,0
      3C EA0A      LDI	R16,0xAA
      3D 8308      STD	Y+0,R16
      3E 2400      CLR	R0
      3F E7E0      LDI	R30,0x70
      40 E0F0      LDI	R31,0
      41 E010      LDI	R17,0
      42 38E9      CPI	R30,0x89
      43 07F1      CPC	R31,R17
      44 F011      BEQ	0x0047
      45 9201      ST	R0,Z+
      46 CFFB      RJMP	0x0042
      47 8300      STD	Z+0,R16
      48 E5EC      LDI	R30,0x5C
      49 E0F0      LDI	R31,0
      4A E6A0      LDI	R26,0x60
      4B E0B0      LDI	R27,0
      4C E010      LDI	R17,0
      4D E000      LDI	R16,0
      4E BF0B      OUT	0x3B,R16
      4F 36EC      CPI	R30,0x6C
      50 07F1      CPC	R31,R17
      51 F021      BEQ	0x0056
      52 95C8      LPM
      53 9631      ADIW	R30,1
      54 920D      ST	R0,X+
      55 CFF9      RJMP	0x004F
      56 940E 021C CALL	_main
_exit:
      58 CFFF      RJMP	_exit
FILE: D:\我的资源\我的文件\电子技术\AVR\AVR学习\JASON'~2\M16频率计(10K-5MHz,误差0.1%以下)(已验证)\1602.h
(0001) #define uchar unsigned char 
(0002) #define uint unsigned int 
(0003) 
(0004) #define RS 5
(0005) #define RW 6
(0006) #define EN 7
(0007) 
(0008) void s_ms(uint ms)
(0009) {
(0010) 	for(;ms>1;ms--);
_s_ms:
  ms                   --> R16
      59 C002      RJMP	0x005C
      5A 5001      SUBI	R16,1
      5B 4010      SBCI	R17,0
      5C E081      LDI	R24,1
      5D E090      LDI	R25,0
      5E 1780      CP	R24,R16
      5F 0791      CPC	R25,R17
      60 F3C8      BCS	0x005A
      61 9508      RET
_busy:
  temp                 --> R20
      62 934A      ST	R20,-Y
(0011) }	
(0012) 
(0013) //查忙
(0014) void busy(void)
(0015) {
(0016)     uchar temp;
(0017) 	PORTB&=~(1<<RS);    //RS=0
      63 98C5      CBI	0x18,5
(0018) 	s_ms(20);
      64 E104      LDI	R16,0x14
      65 E010      LDI	R17,0
      66 DFF2      RCALL	_s_ms
(0019) 	PORTB|=(1<<RW);     //RW=1
      67 9AC6      SBI	0x18,6
(0020) 	s_ms(20);
      68 E104      LDI	R16,0x14
      69 E010      LDI	R17,0
      6A DFEE      RCALL	_s_ms
      6B C01A      RJMP	0x0086
(0021) 	while(temp)
(0022) 	{
(0023) 		PORTB|=(1<<EN); //EN=1
      6C 9AC7      SBI	0x18,7
(0024) 		s_ms(20);
      6D E104      LDI	R16,0x14
      6E E010      LDI	R17,0
      6F DFE9      RCALL	_s_ms
(0025) 		DDRA=0x00;      //A口变输入
      70 2422      CLR	R2
      71 BA2A      OUT	0x1A,R2
(0026) 		PORTA=0xff;     //上拉使能
      72 EF8F      LDI	R24,0xFF
      73 BB8B      OUT	0x1B,R24
(0027) 		s_ms(20);
      74 E104      LDI	R16,0x14
      75 E010      LDI	R17,0
      76 DFE2      RCALL	_s_ms
(0028) 		temp = PINA&0x80;    //读取A口
      77 B349      IN	R20,0x19
      78 7840      ANDI	R20,0x80
(0029) 		s_ms(20);      
      79 E104      LDI	R16,0x14
      7A E010      LDI	R17,0
      7B DFDD      RCALL	_s_ms
(0030) 		DDRA=0xff;      
      7C EF8F      LDI	R24,0xFF
      7D BB8A      OUT	0x1A,R24
(0031) 		PORTA=0xff;        //A口变输出
      7E BB8B      OUT	0x1B,R24
(0032) 		s_ms(20);
      7F E104      LDI	R16,0x14
      80 E010      LDI	R17,0
      81 DFD7      RCALL	_s_ms
(0033) 		PORTB&=~(1<<EN);   //EN=0
      82 98C7      CBI	0x18,7
(0034) 		s_ms(20);
      83 E104      LDI	R16,0x14
      84 E010      LDI	R17,0
      85 DFD3      RCALL	_s_ms
      86 2344      TST	R20
      87 F721      BNE	0x006C
      88 9149      LD	R20,Y+
      89 9508      RET
_writecom:
  com                  --> R10
      8A 92AA      ST	R10,-Y
      8B 2EA0      MOV	R10,R16
(0035) 	}
(0036) }
(0037) 
(0038) //写指令
(0039) void writecom(uchar	com)
(0040) {
(0041) 	busy();
      8C DFD5      RCALL	_busy
(0042) 	s_ms(20);
      8D E104      LDI	R16,0x14
      8E E010      LDI	R17,0
      8F DFC9      RCALL	_s_ms
(0043) 	PORTB&=~(1<<RS);   //RS=0
      90 98C5      CBI	0x18,5
(0044) 	s_ms(20);
      91 E104      LDI	R16,0x14
      92 E010      LDI	R17,0
      93 DFC5      RCALL	_s_ms
(0045) 	PORTB&=~(1<<RW);   //RW=0
      94 98C6      CBI	0x18,6
(0046) 	s_ms(20);
      95 E104      LDI	R16,0x14
      96 E010      LDI	R17,0
      97 DFC1      RCALL	_s_ms
(0047) 	PORTB|=(1<<EN);    //EN=1
      98 9AC7      SBI	0x18,7
(0048) 	s_ms(20);
      99 E104      LDI	R16,0x14
      9A E010      LDI	R17,0
      9B DFBD      RCALL	_s_ms
(0049) 	PORTA = com;       //输出指令
      9C BAAB      OUT	0x1B,R10
(0050) 	s_ms(20);
      9D E104      LDI	R16,0x14
      9E E010      LDI	R17,0
      9F DFB9      RCALL	_s_ms
(0051) 	PORTB&=~(1<<EN);   //EN=0
      A0 98C7      CBI	0x18,7
(0052) 	s_ms(20);
      A1 E104      LDI	R16,0x14
      A2 E010      LDI	R17,0
      A3 DFB5      RCALL	_s_ms
      A4 90A9      LD	R10,Y+
      A5 9508      RET
(0053) }
(0054) 
(0055) //1602初始化
(0056) void	LcdInit(void)
(0057) {
(0058)     DDRA = 0xff; 
_LcdInit:
      A6 EF8F      LDI	R24,0xFF
      A7 BB8A      OUT	0x1A,R24
(0059)     PORTA = 0x00; 
      A8 2422      CLR	R2
      A9 BA2B      OUT	0x1B,R2
(0060) 	writecom(0x38);
      AA E308      LDI	R16,0x38
      AB DFDE      RCALL	_writecom
(0061) 	s_ms(20);
      AC E104      LDI	R16,0x14
      AD E010      LDI	R17,0
      AE DFAA      RCALL	_s_ms
(0062) 	writecom(0x01);
      AF E001      LDI	R16,1
      B0 DFD9      RCALL	_writecom
(0063) 	s_ms(1000);
      B1 EE08      LDI	R16,0xE8
      B2 E013      LDI	R17,3
      B3 DFA5      RCALL	_s_ms
(0064) 	s_ms(1000);
      B4 EE08      LDI	R16,0xE8
      B5 E013      LDI	R17,3
      B6 DFA2      RCALL	_s_ms
(0065) 	s_ms(1000);
      B7 EE08      LDI	R16,0xE8
      B8 E013      LDI	R17,3
      B9 DF9F      RCALL	_s_ms
(0066) 	writecom(0x02);
      BA E002      LDI	R16,2
      BB DFCE      RCALL	_writecom
(0067) 	s_ms(20);
      BC E104      LDI	R16,0x14
      BD E010      LDI	R17,0
      BE DF9A      RCALL	_s_ms
(0068) 	writecom(0x06);
      BF E006      LDI	R16,6
      C0 DFC9      RCALL	_writecom
(0069) 	s_ms(20);
      C1 E104      LDI	R16,0x14
      C2 E010      LDI	R17,0
      C3 DF95      RCALL	_s_ms
(0070) 	writecom(0x0c);
      C4 E00C      LDI	R16,0xC
      C5 DFC4      RCALL	_writecom
(0071) 	s_ms(20);
      C6 E104      LDI	R16,0x14
      C7 E010      LDI	R17,0
      C8 DF90      RCALL	_s_ms
(0072) 	writecom(0x38);	
      C9 E308      LDI	R16,0x38
      CA DFBF      RCALL	_writecom
(0073) 	s_ms(20);
      CB E104      LDI	R16,0x14
      CC E010      LDI	R17,0
      CD DF8B      RCALL	_s_ms
      CE 9508      RET
_writedata:
  data                 --> R10
      CF 92AA      ST	R10,-Y
      D0 2EA0      MOV	R10,R16
(0074) }	
(0075) 
(0076) //写数据
(0077) void	writedata(uchar data)
(0078) {
(0079) 	busy();
      D1 DF90      RCALL	_busy
(0080) 	s_ms(20);
      D2 E104      LDI	R16,0x14
      D3 E010      LDI	R17,0
      D4 DF84      RCALL	_s_ms
(0081) 	PORTB|=(1<<RS);   //RS=1
      D5 9AC5      SBI	0x18,5
(0082) 	s_ms(20);
      D6 E104      LDI	R16,0x14
      D7 E010      LDI	R17,0
      D8 DF80      RCALL	_s_ms
(0083) 	PORTB&=~(1<<RW);   //RW=0
      D9 98C6      CBI	0x18,6
(0084) 	s_ms(20);
      DA E104      LDI	R16,0x14
      DB E010      LDI	R17,0
      DC DF7C      RCALL	_s_ms
(0085) 	PORTB|=(1<<EN);    //EN=1
      DD 9AC7      SBI	0x18,7
(0086) 	s_ms(20);
      DE E104      LDI	R16,0x14
      DF E010      LDI	R17,0
      E0 DF78      RCALL	_s_ms
(0087) 	PORTA = data;      //输出数据
      E1 BAAB      OUT	0x1B,R10
(0088) 	s_ms(20);
      E2 E104      LDI	R16,0x14
      E3 E010      LDI	R17,0
      E4 DF74      RCALL	_s_ms
(0089) 	PORTB&=~(1<<EN);   //EN=0
      E5 98C7      CBI	0x18,7
(0090) 	s_ms(20);
      E6 E104      LDI	R16,0x14
      E7 E010      LDI	R17,0
      E8 DF70      RCALL	_s_ms
      E9 90A9      LD	R10,Y+
      EA 9508      RET
_readdata:
  temp                 --> R10
      EB 92AA      ST	R10,-Y
(0091) }
(0092) 
(0093) 
(0094) //读数据
(0095) uchar	readdata(void)
(0096) {
(0097) 	uchar temp;
(0098) 	busy();
      EC DF75      RCALL	_busy
(0099) 	s_ms(20);
      ED E104      LDI	R16,0x14
      EE E010      LDI	R17,0
      EF DF69      RCALL	_s_ms
(0100) 	PORTB|=(1<<RS);  //RS=1
      F0 9AC5      SBI	0x18,5
(0101) 	s_ms(20);
      F1 E104      LDI	R16,0x14
      F2 E010      LDI	R17,0
      F3 DF65      RCALL	_s_ms
(0102) 	PORTB|=(1<<RW);  //RW=1
      F4 9AC6      SBI	0x18,6
(0103) 	s_ms(20);
      F5 E104      LDI	R16,0x14
      F6 E010      LDI	R17,0
      F7 DF61      RCALL	_s_ms
(0104) 	PORTB|=(1<<EN);  //EN=1
      F8 9AC7      SBI	0x18,7
(0105) 	s_ms(20);
      F9 E104      LDI	R16,0x14
      FA E010      LDI	R17,0
      FB DF5D      RCALL	_s_ms
(0106) 	DDRA=0x00;       //A端口变输入
      FC 2422      CLR	R2
      FD BA2A      OUT	0x1A,R2
(0107) 	s_ms(20);
      FE E104      LDI	R16,0x14
      FF E010      LDI	R17,0
     100 DF58      RCALL	_s_ms
(0108) 	temp = PINA;     //读A端口
     101 B2A9      IN	R10,0x19
(0109) 	s_ms(20);
     102 E104      LDI	R16,0x14
     103 E010      LDI	R17,0
     104 DF54      RCALL	_s_ms
(0110) 	DDRA=0xff;       //A端口变输出
     105 EF8F      LDI	R24,0xFF
     106 BB8A      OUT	0x1A,R24
(0111) 	s_ms(20);
     107 E104      LDI	R16,0x14
     108 E010      LDI	R17,0
     109 DF4F      RCALL	_s_ms
(0112) 	PORTB&=~(1<<EN); //EN=0
     10A 98C7      CBI	0x18,7
(0113) 	s_ms(20);
     10B E104      LDI	R16,0x14
     10C E010      LDI	R17,0
     10D DF4B      RCALL	_s_ms
(0114) 	return temp;	
     10E 2D0A      MOV	R16,R10
     10F 90A9      LD	R10,Y+
     110 9508      RET
_WriteCGRAM:
  t                    --> R10
  i                    --> R20
  pBuffer              --> R22
  num                  --> R10
     111 940E 0418 CALL	push_xgsetF00C
     113 01B9      MOVW	R22,R18
     114 0158      MOVW	R10,R16
(0115) }
(0116) 
(0117) //=================================================
(0118) // 描述: 写LCD内部CGRAM函数
(0119) // 入口: ‘num’要写的数据个数
(0120) //        ‘pbuffer’要写的数据的首地址
(0121) // 出口: 无
(0122) //================================================
(0123) void	WriteCGRAM(uint	num, const uint	*pBuffer)
(0124) {
(0125) 	uint	i,t;
(0126) 	writecom(0x40);
     115 E400      LDI	R16,0x40
     116 DF73      RCALL	_writecom
(0127) 	PORTB|=(1<<RS);
     117 9AC5      SBI	0x18,5
(0128) 	PORTB&=~(1<<RW);
     118 98C6      CBI	0x18,6
(0129) 	for(i=num;i!=0;i--)
     119 01A5      MOVW	R20,R10
     11A C00A      RJMP	0x0125
(0130) 	{
(0131) 		t = *pBuffer;
     11B 01FB      MOVW	R30,R22
     11C 90A5      LPM	R10,Z+
     11D 90B4      LPM	R11,10(Z)
(0132) 		PORTB|=(1<<EN);
     11E 9AC7      SBI	0x18,7
(0133) 		PORTA = t;
     11F BAAB      OUT	0x1B,R10
(0134) 		PORTB&=~(1<<EN);				
     120 98C7      CBI	0x18,7
(0135) 		pBuffer++;
     121 5F6E      SUBI	R22,0xFE
     122 4F7F      SBCI	R23,0xFF
     123 5041      SUBI	R20,1
     124 4050      SBCI	R21,0
     125 3040      CPI	R20,0
     126 0745      CPC	R20,R21
     127 F799      BNE	0x011B
     128 940C 041F JMP	pop_xgsetF00C
_WriteMenu:
  t                    --> R10
  i                    --> R22
  pBuffer              --> R20
     12A 940E 0418 CALL	push_xgsetF00C
     12C 01A8      MOVW	R20,R16
(0136) 	}
(0137) 	
(0138) }
(0139) 
(0140) //=================================================
(0141) //描述:写菜单函数,本程序使用的LCD规格为 16 * 2
(0142) //入口:菜单数组首地址
(0143) //出口:无
(0144) //=================================================
(0145) void	WriteMenu(const uchar *pBuffer)
(0146) {
(0147) 	uchar	i,t;
(0148) 	writecom(0x80);   //数据地址
     12D E800      LDI	R16,0x80
     12E DF5B      RCALL	_writecom
(0149) 	
(0150) 	PORTB|=(1<<RS);
     12F 9AC5      SBI	0x18,5
(0151) 	PORTB&=~(1<<RW);
     130 98C6      CBI	0x18,6
(0152) 	s_ms(20);
     131 E104      LDI	R16,0x14
     132 E010      LDI	R17,0
     133 DF25      RCALL	_s_ms
(0153) 	for(i=0;i<16;i++)
     134 2766      CLR	R22
     135 C00B      RJMP	0x0141
(0154) 	{
(0155) 		t = *pBuffer;
     136 01FA      MOVW	R30,R20
     137 90A4      LPM	R10,11(Z)
(0156) 		PORTA = t;
     138 BAAB      OUT	0x1B,R10
(0157) 		PORTB|=(1<<EN);
     139 9AC7      SBI	0x18,7
(0158) 		s_ms(20);
     13A E104      LDI	R16,0x14
     13B E010      LDI	R17,0
     13C DF1C      RCALL	_s_ms
(0159) 		PORTB&=~(1<<EN);				
     13D 98C7      CBI	0x18,7
(0160) 		pBuffer++;
     13E 5F4F      SUBI	R20,0xFF
     13F 4F5F      SBCI	R21,0xFF
     140 9563      INC	R22
     141 3160      CPI	R22,0x10
     142 F398      BCS	0x0136
(0161) 	}
(0162) 	writecom(0xC0);
     143 EC00      LDI	R16,0xC0
     144 DF45      RCALL	_writecom
(0163) 
(0164) 	PORTB|=(1<<RS);
     145 9AC5      SBI	0x18,5
(0165) 	PORTB&=~(1<<RW);
     146 98C6      CBI	0x18,6
(0166) 	s_ms(20);	
     147 E104      LDI	R16,0x14
     148 E010      LDI	R17,0
     149 DF0F      RCALL	_s_ms
(0167) 	for(i=0;i<16;i++)
     14A 2766      CLR	R22
     14B C00B      RJMP	0x0157
(0168) 	{
(0169) 		t = *pBuffer;
     14C 01FA      MOVW	R30,R20
     14D 90A4      LPM	R10,11(Z)
(0170) 		PORTA = t;
     14E BAAB      OUT	0x1B,R10
(0171) 		PORTB|=(1<<EN);

⌨️ 快捷键说明

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