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

📄 main.lis

📁 AVRMega16单片机的项目
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0322           ;           suba -> R22
 0322           ;           wsla -> R20
                        .even
 0322           _I2C_RecvInfo::
 0322 0E940000          xcall push_gset2
 0326 622F              mov R22,R18
 0328 402F              mov R20,R16
 032A           ; }
 032A           ; 
 032A           ; //向I2C器件发送字符串
 032A           ; void I2C_RecvInfo(uchar wsla, uchar suba, uchar *szBuff, uchar num)
 032A           ; {
 032A           ;      I2cSendData[0] = wsla;
 032A 40930000          sts _I2cSendData,R20
 032E           ;        I2cSendData[1] = suba;
 032E 60930100          sts _I2cSendData+1,R22
 0332           ;        
 0332           ;        //接收功能的变量
 0332           ;      I2cReceiveDataLength = num;
 0332 0E80              ldd R0,y+6
 0334 00920300          sts _I2cReceiveDataLength,R0
 0338           ;      I2cReceiveDataIndex  = 0;         //从0开始计算
 0338 2224              clr R2
 033A 20920200          sts _I2cReceiveDataIndex,R2
 033E           ;        
 033E           ;        //发送命令的变量
 033E           ;      I2cSendDataIndex     = 0;   //专为子地址才有此代码
 033E 20920400          sts _I2cSendDataIndex,R2
 0342           ;        I2cSendDataLength    = 1;       
 0342 81E0              ldi R24,1
 0344 80930500          sts _I2cSendDataLength,R24
 0348           ;        gbi2cSendByteStatus  = FALSE;
 0348 20920800          sts _gbi2cSendByteStatus,R2
 034C           ;        
 034C           ;        //先启动I2C传送写从地址和子地址
 034C           ;        i2cSendStart();
 034C B1DF              xcall _i2cSendStart
 034E           L58:
 034E           L59:
 034E           ; 	 
 034E           ; 	 //再重启I2C传送,仅写从地址
 034E           ; 	 while(!gbi2cSendByteStatus); //等到已发送子地址后,可以接收数据
 034E 20900800          lds R2,_gbi2cSendByteStatus
 0352 2220              tst R2
 0354 E1F3              breq L58
 0356           ;        
 0356           ;        I2cSendData[0] = wsla+1;
 0356 842F              mov R24,R20
 0358 8F5F              subi R24,255    ; addi 1
 035A 80930000          sts _I2cSendData,R24
 035E           ;        i2cSendStart();
 035E A8DF              xcall _i2cSendStart
 0360           L56:
 0360 0E940000          xcall pop_gset2
 0364                   .dbline 0 ; func end
 0364 0895              ret
 0366           ;          cByte -> y+5
 0366           ;          SegNo -> R20
                        .even
 0366           _Zlg7290_SendChar::
 0366 3A93              st -y,r19
 0368 2A93              st -y,r18
 036A 0E940000          xcall push_gset1
 036E 402F              mov R20,R16
 0370 2397              sbiw R28,3
 0372           ; }
 0372           ; 
 0372           ; //向ZLG7290发送单个字节
 0372           ; void Zlg7290_SendChar(uchar SegNo, uchar cByte)
 0372           ; {
 0372           ;      I2C_SendInfo(WriteZlg7290Addr, DPRAM0+SegNo, &cByte, 1);
 0372 81E0              ldi R24,1
 0374 8A83              std y+2,R24
 0376 CE01              movw R24,R28
 0378 0596              adiw R24,5
 037A 9983              std y+1,R25
 037C 8883              std y+0,R24
 037E 242F              mov R18,R20
 0380 205F              subi R18,240    ; addi 16
 0382 00E7              ldi R16,112
 0384 ABDF              xcall _I2C_SendInfo
 0386           L61:
 0386 2396              adiw R28,3
 0388 0E940000          xcall pop_gset1
 038C 2296              adiw R28,2
 038E                   .dbline 0 ; func end
 038E 0895              ret
                        .even
 0390           _Zlg7290_ReadKey::
 0390 2397              sbiw R28,3
 0392           ; }
 0392           ; 
 0392           ; //从ZLG7290读取单个字节
 0392           ; uchar Zlg7290_ReadKey(void)
 0392           ; {
 0392           ;      gbi2cRecvByteStatus = FALSE;
 0392 2224              clr R2
 0394 20920700          sts _gbi2cRecvByteStatus,R2
 0398           ;        
 0398           ;      //需从键值寄存器读取哪个键被按下
 0398           ;      I2C_RecvInfo(WriteZlg7290Addr, 0x01, 0, 1);
 0398 81E0              ldi R24,1
 039A 8A83              std y+2,R24
 039C 3324              clr R3
 039E 3982              std y+1,R3
 03A0 2882              std y+0,R2
 03A2 21E0              ldi R18,1
 03A4 00E7              ldi R16,112
 03A6 BDDF              xcall _I2C_RecvInfo
 03A8           L63:
 03A8           L64:
 03A8           ; 	 
 03A8           ; 	 //等到接收到回应
 03A8           ; 	 while (!gbi2cRecvByteStatus && I2cReceiveDataIndex < 1);
 03A8 20900700          lds R2,_gbi2cRecvByteStatus
 03AC 2220              tst R2
 03AE 21F4              brne L66
 03B0 80910200          lds R24,_I2cReceiveDataIndex
 03B4 8130              cpi R24,1
 03B6 C0F3              brlo L63
 03B8           L66:
 03B8           ; 	 
 03B8           ; 	 return I2cReceiveData[0];
 03B8 00911000          lds R16,_I2cReceiveData
 03BC           L62:
 03BC 2396              adiw R28,3
 03BE                   .dbline 0 ; func end
 03BE 0895              ret
 03C0           ;            num -> R22
 03C0           ;         szData -> R20,R21
                        .even
 03C0           _M41T0_SendInfo::
 03C0 0E940000          xcall push_gset2
 03C4 622F              mov R22,R18
 03C6 A801              movw R20,R16
 03C8 2397              sbiw R28,3
 03CA           ; }
 03CA           ; 
 03CA           ; //向M41T0发送多个字节,此处为时间(格式为:秒-分-小时-星期-日-月-年-控制字)
 03CA           ; void M41T0_SendInfo(uchar *szData, uchar num)
 03CA           ; { 
 03CA           ;      I2C_SendInfo(WriteM41T0Addr, 0/*从秒开始*/, szData, num);
 03CA 6A83              std y+2,R22
 03CC 5983              std y+1,R21
 03CE 4883              std y+0,R20
 03D0 2227              clr R18
 03D2 00ED              ldi R16,208
 03D4 83DF              xcall _I2C_SendInfo
 03D6           L67:
 03D6 2396              adiw R28,3
 03D8 0E940000          xcall pop_gset2
 03DC                   .dbline 0 ; func end
 03DC 0895              ret
 03DE           ;            num -> R22
 03DE           ;         szData -> R20,R21
                        .even
 03DE           _M41T0_ReadInfo::
 03DE 0E940000          xcall push_gset2
 03E2 622F              mov R22,R18
 03E4 A801              movw R20,R16
 03E6 2397              sbiw R28,3
 03E8           ; }
 03E8           ; 
 03E8           ; //从M41T0读取多个字节,此处为时间(格式为:秒-分-小时-星期-日-月-年-控制字)
 03E8           ; void M41T0_ReadInfo(uchar *szData, uchar num)
 03E8           ; {
 03E8           ;      if (num != 8)
 03E8 6830              cpi R22,8
 03EA 09F0              breq L69
 03EC           ;          return;
 03EC 1CC0              xjmp L68
 03EE           L69:
 03EE           ;      
 03EE           ;      gbi2cRecvByteStatus = FALSE;
 03EE 2224              clr R2
 03F0 20920700          sts _gbi2cRecvByteStatus,R2
 03F4           ;        
 03F4           ;      //需从寄存器读取时间
 03F4           ;      I2C_RecvInfo(WriteM41T0Addr, 0x0/*从秒开始*/, 0/*忽略*/, 8);
 03F4 88E0              ldi R24,8
 03F6 8A83              std y+2,R24
 03F8 3324              clr R3
 03FA 3982              std y+1,R3
 03FC 2882              std y+0,R2
 03FE 2227              clr R18
 0400 00ED              ldi R16,208
 0402 8FDF              xcall _I2C_RecvInfo
 0404           L71:
 0404           L72:
 0404           ; 	 
 0404           ; 	 //等到接收到回应
 0404           ; 	 while (!gbi2cRecvByteStatus && I2cReceiveDataIndex < 8);
 0404 20900700          lds R2,_gbi2cRecvByteStatus
 0408 2220              tst R2
 040A 21F4              brne L74
 040C 80910200          lds R24,_I2cReceiveDataIndex
 0410 8830              cpi R24,8
 0412 C0F3              brlo L71
 0414           L74:
 0414           ; 	 
 0414           ; 	 memcpy((void *)szData, (void *)I2cReceiveData, num);     
 0414 262E              mov R2,R22
 0416 3324              clr R3
 0418 3982              std y+1,R3
 041A 2882              std y+0,R2
 041C 20E0              ldi R18,<_I2cReceiveData
 041E 30E0              ldi R19,>_I2cReceiveData
 0420 8A01              movw R16,R20
 0422 0E940000          xcall _memcpy
 0426           L68:
 0426 2396              adiw R28,3
 0428 0E940000          xcall pop_gset2
 042C                   .dbline 0 ; func end
 042C 0895              ret
 042E           ;          _20ms -> R16,R17
                        .even
 042E           _start_timer0::
 042E           ; }
 042E           ; 
 042E           ; 
 042E           ; 
 042E           ; 
 042E           ; 
 042E           ; 
 042E           ; 
 042E           ; 
 042E           ; 
 042E           ; /**********************************************************************
 042E           ; functionName:void start_timer0(void)
 042E           ; description:定时器0初始化
 042E           ;             desired value: 20mSec
 042E           ; 			actual value:  19.861mSec (0.7%)
 042E           ; **********************************************************************/
 042E           ; void start_timer0(uint _20ms)
 042E           ; {
 042E           ;     TCCR0 = 0x00;       //stop
 042E 2224              clr R2
 0430 23BE              out 0x33,R2
 0432           ;     TCNT0 = 0x71;
 0432 81E7              ldi R24,113
 0434 82BF              out 0x32,R24
 0436           ;       
 0436           ;       TIMSK |= 0x01;      // 定时器0溢出中断
 0436 89B7              in R24,0x39
 0438 8160              ori R24,1
 043A 89BF              out 0x39,R24
 043C           ;       OCR0  = 0x8F;       // 定时器比较值
 043C 8FE8              ldi R24,143
 043E 8CBF              out 0x3c,R24
 0440           ;       
 0440           ;       gTmr0OvrCount = _20ms;
 0440 10930A00          sts _gTmr0OvrCount+1,R17
 0444 00930900          sts _gTmr0OvrCount,R16
 0448           ;       
 0448           ;       TCCR0 = 0x05;           // Count clock/1024, start Timer0
 0448 85E0              ldi R24,5
 044A 83BF              out 0x33,R24
 044C           L75:
 044C                   .dbline 0 ; func end
 044C 0895              ret
                        .even
 044E           _stop_time0::
 044E           ; }
 044E           ; 
 044E           ; /**********************************************************************
 044E           ; functionName:void stop_time0(void)
 044E           ; description:停止定时器0
 044E           ; **********************************************************************/
 044E           ; void stop_time0(void)
 044E           ; {
 044E           ;     TCCR0 = 0x00; //stop
 044E 2224              clr R2
 0450 23BE              out 0x33,R2
 0452           ;     
 0452           ;     gTmr0OvrCount = 0;  
 0452 3324              clr R3
 0454 30920A00          sts _gTmr0OvrCount+1,R3
 0458 20920900          sts _gTmr0OvrCount,R2
 045C           L76:
 045C                   .dbline 0 ; func end
 045C 0895              ret
 045E           ;          _20ms -> R16,R17
                        .even
 045E           _start_timer2::
 045E           ; }
 045E           ; 
 045E           ; 
 045E           ; /**********************************************************************
 045E           ; functionName:void start_timer2(void)
 045E           ; description:定时器2初始化
 045E           ;             desired value: 20mSec
 045E           ; 			actual value:  19.861mSec (0.7%)
 045E           ; **********************************************************************/
 045E           ; void start_timer2(uint _20ms)
 045E           ; {
 045E           ;     TCCR2 = 0x00;       //stop
 045E 2224              clr R2
 0460 25BC              out 0x25,R2
 0462           ;       ASSR  = 0x00;       //set async mode
 0462 22BC              out 0x22,R2
 0464           ;     TCNT2 = 0x71;
 0464 81E7              ldi R24,113
 0466 84BD              out 0x24,R24
 0468           ;       
 0468           ;       TIMSK |= 0x40;      // 定时器2溢出中断
 0468 89B7              in R24,0x39
 046A 8064              ori R24,64
 046C 89BF              out 0x39,R24
 046E           ;       OCR2  = 0x8F;       // 定时器比较值

⌨️ 快捷键说明

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