📄 251.lst
字号:
__start:
__text_start:
00B0 E5CF LDI R28,0x5F
00B1 E0D4 LDI R29,4
00B2 BFCD OUT 0x3D,R28
00B3 BFDE OUT 0x3E,R29
00B4 51C0 SUBI R28,0x10
00B5 40D0 SBCI R29,0
00B6 EA0A LDI R16,0xAA
00B7 8308 STD Y+0,R16
00B8 2400 CLR R0
00B9 EEEF LDI R30,0xEF
00BA E0F0 LDI R31,0
00BB E010 LDI R17,0
00BC 3FE1 CPI R30,0xF1
00BD 07F1 CPC R31,R17
00BE F011 BEQ 0x00C1
00BF 9201 ST R0,Z+
00C0 CFFB RJMP 0x00BC
00C1 8300 STD Z+0,R16
00C2 EDE0 LDI R30,0xD0
00C3 E0F0 LDI R31,0
00C4 E6A0 LDI R26,0x60
00C5 E0B0 LDI R27,0
00C6 E011 LDI R17,1
00C7 35EF CPI R30,0x5F
00C8 07F1 CPC R31,R17
00C9 F021 BEQ 0x00CE
00CA 95C8 LPM
00CB 9631 ADIW R30,1
00CC 920D ST R0,X+
00CD CFF9 RJMP 0x00C7
00CE D200 RCALL _main
_exit:
00CF CFFF RJMP _exit
FILE: D:\prog251\spi.h
(0001) //SPI Interface
(0002) #include <iom8v.h>
(0003) #include <macros.h>
(0004)
(0005) void SPIOutput(unsigned char data)
(0006) {
(0007) SPDR = data;//clockwise; //SPIOUTPUT
_SPIOutput:
data --> R16
00D0 B90F OUT 0x0F,R16
(0008) while ( !(SPSR & BIT(7)) ); //wait
00D1 9B77 SBIS 0x0E,7
00D2 CFFE RJMP 0x00D1
00D3 9508 RET
FILE: D:\prog251\lcd.h
(0001) //#include <iom48v.h>
(0002) //#include <macros.h>
(0003) //#include <lcd.h>
(0004)
(0005) #define uchar unsigned char
(0006) #define unint unsigned int
(0007)
(0008) #define SYSEN 0x01
(0009) #define LCDON 0x03
(0010) #define BIAS3 0x29
(0011)
(0012) #define cs_set PORTB |= BIT(1)//asm ("sbi 0x05,4") //portb1
(0013) #define cs_clr PORTB &= ~BIT(1)//asm ("cbi 0x05,4")
(0014)
(0015) #define clk_set PORTD |= BIT(0)//asm ("sbi 0x05,3") //pd0
(0016) #define clk_clr PORTD &= ~BIT(0)//asm ("cbi 0x05,3")
(0017)
(0018) #define dat_set PORTD |= BIT(1) //pd1
(0019) #define dat_clr PORTD &= ~BIT(1)
(0020)
(0021)
(0022) //7位液晶正向显示
(0023) //uchar lcdshow[11] = {0x77,0x30,0x6b,0x79,0x3c,0x5d,0x5f,0x70,0x7f,0x7d,0x00};
(0024) //7位液晶反响显示
(0025) //uchar lcdshow[11] = {0x77,0x06,0x6b,0x4f,0x1e,0x5d,0x7d,0x07,0x7f,0x5f,0x00};
(0026) //11位液晶正向显示
(0027) uchar lcdshow[11] = {0xfb,0xb0,0xed,0xfc,0xb6,0xde,0xdf,0xf2,0x7f,0xfe,0x00};
(0028)
(0029)
(0030) void delay()
(0031) {
(0032) NOP();
_delay:
00D4 0000 NOP
(0033) NOP();
00D5 0000 NOP
(0034) NOP();
00D6 0000 NOP
(0035) NOP();
00D7 0000 NOP
(0036) NOP();
00D8 0000 NOP
00D9 9508 RET
_send:
temp --> R20
n --> R22
sdata --> R10
00DA D8EE RCALL push_gset3
00DB 2F62 MOV R22,R18
00DC 2EA0 MOV R10,R16
(0037) }
(0038)
(0039) void send(uchar sdata,uchar n)
(0040) {
(0041) uchar temp;
(0042) for(;n>0;n--)
00DD C00C RJMP 0x00EA
(0043) {
(0044) temp = sdata & 0x80;
00DE 2D4A MOV R20,R10
00DF 7840 ANDI R20,0x80
(0045) if(temp)
00E0 F011 BEQ 0x00E3
(0046) dat_set;
00E1 9A91 SBI 0x12,1
00E2 C001 RJMP 0x00E4
(0047) else
(0048) dat_clr;
00E3 9891 CBI 0x12,1
(0049) clk_clr;
00E4 9890 CBI 0x12,0
(0050) delay();
00E5 DFEE RCALL _delay
(0051) clk_set;
00E6 9A90 SBI 0x12,0
(0052) delay();
00E7 DFEC RCALL _delay
(0053)
(0054) sdata = sdata << 1;
00E8 0CAA LSL R10
00E9 956A DEC R22
00EA 2422 CLR R2
00EB 1626 CP R2,R22
00EC F388 BCS 0x00DE
00ED D8D1 RCALL pop_gset3
00EE 9508 RET
(0055) }
(0056) }
(0057)
(0058) void init_lcd()
(0059) {
(0060) cs_clr; //片选信号为低,选通液晶
_init_lcd:
00EF 98C1 CBI 0x18,1
(0061) send(0x80,3);
00F0 E023 LDI R18,3
00F1 E800 LDI R16,0x80
00F2 DFE7 RCALL _send
(0062) send(SYSEN,9);
00F3 E029 LDI R18,0x9
00F4 E001 LDI R16,1
00F5 DFE4 RCALL _send
(0063) send(LCDON,9);
00F6 E029 LDI R18,0x9
00F7 E003 LDI R16,3
00F8 DFE1 RCALL _send
(0064) send(BIAS3,9);
00F9 E029 LDI R18,0x9
00FA E209 LDI R16,0x29
00FB DFDE RCALL _send
(0065)
(0066) cs_set; //片选信号为高
00FC 9AC1 SBI 0x18,1
(0067) clk_set; //片选时钟为高
00FD 9A90 SBI 0x12,0
00FE 9508 RET
_lcd_display:
showdata --> R20
m --> R22
p --> R10
lcdshow --> R12
00FF D8C7 RCALL push_gset4
0100 0159 MOVW R10,R18
0101 0168 MOVW R12,R16
0102 8568 LDD R22,Y+8
(0068) }
(0069)
(0070) void lcd_display(uchar lcdshow[],uchar *p,uchar m)
(0071) {
(0072) uchar showdata;
(0073) cs_clr;
0103 98C1 CBI 0x18,1
(0074) send(0xA0,9);
0104 E029 LDI R18,0x9
0105 EA00 LDI R16,0xA0
0106 DFD3 RCALL _send
(0075) for(;m>0;m--)
0107 C00D RJMP 0x0115
(0076) {
(0077) showdata = lcdshow[*p];
0108 01F5 MOVW R30,R10
0109 81E0 LDD R30,Z+0
010A 27FF CLR R31
010B 0DEC ADD R30,R12
010C 1DFD ADC R31,R13
010D 8140 LDD R20,Z+0
(0078) send(showdata,8);
010E E028 LDI R18,0x8
010F 2F04 MOV R16,R20
0110 DFC9 RCALL _send
(0079) p++;
0111 01C5 MOVW R24,R10
0112 9601 ADIW R24,1
0113 015C MOVW R10,R24
0114 956A DEC R22
0115 2422 CLR R2
0116 1626 CP R2,R22
0117 F380 BCS 0x0108
(0080) }
(0081) cs_set; //片选信号为高
0118 9AC1 SBI 0x18,1
(0082) clk_set; //片选时钟为高
0119 9A90 SBI 0x12,0
011A D8A6 RCALL pop_gset4
011B 9508 RET
FILE: D:\prog251\EEPROM.h
(0001) void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
(0002) {
(0003) /* 等待上一次写操作结束 */
(0004) while(EECR & (1<<EEWE))
_EEPROM_write:
ucData --> R18
uiAddress --> R16
011C 99E1 SBIC 0x1C,1
011D CFFE RJMP _EEPROM_write
(0005) ;
(0006) /* 设置地址和数据寄存器*/
(0007) EEAR = uiAddress;
011E BB1F OUT 0x1F,R17
011F BB0E OUT 0x1E,R16
(0008) EEDR = ucData;
0120 BB2D OUT 0x1D,R18
(0009) /* 置位EEMWE */
(0010) CLI();//防止下面两步被中断打断导致失败
0121 94F8 BCLR 7
(0011) EECR |= (1<<EEMWE);
0122 9AE2 SBI 0x1C,2
(0012) /* 置位EEWE 以启动写操作*/
(0013) EECR |= (1<<EEWE);
0123 9AE1 SBI 0x1C,1
(0014) SEI();
0124 9478 BSET 7
0125 9508 RET
(0015) }
(0016)
(0017) unsigned char EEPROM_read(unsigned int uiAddress)
(0018) {
(0019) /* 等待上一次写操作结束 */
(0020) while(EECR & (1<<EEWE))
_EEPROM_read:
uiAddress --> R16
0126 99E1 SBIC 0x1C,1
0127 CFFE RJMP _EEPROM_read
(0021) ;
(0022) /* 设置地址寄存器*/
(0023) EEAR = uiAddress;
0128 BB1F OUT 0x1F,R17
0129 BB0E OUT 0x1E,R16
(0024) /* 设置EERE 以启动读操作*/
(0025) EECR |= (1<<EERE);
012A 9AE0 SBI 0x1C,0
(0026) /* 自数据寄存器返回数据 */
(0027) return EEDR;
012B B30D IN R16,0x1D
012C 9508 RET
FILE: D:\prog251\251.c
(0001) //ICC-AVR application builder : 2008-7-3 10:08:15
(0002) // Target : M8
(0003) // Crystal: 4.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) #include "spi.h"
(0008) #include "lcd.h"
(0009) #include "EEPROM.h"
(0010)
(0011) #define uchar unsigned char
(0012) #define unint unsigned int
(0013)
(0014) //Global
(0015) #define MaxAngle 2880
(0016) #define RefreshFreq 10
(0017) #define ClockwiseMotor 0x80 //00000001
(0018)
(0019) //Speed
(0020) #define SpeedAvgSamples 4
(0021) #define MaxSpeed 140
(0022) #define PoleNum 16
(0023) #define Timer1Unit 2e-6
(0024) #define Timer1UnitMaxSpeed 202
(0025)
(0026) //N
(0027) #define NAvgSamples 4
(0028) #define MaxN 4000
(0029) #define PulseFreqper100Rpm 30
(0030) #define MaxNPulse (MaxN*PulseFreqper100Rpm/100/RefreshFreq) //1200Hz=120Pulses
(0031)
(0032) //Small meter
(0033) #define VoltageMotorBias 2 //AD0<-->MOTOR_BIT(2);
(0034) #define VoltageAvgSamples 4
(0035)
(0036)
(0037)
(0038) void motor(void);
(0039) void Calculate(void);
(0040) void MileageSaving(void);
(0041) void MileageLoding(void);
(0042) void Parallel(void);
(0043)
(0044) void LCDDecoding(void);
(0045) void ParallelOutput(void);
(0046) void KeyMileageCurrentClear(void);
(0047) void AlarmCalculate(void);
(0048)
(0049) //GLOBAL VARIABLES
(0050) //SIGNALS
(0051) uchar MotorBlocked = 0;
(0052) uchar CalculateBlocked = 0;
(0053) uchar ParallelBlocked = 0;
(0054) uchar Timer0Div = 0;
(0055) uchar MileageSaveBlocked = 1;
(0056)
(0057) //For speed calculation
(0058) uchar TimeIntervalRefreshed = 0;
(0059) uchar SpeedUltraLow = 1;
(0060) unsigned long int TimeInterval = 100000*5;
(0061) unsigned long int TimeIntervalAvg = 100000*5;
(0062) //For N calculation
(0063) unint NPulseCnt = 0;
(0064) unint NPulse = 0;
(0065) unint NPulseAvg = 0;
(0066)
(0067) //Small meters
(0068) uchar ADCCurrentChannel = 0;
(0069) unint Voltage[6]={0,0,0,0,0,0};
(0070) unint VoltageAvg[6]={0,0,0,0,0,0};
(0071) uchar VoltageRefreshed[6]={0,0,0,0,0,0};
(0072) #include "251SmallMeterDataTable.h"
(0073)
(0074) //Mileage
(0075) unsigned long int mileage = 0,MileageCurrent = 0;
(0076) unint MileagePulseCnt = 0;
(0077) uchar MileageSaved = 1;
(0078)
(0079)
(0080) //MOTOR POSITION
(0081) SpeedMotorCurrent = MaxAngle; //for initialize
(0082) SpeedMotorSetting = 0;
(0083) NMotorCurrent = MaxAngle;
(0084) NMotorSetting = 0;
(0085) unint VoltageMotorSetting[6] = {0,0,0,0,0,0};
(0086) unint VoltageMotorCurrent[6] = {MaxAngle,MaxAngle,MaxAngle,MaxAngle,MaxAngle,MaxAngle};
(0087)
(0088) //Parallel Output
(0089) unint ParallelOutputCmd;
(0090)
(0091) //LCD
(0092) uchar LCDContent[13] = {0,1,2,3,4,5,6,8,8,7,8,9,10};
(0093)
(0094) //Alarm
(0095) #define ThresholdOil 166
(0096) #define ThresholdTemp 186
(0097) #define ThresholdOilP 145
(0098) #define ThresholdAir 339
(0099) #define ThresholdVoltL 300
(0100) #define ThresholdVoltH 450
(0101) #define AlarmLedOil 5
(0102) #define AlarmLedTemp 7
(0103) #define AlarmLedOilP 6
(0104) #define AlarmLedAir1 8
(0105) #define AlarmLedAir2 9
(0106) #define AlarmLedVoltL 10
(0107) #define AlarmLedVoltH 11
(0108) const unint SpeedAlarm[4] = {
(0109) (Timer1UnitMaxSpeed*MaxSpeed/20),
(0110) (Timer1UnitMaxSpeed*MaxSpeed/40),
(0111) (Timer1UnitMaxSpeed*MaxSpeed/60),
(0112) (Timer1UnitMaxSpeed*MaxSpeed/100)};
(0113) const uchar SpeedAlarmOut[4] = {
(0114) 2,
(0115) 3,
(0116) 4,
(0117) 1};
(0118)
(0119)
(0120) void port_init(void)
(0121) {
(0122) PORTB = 0x84;
_port_init:
012D E884 LDI R24,0x84
012E BB88 OUT 0x18,R24
(0123) DDRB = 0xef;
012F EE8F LDI R24,0xEF
0130 BB87 OUT 0x17,R24
(0124) PORTC = 0x00; //m103 output only
0131 2422 CLR R2
0132 BA25 OUT 0x15,R2
(0125) DDRC = 0x40;
0133 E480 LDI R24,0x40
0134 BB84 OUT 0x14,R24
(0126) PORTD = 0xA0;
0135 EA80 LDI R24,0xA0
0136 BB82 OUT 0x12,R24
(0127) DDRD = 0x23;
0137 E283 LDI R24,0x23
0138 BB81 OUT 0x11,R24
0139 9508 RET
(0128) }
(0129)
(0130) //TIMER0 initialize - prescale:8
(0131) // WGM: 0) Normal, TOP=0xFFFF
(0132) // desired value: 0.05Sec
(0133) // actual value: 0.05Sec (0.0%)
(0134) // Generate 0.1s event. For calculating & N meter counting
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -