📄 m16eeprom.lst
字号:
__text_start:
__start:
002D E5CF LDI R28,0x5F
002E E0D4 LDI R29,4
002F BFCD OUT 0x3D,R28
0030 BFDE OUT 0x3E,R29
0031 51C0 SUBI R28,0x10
0032 40D0 SBCI R29,0
0033 EA0A LDI R16,0xAA
0034 8308 STD Y+0,R16
0035 2400 CLR R0
0036 E6E5 LDI R30,0x65
0037 E0F0 LDI R31,0
0038 E011 LDI R17,1
0039 36E5 CPI R30,0x65
003A 07F1 CPC R31,R17
003B F011 BEQ 0x003E
003C 9201 ST R0,Z+
003D CFFB RJMP 0x0039
003E 8300 STD Z+0,R16
003F E5E4 LDI R30,0x54
0040 E0F0 LDI R31,0
0041 E6A0 LDI R26,0x60
0042 E0B0 LDI R27,0
0043 E010 LDI R17,0
0044 35E9 CPI R30,0x59
0045 07F1 CPC R31,R17
0046 F021 BEQ 0x004B
0047 95C8 LPM
0048 9631 ADIW R30,1
0049 920D ST R0,X+
004A CFF9 RJMP 0x0044
004B 940E00CE CALL _main
_exit:
004D CFFF RJMP _exit
_ChangeIntToHex:
dec --> R20
004E 940E0165 CALL push_gset1
0050 01A8 MOVW R20,R16
FILE: F:\job\M16学习板\EEPROM实验(实验八)\..\ICC_H\SOFTWARE.h
(0001) /*********************************************************************
(0002) 微 雪 电 子 WaveShare http://www.waveShare.net
(0003)
(0004) 目 的: 建立AVR的软件提取库,增加各类补丁,方便系统程序移植
(0005)
(0006) 目标系统: 基于AVR单片机
(0007)
(0008) 应用软件: ICCAVR
(0009)
(0010) 版 本: Version 1.0
(0011)
(0012) 圆版时间: 2005-06-25
(0013)
(0014) 开发人员: SEE
(0015)
(0016) 说 明: 若用于商业用途,请保留此段文字或注明代码来源
(0017)
(0018) 深 圳 微 雪 电 子 保 留 所 有 的 版 权
(0019) *********************************************************************/
(0020)
(0021) /*01010101010101010101010101010101010101010101010101010101010101010101
(0022) ----------------------------------------------------------------------
(0023) 版本更新记录:
(0024)
(0025) ----------------------------------------------------------------------
(0026) 入口参数说明:
(0027)
(0028) ----------------------------------------------------------------------
(0029) 待定参数说明:
(0030)
(0031) ----------------------------------------------------------------------
(0032) 对外变量说明:
(0033)
(0034) ----------------------------------------------------------------------
(0035) 对外函数说明:
(0036)
(0037) ----------------------------------------------------------------------
(0038) 10101010101010101010101010101010101010101010101010101010101010101010*/
(0039)
(0040) #ifndef Software_H
(0041) #define Software_H
(0042)
(0043) #include <math.h>
(0044) #include <string.h>
(0045)
(0046) /* 兼容一般程序员的常用写法 */
(0047) typedef unsigned char uchar;
(0048) typedef unsigned int uint;
(0049) typedef unsigned long ulong;
(0050) typedef signed char schar;
(0051) typedef signed int sint;
(0052) typedef signed long slong;
(0053)
(0054) /* 为方便移植,建议使用下面写法 */
(0055) typedef unsigned char bool;
(0056) typedef unsigned char bit;
(0057) typedef unsigned char uint8;
(0058) typedef unsigned int uint16;
(0059) typedef unsigned long uint32;
(0060) typedef signed char sint8;
(0061) typedef signed int sint16;
(0062) typedef signed long sint32;
(0063) typedef signed char int8;
(0064) typedef signed int int16;
(0065) typedef signed long int32;
(0066) //typedef const code;
(0067)
(0068) /* 一般程序定义的默认值 */
(0069) #define NULL 0
(0070) #define EOF -1
(0071) #define TRUE 1
(0072) #define FALSE 0
(0073) #define ON 1
(0074) #define OFF 0
(0075) #define ENABLE 1
(0076) #define DISABLE 0
(0077) #define CRR 1
(0078) #define ERR 0
(0079) #define RIGHT 1
(0080) #define WRONG 0
(0081) #define SUCCESS 1
(0082) #define FAILURE 0
(0083) //#define PI 3.1415926 //3.1415926535897932
(0084)
(0085) /* 如果你手头上的RAM实在很紧,不如尝试下面的define~ */
(0086) //#define _CALLOC(a) ( (a *)calloc(n,sizeof(a)) )
(0087) //#define _MALLOC(a) ( (a *)malloc(sizeof(a)) )
(0088) //#define _MIN(a,b) ( (a) < (b) ? (a) : (b) )
(0089) //#define _MAX(a,b) ( (a) > (b) ? (a) : (b) )
(0090) //#define _EXCHANGE(a,b) { int t; t=a; a=b; b=t; }
(0091) //#define _TOLOWER(c) ( (c)+32 )
(0092) //#define _TOUPPER(c) ( (c)-32 )
(0093)
(0094) //#ifndef BIT
(0095) //#define BIT(x) ( 1<<(x) )
(0096) //#endif
(0097)
(0098) /*--------------------------------------------------------------------
(0099) 函数全称:数据拆字
(0100) 函数功能:自己看~
(0101) 注意事项:D<=999999,C<=6
(0102) 提示说明:调用speaData(12,2),得到dataElem[0]=2,dataElem[1]=1
(0103) 输 入:
(0104) 返 回:无
(0105) --------------------------------------------------------------------
(0106) uint8 dataElem[6];
(0107) void speaData(uint32 dat,sint8 len)
(0108) {
(0109) uint8 i;
(0110) uint32 j,y;
(0111) for(i=0,j=1;i<len;i++)
(0112) {
(0113) y=dat/j;
(0114) dataElem[i]=y%10;
(0115) j*=10;
(0116) }
(0117) }
(0118) /*--------------------------------------------------------------------
(0119) 函数全称:十进制强制转换为十六进制
(0120) 函数功能:
(0121) 注意事项:
(0122) 提示说明:调用changeIntToHex(33),return 0x33
(0123) 输 入:
(0124) 返 回:
(0125) --------------------------------------------------------------------*/
(0126) #define changeIntToHex(dec) ( ( ((dec)/10) <<4 ) + ((dec)%10) )
(0127) /*--------------------------------------------------------------------
(0128) 函数全称:十进制强制转换为十六进制
(0129) 函数功能:
(0130) 注意事项:
(0131) 提示说明:调用changeIntToHex(33),return 0x33
(0132) 输 入:
(0133) 返 回:
(0134) --------------------------------------------------------------------*/
(0135) void ChangeIntToHex( uchar *dec)
(0136) {
(0137) *dec = (((*dec)/10) <<4 )|((*dec)%10) ;
0051 01FA MOVW R30,R20
0052 8020 LDD R2,Z+0
0053 2433 CLR R3
0054 E01A LDI R17,0xA
0055 2D02 MOV R16,R2
0056 940E0145 CALL mod8u
0058 2E40 MOV R4,R16
0059 E01A LDI R17,0xA
005A 2D02 MOV R16,R2
005B 940E0147 CALL div8u
005D 2F80 MOV R24,R16
005E 708F ANDI R24,0xF
005F 9582 SWAP R24
0060 2984 OR R24,R4
0061 01FA MOVW R30,R20
0062 8380 STD Z+0,R24
0063 940E0168 CALL pop_gset1
0065 9508 RET
(0138) }
(0139) /*--------------------------------------------------------------------
(0140) 函数全称:十进制化为十六进制,并以十进制格式返回
(0141) 函数功能:
(0142) 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳
(0143) 提示说明:调用converseIntToHex(33),return 21
(0144) 输 入:
(0145) 返 回:
(0146) --------------------------------------------------------------------/
(0147) #define converseIntToHex(dec) ( ( ((dec)>>4) *10 ) + ((dec)%16) )
(0148) /*--------------------------------------------------------------------
(0149) 函数全称:十六进制强制转换为十进制
(0150) 函数功能:
(0151) 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳
(0152) 提示说明:调用changeHexToInt(0x33),return 33
(0153) 输 入:
(0154) 返 回:
(0155) --------------------------------------------------------------------*/
(0156) #define changeHexToInt(hex) ( ( ((hex)>>4) *10 ) + ((hex)%16) )
(0157) /*--------------------------------------------------------------------
(0158) 函数全称:十六进制强制转换为十进制
(0159) 函数功能:
(0160) 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳
(0161) 提示说明:调用changeHexToInt(0x33),return 33
(0162) 输 入:
(0163) 返 回:
(0164) --------------------------------------------------------------------*/
(0165) void ChangeHexToInt(uchar *hex)
(0166) {
(0167) *hex = (((*hex)>>4) *10 ) + ((*hex)&0x0f);
_ChangeHexToInt:
hex --> R16
0066 01F8 MOVW R30,R16
0067 8020 LDD R2,Z+0
0068 2433 CLR R3
0069 2D82 MOV R24,R2
006A 9582 SWAP R24
006B 708F ANDI R24,0xF
006C E09A LDI R25,0xA
006D 9F98 MUL R25,R24
006E 2D82 MOV R24,R2
006F 708F ANDI R24,0xF
0070 2C20 MOV R2,R0
0071 0E28 ADD R2,R24
0072 8220 STD Z+0,R2
0073 9508 RET
(0168) }
(0169) /*--------------------------------------------------------------------
(0170) 函数全称:十六进制化为十进制,,并以十六进制格式返回
(0171) 函数功能:
(0172) 注意事项:
(0173) 提示说明:调用converseHexToInt(0x33),return 0x51
(0174) 输 入:
(0175) 返 回:
(0176) --------------------------------------------------------------------*/
(0177) #define converseHexToInt(hex) ( ( ((hex)/10) <<4 ) + ((hex)%10) )
(0178)
(0179) void Delay(void)
(0180) {
(0181) uchar i;
(0182) i = 200;
_Delay:
i --> R16
0074 EC08 LDI R16,0xC8
(0183) while(i--);
0075 2E20 MOV R2,R16
0076 2433 CLR R3
0077 5001 SUBI R16,1
0078 2022 TST R2
0079 F7D9 BNE 0x0075
007A 9508 RET
FILE: F:\job\M16学习板\EEPROM实验(实验八)\EEprom.c
(0001) /*******************************************************************
(0002) 实验八
(0003) 实验名称: AVR单片机内部EEPROM实验
(0004) 实验目的: 学习AVR单片机的内部的EEPROM的读写
(0005) 实验现象: 通过串口发送字符串给EEPROM,M16 512个字节,发送@R,读EEPROM
(0006) 中的内容,并通过串口发送给PC机
(0007) 环 境: ICCAVR6.31A
(0008) 设 计 者: shinea8868
(0009) 说 明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
(0010) 作商业用途请保留本段文字
(0011) 完成日期: 2007年4月10日
(0012) *******************************************************************/
(0013) #include <iom16v.h>
(0014) #include <macros.h>
(0015) #include "..\ICC_H\SOFTWARE.h"
(0016)
(0017) uchar RecvFlag = 0; //串口接收到的数据
(0018) uchar Flag = 0; //为1时表示接收到了@,如果紧接着收到
(0019) //R则发送EEPROM中的数据
(0020) uint EEpromAdd = 0; //存储在EEPROM中的地址
(0021) uchar temp[255],tempcnt = 0; //暂存数据
(0022) uchar temp1; //暂存串口接收到的数据
(0023) /*-----------------------------------------------------------------
(0024) 函数名称: void EepromWrite (uint addr, uchar val)
(0025) 函数功能: EEPROM的写程序
(0026) 参 数: num 写的字符个数,
(0027) addr 存放的首地址
(0028) *val 存储数据的首地址
(0029) 返 回 值: 无
(0030) -----------------------------------------------------------------*/
(0031) void EepromWrite ( uint addr, uchar val)
(0032) {
(0033) while ( EECR&0x02 ); //判断EEWE是否为0
_EepromWrite:
val --> R18
addr --> R16
007B 99E1 SBIC 0x1C,1
007C CFFE RJMP _EepromWrite
(0034) EEAR = addr;
007D BB1F OUT 0x1F,R17
007E BB0E OUT 0x1E,R16
(0035) EEDR = val;
007F BB2D OUT 0x1D,R18
(0036) CLI();
0080 94F8 BCLR 7
(0037) EECR = EECR|0x04; //置EEMWE为1
0081 9AE2 SBI 0x1C,2
(0038) EECR = EECR|0x02; //置EEWE为1
0082 9AE1 SBI 0x1C,1
(0039) SEI();
0083 9478 BSET 7
0084 9508 RET
_EepromRead:
val --> R20
addr --> R18
num --> R16
0085 940E0165 CALL push_gset1
0087 814A LDD R20,Y+2
0088 815B LDD R21,Y+3
(0040) }
(0041) /*-----------------------------------------------------------------
(0042) 函数名称: void EepromRead (uchar num, uint addr, uchar *val)
(0043) 函数功能: EEPROM的写程序
(0044) 参 数: num 读的字符个数,
(0045) addr 读字符的首地址
(0046) *val 读数据的暂存的首地址
(0047) 返 回 值: 无
(0048) -----------------------------------------------------------------*/
(0049) void EepromRead (uchar num, uint addr, uchar *val)
(0050) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -