📄 main.lis
字号:
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 + -