📄 display.lst
字号:
__text_start:
__start:
0034 E5CF LDI R28,0x5F
0035 E0D4 LDI R29,4
0036 BFCD OUT 0x3D,R28
0037 BFDE OUT 0x3E,R29
0038 51C0 SUBI R28,0x10
0039 40D0 SBCI R29,0
003A EA0A LDI R16,0xAA
003B 8308 STD Y+0,R16
003C 2400 CLR R0
003D E6E6 LDI R30,0x66
003E E0F0 LDI R31,0
003F E010 LDI R17,0
0040 37E8 CPI R30,0x78
0041 07F1 CPC R31,R17
0042 F011 BEQ 0x0045
0043 9201 ST R0,Z+
0044 CFFB RJMP 0x0040
0045 8300 STD Z+0,R16
0046 E6E2 LDI R30,0x62
0047 E0F0 LDI R31,0
0048 E6A0 LDI R26,0x60
0049 E0B0 LDI R27,0
004A E010 LDI R17,0
004B 36E8 CPI R30,0x68
004C 07F1 CPC R31,R17
004D F021 BEQ 0x0052
004E 95C8 LPM
004F 9631 ADIW R30,1
0050 920D ST R0,X+
0051 CFF9 RJMP 0x004B
0052 940E00DA CALL _main
_exit:
0054 CFFF RJMP _exit
FILE: F:\我的设计\delphi\uartdispy\mcu\main.c
(0001) /*********************************Copyright (c)*********************************
(0002) **
(0003) ** 文 件 名: main.c
(0004) ** 最后修改日期: 2005年06月8日
(0005) ** 描 述: 主函数
(0006) ** 版 本: V1.0
(0007) ** 主 控 芯 片:M16 晶振频率:8 MHZ
(0008) *******************************************************************************/
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011) #include "define.h"
(0012) #include "function.h"
(0013) #include "defineDS18B20.h"
(0014) #include "defineLCD.h"
(0015) #define b9600 0x33
(0016) #define baud b9600
(0017) #define fone 0x2a
(0018) #define ftwo 0x2b
(0019) #define fclr 0x2d
(0020) #define fend 0x3c
(0021) #define floop 0x3e
(0022) /******************************************************************************
(0023) 定义全局变量
(0024) *******************************************************************************/
(0025) const unsigned char table[]="0123456789.C " ; //显示常量
(0026) unsigned char i=0 ; //中断里的计数变量
(0027) char string[18] ; //字符串
(0028) unsigned char clr = 0 ; //清屏命令标志
(0029) unsigned char two = 0 ; //第二行显示标志
(0030) unsigned char end = 0 ; // 结束标志
(0031) unsigned char start = 0 ; //接收完成标志
(0032) unsigned char one = 0 ; //第一行显示标志
(0033)
(0034)
(0035) //void draw(unsigned long int m );
(0036) /*****************************************************************************
(0037) 函数声明
(0038) ******************************************************************************/
(0039) void puts(unsigned int data );
(0040) void display(void) ;
(0041) void port_init(void)
(0042) {
(0043) PORTA = 0x00;
_port_init:
0055 2422 CLR R2
0056 BA2B OUT 0x1B,R2
(0044) DDRA = 0x00;
0057 BA2A OUT 0x1A,R2
(0045) PORTB = 0x00;
0058 BA28 OUT 0x18,R2
(0046) DDRB = 0x00; //输出
0059 BA27 OUT 0x17,R2
(0047) PORTC = 0x00; //m103 output only
005A BA25 OUT 0x15,R2
(0048) DDRC = 0x00; //输出
005B BA24 OUT 0x14,R2
(0049) DDRD = 0x00;
005C BA21 OUT 0x11,R2
(0050) PORTD = 0x00;
005D BA22 OUT 0x12,R2
005E 9508 RET
(0051) }
(0052)
(0053) /******************************************************************************
(0054)
(0055) //字符输入函数
(0056) *******************************************************************************/
(0057) unsigned char getchar(void)
(0058) {
(0059) while(!(UCSRA& (1<<RXC)));
_getchar:
005F 9B5F SBIS 0x0B,7
0060 CFFE RJMP _getchar
(0060) return UDR;
0061 B10C IN R16,0x0C
0062 9508 RET
_uart0_rx_isr:
0063 922A ST R2,-Y
0064 930A ST R16,-Y
0065 931A ST R17,-Y
0066 938A ST R24,-Y
0067 939A ST R25,-Y
0068 93EA ST R30,-Y
0069 93FA ST R31,-Y
006A B62F IN R2,0x3F
006B 922A ST R2,-Y
(0061) }
(0062)
(0063)
(0064) /*******************************************************************************
(0065) 串行口接收中断
(0066) *******************************************************************************/
(0067) #pragma interrupt_handler uart0_rx_isr:12
(0068) void uart0_rx_isr(void)
(0069) {
(0070) string[i]= UDR ;
006C E686 LDI R24,0x66
006D E090 LDI R25,0
006E 91E00060 LDS R30,i
0070 27FF CLR R31
0071 0FE8 ADD R30,R24
0072 1FF9 ADC R31,R25
0073 B02C IN R2,0x0C
0074 8220 STD Z+0,R2
(0071) if(i==0)
0075 90200060 LDS R2,i
0077 2022 TST R2
0078 F579 BNE 0x00A8
(0072) {switch (string[0])
0079 91000066 LDS R16,string
007B 2711 CLR R17
007C 320A CPI R16,0x2A
007D E0E0 LDI R30,0
007E 071E CPC R17,R30
007F F049 BEQ 0x0089
0080 320B CPI R16,0x2B
0081 E0E0 LDI R30,0
0082 071E CPC R17,R30
0083 F089 BEQ 0x0095
0084 320D CPI R16,0x2D
0085 E0E0 LDI R30,0
0086 071E CPC R17,R30
0087 F0C9 BEQ 0x00A1
0088 C037 RJMP 0x00C0
(0073) {
(0074) case fone : {one=1;two=0;i++;}break;
0089 E081 LDI R24,1
008A 93800065 STS one,R24
008C 2422 CLR R2
008D 92200062 STS two,R2
008F 91800060 LDS R24,i
0091 5F8F SUBI R24,0xFF
0092 93800060 STS i,R24
0094 C02B RJMP 0x00C0
(0075) case ftwo : {two=1;one=0;i++;}break;
0095 E081 LDI R24,1
0096 93800062 STS two,R24
0098 2422 CLR R2
0099 92200065 STS one,R2
009B 91800060 LDS R24,i
009D 5F8F SUBI R24,0xFF
009E 93800060 STS i,R24
00A0 C01F RJMP 0x00C0
(0076) case fclr : {clr=1;i=0;} break;
00A1 E081 LDI R24,1
00A2 93800061 STS clr,R24
00A4 2422 CLR R2
00A5 92200060 STS i,R2
(0077) default: break ;
(0078) }
(0079) }
00A7 C018 RJMP 0x00C0
(0080) else if (string[i]==fend) {end=i-1;start=1;}
00A8 E686 LDI R24,0x66
00A9 E090 LDI R25,0
00AA 91E00060 LDS R30,i
00AC 27FF CLR R31
00AD 0FE8 ADD R30,R24
00AE 1FF9 ADC R31,R25
00AF 8180 LDD R24,Z+0
00B0 338C CPI R24,0x3C
00B1 F449 BNE 0x00BB
00B2 91800060 LDS R24,i
00B4 5081 SUBI R24,1
00B5 93800063 STS end,R24
00B7 E081 LDI R24,1
00B8 93800064 STS start,R24
00BA C005 RJMP 0x00C0
(0081)
(0082) else i++;
00BB 91800060 LDS R24,i
00BD 5F8F SUBI R24,0xFF
00BE 93800060 STS i,R24
00C0 9029 LD R2,Y+
00C1 BE2F OUT 0x3F,R2
00C2 91F9 LD R31,Y+
00C3 91E9 LD R30,Y+
00C4 9199 LD R25,Y+
00C5 9189 LD R24,Y+
00C6 9119 LD R17,Y+
00C7 9109 LD R16,Y+
00C8 9029 LD R2,Y+
00C9 9518 RETI
(0083)
(0084) }
(0085)
(0086) /******************************************************************************
(0087) 函数名称:1号通道采集函数
(0088) 函数功能:返回采集一次的模拟量
(0089) 函数参数:无
(0090) 返回值 : 16 位型 ,变量
(0091)
(0092) ******************************************************************************/
(0093)
(0094) unsigned int ad_1(void) //ad0采集函数,返回ad0的值
(0095) {
(0096) unsigned int value;
(0097) ADMUX=0xc1;
_ad_1:
value --> R16
00CA EC81 LDI R24,0xC1
00CB B987 OUT 0x07,R24
(0098) ADCSR=0x86;
00CC E886 LDI R24,0x86
00CD B986 OUT 0x06,R24
(0099) BIT_SET(ADCSR,ADSC);
00CE 9A36 SBI 0x06,6
(0100) while(ADCSR & (1<<ADSC)); //waitting ADC complete
00CF 9936 SBIC 0x06,6
00D0 CFFE RJMP 0x00CF
(0101) value=ADCL; //Read 8 low bits first (important)
00D1 B104 IN R16,0x04
00D2 2711 CLR R17
(0102) value|=( int)ADCH << 8; //read 2 high bits and shift into top byte
00D3 B025 IN R2,0x05
00D4 2433 CLR R3
00D5 2C32 MOV R3,R2
00D6 2422 CLR R2
00D7 2902 OR R16,R2
00D8 2913 OR R17,R3
(0103) return(value);
00D9 9508 RET
_main:
temp --> Y+1
vdata --> R10
data --> R12
m --> Y+0
00DA 9724 SBIW R28,4
(0104) }
(0105)
(0106)
(0107)
(0108) void main(void)
(0109) {
(0110) /*****************************************************************************
(0111) 变量定义
(0112) *******************************************************************************/
(0113) unsigned long int m=0 ; //温度采集后的值
00DB E040 LDI R20,0
00DC E050 LDI R21,0
00DD E060 LDI R22,0
00DE E070 LDI R23,0
00DF 01FE MOVW R30,R28
00E0 8340 STD Z+0,R20
00E1 8351 STD Z+1,R21
00E2 8362 STD Z+2,R22
00E3 8373 STD Z+3,R23
(0114) char temp ; //循环变量
(0115) unsigned int data,vdata ; //温度和电压的值
(0116) /******************************************************************************
(0117) 端口初始化和晶体频率校正
(0118) ******************************************************************************/
(0119)
(0120)
(0121) port_init() ; //端口初始话~~~!
00E4 DF70 RCALL _port_init
(0122) OSCCAL=0xb0 ;
00E5 EB80 LDI R24,0xB0
00E6 BF81 OUT 0x31,R24
(0123)
(0124) /*------------------------------------------------------------------
(0125) 初始化完成,初始化温度计,初始化液晶
(0126) --------------------------------------------------------------------*/
(0127)
(0128) resetDS18B20() ; //初始化温度计
00E7 940E01C0 CALL _resetDS18B20
(0129) DDRA|=LCD_DATA ; // 数据为输出
00E9 B38A IN R24,0x1A
00EA 6F80 ORI R24,0xF0
00EB BB8A OUT 0x1A,R24
(0130) DDRC|=LCD_RS|LCD_EN ; //置位RS.EN
00EC B384 IN R24,0x14
00ED 6C80 ORI R24,0xC0
00EE BB84 OUT 0x14,R24
(0131) LCD_init() ; //液晶初始化
00EF 940E025A CALL _LCD_init
(0132)
(0133) /*****************************************************************************
(0134) 初始化串口
(0135) ******************************************************************************/
(0136) // UBRR=0x33; ; //波特率9600
(0137) // UCR=0x18 ; //设置串口接收发送有效
(0138) UCSRB = 0x00; //disable while setting baud rate
00F1 2422 CLR R2
00F2 B82A OUT 0x0A,R2
(0139) UCSRA = 0x00;
00F3 B82B OUT 0x0B,R2
(0140) UCSRC = BIT(URSEL) | 0x06;
00F4 E886 LDI R24,0x86
00F5 BD80 OUT 0x20,R24
(0141) UBRRL = baud; //set baud rate lo
00F6 E383 LDI R24,0x33
00F7 B989 OUT 0x09,R24
(0142) UBRRH = 0x00; //set baud rate hi
00F8 BC20 OUT 0x20,R2
(0143) UCSRB = 0x98;
00F9 E988 LDI R24,0x98
00FA B98A OUT 0x0A,R24
(0144)
(0145) /****************************************************************************
(0146) 初始化ad口
(0147) 使用内部基准2.56 v , 使用 pa1(ad1)口采集电压,并发送到串口
(0148) *****************************************************************************/
(0149) BIT_CLR(DDRA,1);
00FB 98D1 CBI 0x1A,1
(0150) BIT_CLR(PORTA,1);//设置采集端口为高祖状态
00FC 98D9 CBI 0x1B,1
(0151) SEI();
00FD 9478 BSET 7
00FE C035 RJMP 0x0134
(0152)
(0153) /******************************************************************************
(0154) 主循环体,循环测温,电压,并发送到上位机
(0155) ******************************************************************************/
(0156)
(0157) while(1)
(0158)
(0159) {
(0160) resetDS18B20() ;
00FF 940E01C0 CALL _resetDS18B20
(0161) m=readTempDS18B20() ; //测试终端温度
0101 940E0241 CALL _readTempDS18B20
0103 0118 MOVW R2,R16
0104 2444 CLR R4
0105 2455 CLR R5
0106 01FE MOVW R30,R28
0107 8220 STD Z+0,R2
0108 8231 STD Z+1,R3
0109 8242 STD Z+2,R4
010A 8253 STD Z+3,R5
(0162)
(0163) data=m;
010B 01FE MOVW R30,R28
010C 80C0 LDD R12,Z+0
010D 80D1 LDD R13,Z+1
(0164) vdata = ad_1() ; //测试终端工作电压
010E DFBB RCALL _ad_1
010F 0158 MOVW R10,R16
(0165) puts(data) ;
0110 0186 MOVW R16,R12
0111 D025 RCALL _puts
(0166) puts(vdata) ; //发送电压和温度到上位机
0112 0185 MOVW R16,R10
0113 D023 RCALL _puts
(0167) if(start==1) display() ; // 普通模式
0114 91800064 LDS R24,start
0116 3081 CPI R24,1
0117 F411 BNE 0x011A
0118 D031 RCALL _display
0119 C01A RJMP 0x0134
(0168) else if(clr==1)
011A 91800061 LDS R24,clr
011C 3081 CPI R24,1
011D F491 BNE 0x0130
(0169) {
(0170) LCD_write_char(0x01,0);
011E 2722 CLR R18
011F 2733 CLR R19
0120 E001 LDI R16,1
0121 E010 LDI R17,0
0122 940E02A1 CALL _LCD_write_char
(0171) clr=0;
0124 2422 CLR R2
0125 92200061 STS clr,R2
(0172) one=0;
0127 92200065 STS one,R2
(0173) two=0;
0129 92200062 STS two,R2
(0174) start=0;
012B 92200064 STS start,R2
(0175) end=0;
012D 92200063 STS end,R2
(0176) }
012F C004 RJMP 0x0134
(0177) else
(0178) delay_nms(1000) ;
0130 EE08 LDI R16,0xE8
0131 E013 LDI R17,3
0132 940E01B1 CALL _delay_nms
0134 CFCA RJMP 0x00FF
0135 9624 ADIW R28,4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -