📄 main.lis
字号:
.module main.c
.area data(ram, con, rel)
0000 _UartRecvIndex::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 _gbRecvPCFrameCmd::
0001 .blkb 1
.area idata
0001 00 .byte 0
.area data(ram, con, rel)
0002 _I2cReceiveDataIndex::
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 _I2cReceiveDataLength::
0003 .blkb 1
.area idata
0003 00 .byte 0
.area data(ram, con, rel)
0004 _I2cSendDataIndex::
0004 .blkb 1
.area idata
0004 00 .byte 0
.area data(ram, con, rel)
0005 _I2cSendDataLength::
0005 .blkb 1
.area idata
0005 00 .byte 0
.area data(ram, con, rel)
0006 _gbi2cSendCmdStatus::
0006 .blkb 1
.area idata
0006 01 .byte 1
.area data(ram, con, rel)
0007 _gbi2cRecvByteStatus::
0007 .blkb 1
.area idata
0007 00 .byte 0
.area data(ram, con, rel)
0008 _gbi2cSendByteStatus::
0008 .blkb 1
.area idata
0008 00 .byte 0
.area data(ram, con, rel)
0009 _gTmr0OvrCount::
0009 .blkb 2
.area idata
0009 0000 .word 0
.area data(ram, con, rel)
000B _gTmr2OvrCount::
000B .blkb 2
.area idata
000B 0000 .word 0
.area data(ram, con, rel)
000D _cKeyRiseEvent::
000D .blkb 1
.area idata
000D 00 .byte 0
.area data(ram, con, rel)
000E _gnCurrentFlashPage::
000E .blkb 2
.area idata
000E 0000 .word 0
.area data(ram, con, rel)
0010 _gnCurrentBytesBlock::
0010 .blkb 2
.area idata
0010 0000 .word 0
.area data(ram, con, rel)
0012 _gnHistoryFlashPage::
0012 .blkb 2
.area idata
0012 0000 .word 0
.area data(ram, con, rel)
0014 _gnHistoryBytesBlock::
0014 .blkb 2
.area idata
0014 0000 .word 0
.area data(ram, con, rel)
.area text(rom, con, rel)
; loop -> R16,R17
.even
0000 _SoftDelay::
0000 ; /**********************************************************************************************************
0000 ; 陕 西 立 方 电 子 有 限 公 司
0000 ; Copyright (C), 2000-2008, LiFang Tech. Co., Ltd.
0000 ; File name: // main.c
0000 ; Author:zhuxz Version:v3.1 Date: 2008-8-29
0000 ; Description: // 用于详细说明此程序文件完成的主要功能,与其他模块
0000 ; // 或函数的接口,输出值、取值范围、含义及参数间的控
0000 ; // 制、顺序、独立或依赖等关系
0000 ; Others: // 其它内容的说明
0000 ; 集成开发环境:ICCAVR6.31A
0000 ; 主控芯片型号: ATMega16
0000 ; 晶振频率: 外部 7.3728MHZ
0000 ; 波特率: 9600
0000 ; **********************************************************************************************************/
0000 ;
0000 ; #include <macros.h>
0000 ; #include <string.h>
0000 ; #include <stdlib.h>
0000 ; #include <iom16v.h>
0000 ; #include "main.h"
0000 ; #include "initial.h"
0000 ; #include "m500a.h"
0000 ;
0000 ;
0000 ; #define TW_MR_SLA_ACK 0x40
0000 ; #define TW_MR_SLA_NACK 0x48
0000 ; #define TW_MR_DATA_ACK 0x50
0000 ; #define TW_MR_DATA_NACK 0x58
0000 ; #define TW_MTR_ARB_LOST 0x38
0000 ; #define TW_MT_DATA_NACK 0x30
0000 ; #define TW_MT_DATA_ACK 0x28
0000 ; #define TW_MT_SLA_NACK 0x20
0000 ; #define TW_MT_SLA_ACK 0x18
0000 ; #define TW_REP_START 0x10
0000 ; #define TW_START 0x08
0000 ;
0000 ; /*******************************************************************************
0000 ; * AT45Db081数据存储格式:第1页记录当前已写入页号和字节数;
0000 ; * 第2页到第21页未黑名单记录;
0000 ; * 第22页开始为消费记录;
0000 ; * 其中,消费记录数据为4字节IC卡号+4字节余额+12字节时间,共20字节。
0000 ; * 例如:2008年9月1日 14点40分30秒 刷卡剩余20.56元,字符串为:
0000 ; * "t4s22056080901144030"
0000 ; *******************************************************************************/
0000 ; /*******************************************************************************
0000 ; * 串口通信格式格式:1> 要求上传消费记录命令格式为:"$000000000000$",共14个字节;
0000 ; * 2> 擦除芯片所有数据命令格式为:"@000000000000@",共14个字节;
0000 ; * 3> 设定时钟芯片的时间格式为:"%08090114403000%",共14个字节;
0000 ; * 4> 初始化芯片的命令格式为:"#000000000000#",共14个字节;
0000 ; * 5> 消费记录数据格式见AT45D081存储格式部分描述。
0000 ; * 6> 对应命令的回应信息格式为:成功-"$!"/"@!"/"%!",
0000 ; * 失败-"$x"/"@x"/"%x"。
0000 ; * 7> 传输结束的信息格式为:"@#$%"。
0000 ; *******************************************************************************/
0000 ; #define RECVBUFFERLEN 14
0000 ; //UART接收到PC缓冲区的长度
0000 ; uchar UartRecvBuffer[RECVBUFFERLEN];
0000 ; //UART接收缓冲区的索引
0000 ; uchar UartRecvIndex = 0;
0000 ; //接收PC传来的UART完整一桢数据包标志
0000 ; uchar gbRecvPCFrameCmd = 0;
0000 ;
0000 ;
0000 ; //MFRC500芯片的串号
0000 ; uchar Snr_RC500[4];
0000 ;
0000 ;
0000 ; //定义I2C总线的数据
0000 ; //MCU I2C接收数据的缓存参数定义
0000 ; uchar I2cReceiveDataIndex = 0;
0000 ; uchar I2cReceiveDataLength= 0;
0000 ; uchar I2cReceiveData[16];
0000 ; //MCU I2C发送数据的缓存参数定义
0000 ; uchar I2cSendData[16];
0000 ; uchar I2cSendDataIndex = 0;
0000 ; uchar I2cSendDataLength = 0;
0000 ;
0000 ; //表明与I2C器件的通信状态(成功:TRUE/失败:FALSE)
0000 ; uchar gbi2cSendCmdStatus = TRUE;
0000 ; //MCU接收到I2C器件字节标志
0000 ; uchar gbi2cRecvByteStatus = FALSE;
0000 ; //MCU发送出字节标志
0000 ; uchar gbi2cSendByteStatus = FALSE;
0000 ;
0000 ; //Timer0溢出次数,用来控制刷卡时间
0000 ; uint gTmr0OvrCount = 0;
0000 ; //Timer2溢出次数,用来控制流水时间
0000 ; uint gTmr2OvrCount = 0;
0000 ;
0000 ; //键盘中断标志
0000 ; uchar cKeyRiseEvent = 0;
0000 ;
0000 ;
0000 ; //FLASH地址操作的变量
0000 ; uint gnCurrentFlashPage = 0; //当前操作的页地址
0000 ; uint gnCurrentBytesBlock = 0; //当前页内的字节块
0000 ;
0000 ; uint gnHistoryFlashPage = 0; //历史操作的页地址
0000 ; uint gnHistoryBytesBlock = 0; //历史页内的字节块
0000 ;
0000 ;
0000 ;
0000 ; //Timer2定时产生间隔来读取M41T0器件的当前时间
0000 ;
0000 ;
0000 ;
0000 ; void SoftDelay(void)
0000 ; {
0000 ; uint loop = 0;
0000 0027 clr R16
0002 1127 clr R17
0004 02C0 xjmp L5
0006 L2:
0006 L3:
0006 0F5F subi R16,255 ; offset = 1
0008 1F4F sbci R17,255
000A L5:
000A ;
000A ; for (loop = 0; loop <1000; loop++);
000A 083E cpi R16,232
000C E3E0 ldi R30,3
000E 1E07 cpc R17,R30
0010 D0F3 brlo L2
0012 L1:
0012 .dbline 0 ; func end
0012 0895 ret
0014 ; senddata -> R16
.even
0014 _Uart_Send::
0014 ; }
0014 ;
0014 ; /*******************************************************************************
0014 ; ** 串口发送字节子程序
0014 ; *******************************************************************************/
0014 ; void Uart_Send(uchar senddata)
0014 ; {
0014 ; UDR = senddata;
0014 0CB9 out 0xc,R16
0016 L7:
0016 L8:
0016 ;
0016 ; while(!(UCSRA & (1<<UDRE))); //等待发送完
0016 5D9B sbis 0xb,5
0018 FECF rjmp L7
001A ;
001A ; UCSRA |= 0x40; //清“发送完”标志位
001A 5E9A sbi 0xb,6
001C L6:
001C .dbline 0 ; func end
001C 0895 ret
001E ; cData -> R16
.even
001E _SPI_MasterTransmit::
001E ; }
001E ;
001E ;
001E ; /*******************************************************************************
001E ; ** SPI发送字节子程序
001E ; *******************************************************************************/
001E ; void SPI_MasterTransmit(uchar cData)
001E ; {
001E ; /* 启动数据传输 */
001E ; SPDR = cData;
001E 0FB9 out 0xf,R16
0020 L11:
0020 L12:
0020 ; /* 等待传输结束 */
0020 ; while(!(SPSR & (1<<SPIF)));
0020 779B sbis 0xe,7
0022 FECF rjmp L11
0024 L10:
0024 .dbline 0 ; func end
0024 0895 ret
0026 ; cData -> R20
0026 ; byteAddr -> R22,R23
0026 ; page -> R10,R11
.even
0026 _SPI_ReadPageCtx::
0026 0E940000 xcall push_gset3
002A B901 movw R22,R18
002C 5801 movw R10,R16
002E ; }
002E ;
002E ; //读取某页内字节地址的命令
002E ; uchar SPI_ReadPageCtx(uint page/*0~4095*/, uint byteAddr/*0~263*/)
002E ; {
002E ; uchar cData=0;
002E 4427 clr R20
0030 ;
0030 ; CLRBIT(PORTB,4);
0030 C498 cbi 0x18,4
0032 ;
0032 ; SPI_MasterTransmit(0x52); //CMD, 1st
0032 02E5 ldi R16,82
0034 F4DF xcall _SPI_MasterTransmit
0036 ;
0036 ; cData = 0x1F & ((char)(page>>7));
0036 27E0 ldi R18,7
0038 30E0 ldi R19,0
003A 8501 movw R16,R10
003C 0E940000 xcall lsr16
0040 402F mov R20,R16
0042 4F71 andi R20,31
0044 ; SPI_MasterTransmit(cData);//Page Addr High,2nd
0044 042F mov R16,R20
0046 EBDF xcall _SPI_MasterTransmit
0048 ;
0048 ; cData = ((char)(page & 0x7F))<<1;
0048 4A2D mov R20,R10
004A 4F77 andi R20,127
004C 5070 andi R21,0
004E 440F lsl R20
0050 ; cData |= (char)((byteAddr & 0x1FF)>>8);
0050 CB01 movw R24,R22
0052 9170 andi R25,1
0054 892F mov R24,R25
0056 9927 clr R25
0058 482B or R20,R24
005A ; SPI_MasterTransmit(cData);//Page Addr low,3rd
005A 042F mov R16,R20
005C E0DF xcall _SPI_MasterTransmit
005E ;
005E ; cData = (char)(byteAddr & 0xFF);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -