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

📄 251.lst

📁 卡车仪表的单片机程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -