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

📄 ad.lst

📁 AVR mega16系列单片机开发程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    0039 E5CF      LDI	R28,0x5F
    003A E0D4      LDI	R29,4
    003B BFCD      OUT	0x3D,R28
    003C BFDE      OUT	0x3E,R29
    003D 51C0      SUBI	R28,0x10
    003E 40D0      SBCI	R29,0
    003F EA0A      LDI	R16,0xAA
    0040 8308      STD	Y+0,R16
    0041 2400      CLR	R0
    0042 E6E0      LDI	R30,0x60
    0043 E0F0      LDI	R31,0
    0044 E010      LDI	R17,0
    0045 36E2      CPI	R30,0x62
    0046 07F1      CPC	R31,R17
    0047 F011      BEQ	0x004A
    0048 9201      ST	R0,Z+
    0049 CFFB      RJMP	0x0045
    004A 8300      STD	Z+0,R16
    004B E7E2      LDI	R30,0x72
    004C E0F0      LDI	R31,0
    004D E6A0      LDI	R26,0x60
    004E E0B0      LDI	R27,0
    004F E010      LDI	R17,0
    0050 37E2      CPI	R30,0x72
    0051 07F1      CPC	R31,R17
    0052 F021      BEQ	0x0057
    0053 95C8      LPM
    0054 9631      ADIW	R30,1
    0055 920D      ST	R0,X+
    0056 CFF9      RJMP	0x0050
    0057 940E02D5  CALL	_main
_exit:
    0059 CFFF      RJMP	_exit
_delay:
  i                    --> R20
  n                    --> R16
    005A 940E030A  CALL	push_gset1
FILE: E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\lcd.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) 
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006) 
(0007) #define LCD_EN_PORT    PORTA   //数据寄存器,以下2个要设为同一个口 
(0008) #define LCD_EN_DDR     DDRA    //数据方向寄存器
(0009) #define LCD_RS_PORT    PORTA   //以下2个要设为同一个口 
(0010) #define LCD_RS_DDR     DDRA 
(0011) #define LCD_DATA_PORT  PORTA   //以下3个要设为同一个口 
(0012) #define LCD_DATA_DDR   DDRA    //一定要用高4位 
(0013) #define LCD_DATA_PIN   PINA    //端口输入引脚
(0014) #define LCD_RS         (1<<PA3) //0x04   portA3       out 
(0015) #define LCD_EN         (1<<PA2) //0x08   portA2       out 
(0016) #define LCD_DATA       ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0   portA4/5/6/7 out 
(0017) 
(0018) 
(0019) 
(0020) void LCD_init(void); 
(0021) void LCD_en_write(void); 
(0022) void LCD_write_command(uchar command); 
(0023) void LCD_write_data(uchar data); 
(0024) void LCD_set_xy (uchar x, uchar y); 
(0025) 
(0026) void delay(uint n)       //N ms延时函数 
(0027)   { 
    005C C009      RJMP	0x0066
(0028)    uint i;
(0029)    while(n--) 
(0030)    for (i=0;i<125;i++); 
    005D 2744      CLR	R20
    005E 2755      CLR	R21
    005F C002      RJMP	0x0062
    0060 5F4F      SUBI	R20,0xFF
    0061 4F5F      SBCI	R21,0xFF
    0062 374D      CPI	R20,0x7D
    0063 E0E0      LDI	R30,0
    0064 075E      CPC	R21,R30
    0065 F3D0      BCS	0x0060
    0066 0118      MOVW	R2,R16
    0067 5001      SUBI	R16,1
    0068 4010      SBCI	R17,0
    0069 2022      TST	R2
    006A F791      BNE	0x005D
    006B 2033      TST	R3
    006C F781      BNE	0x005D
    006D 940E030D  CALL	pop_gset1
    006F 9508      RET
(0031)   } 
(0032)   
(0033) void LCD_init(void)         //液晶初始化 
(0034) { 
(0035)   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出 
_LCD_init:
    0070 B38A      IN	R24,0x1A
    0071 6F80      ORI	R24,0xF0
    0072 BB8A      OUT	0x1A,R24
(0036)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出 
    0073 9AD2      SBI	0x1A,2
(0037)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出 
    0074 9AD3      SBI	0x1A,3
(0038)   LCD_write_command(0x28);  
    0075 E208      LDI	R16,0x28
    0076 D014      RCALL	_LCD_write_command
(0039)   LCD_en_write(); 
    0077 D00D      RCALL	_LCD_en_write
(0040)   delay(40); 
    0078 E208      LDI	R16,0x28
    0079 E010      LDI	R17,0
    007A DFDF      RCALL	_delay
(0041)   LCD_write_command(0x28);  //4位显示 
    007B E208      LDI	R16,0x28
    007C D00E      RCALL	_LCD_write_command
(0042)   LCD_write_command(0x0c);  //显示开 
    007D E00C      LDI	R16,0xC
    007E D00C      RCALL	_LCD_write_command
(0043)   LCD_write_command(0x01);  //清屏 
    007F E001      LDI	R16,1
    0080 D00A      RCALL	_LCD_write_command
(0044)   delay(2); 
    0081 E002      LDI	R16,2
    0082 E010      LDI	R17,0
    0083 DFD6      RCALL	_delay
    0084 9508      RET
(0045) } 
(0046) 
(0047) void LCD_en_write(void)  //液晶使能 
(0048) { 
(0049)   LCD_EN_PORT|=LCD_EN; 
_LCD_en_write:
    0085 9ADA      SBI	0x1B,2
(0050)   delay(1); 
    0086 E001      LDI	R16,1
    0087 E010      LDI	R17,0
    0088 DFD1      RCALL	_delay
(0051)   LCD_EN_PORT&=~LCD_EN; 
    0089 98DA      CBI	0x1B,2
    008A 9508      RET
_LCD_write_command:
  command              --> R20
    008B 940E030A  CALL	push_gset1
    008D 2F40      MOV	R20,R16
(0052) } 
(0053) 
(0054) void LCD_write_command(uchar command) //写指令 
(0055) { 
(0056)   delay(16); 
    008E E100      LDI	R16,0x10
    008F E010      LDI	R17,0
    0090 DFC9      RCALL	_delay
(0057)   LCD_RS_PORT&=~LCD_RS;        //RS=0 
    0091 98DB      CBI	0x1B,3
(0058)   LCD_DATA_PORT&=0X0f;         //清高四位 
    0092 B38B      IN	R24,0x1B
    0093 708F      ANDI	R24,0xF
    0094 BB8B      OUT	0x1B,R24
(0059)   LCD_DATA_PORT|=command&0xf0; //写高四位 
    0095 2F84      MOV	R24,R20
    0096 7F80      ANDI	R24,0xF0
    0097 B22B      IN	R2,0x1B
    0098 2A28      OR	R2,R24
    0099 BA2B      OUT	0x1B,R2
(0060)   LCD_en_write(); 
    009A DFEA      RCALL	_LCD_en_write
(0061)   command=command<<4;          //低四位移到高四位 
    009B 2F84      MOV	R24,R20
    009C 708F      ANDI	R24,0xF
    009D 9582      SWAP	R24
    009E 2F48      MOV	R20,R24
(0062)   LCD_DATA_PORT&=0x0f;         //清高四位 
    009F B38B      IN	R24,0x1B
    00A0 708F      ANDI	R24,0xF
    00A1 BB8B      OUT	0x1B,R24
(0063)   LCD_DATA_PORT|=command&0xf0; //写低四位 
    00A2 2F84      MOV	R24,R20
    00A3 7F80      ANDI	R24,0xF0
    00A4 B22B      IN	R2,0x1B
    00A5 2A28      OR	R2,R24
    00A6 BA2B      OUT	0x1B,R2
(0064)   LCD_en_write(); 
    00A7 DFDD      RCALL	_LCD_en_write
    00A8 940E030D  CALL	pop_gset1
    00AA 9508      RET
_LCD_write_data:
  data                 --> R20
    00AB 940E030A  CALL	push_gset1
    00AD 2F40      MOV	R20,R16
(0065)    
(0066) } 
(0067) 
(0068) void LCD_write_data(uchar data) //写数据 
(0069) { 
(0070)   delay(16); 
    00AE E100      LDI	R16,0x10
    00AF E010      LDI	R17,0
    00B0 DFA9      RCALL	_delay
(0071)   LCD_RS_PORT|=LCD_RS;       //RS=1 
    00B1 9ADB      SBI	0x1B,3
(0072)   LCD_DATA_PORT&=0X0f;       //清高四位 
    00B2 B38B      IN	R24,0x1B
    00B3 708F      ANDI	R24,0xF
    00B4 BB8B      OUT	0x1B,R24
(0073)   LCD_DATA_PORT|=data&0xf0;  //写高四位 
    00B5 2F84      MOV	R24,R20
    00B6 7F80      ANDI	R24,0xF0
    00B7 B22B      IN	R2,0x1B
    00B8 2A28      OR	R2,R24
    00B9 BA2B      OUT	0x1B,R2
(0074)   LCD_en_write(); 
    00BA DFCA      RCALL	_LCD_en_write
(0075)   data=data<<4;               //低四位移到高四位 
    00BB 2F84      MOV	R24,R20
    00BC 708F      ANDI	R24,0xF
    00BD 9582      SWAP	R24
    00BE 2F48      MOV	R20,R24
(0076)   LCD_DATA_PORT&=0X0f;        //清高四位 
    00BF B38B      IN	R24,0x1B
    00C0 708F      ANDI	R24,0xF
    00C1 BB8B      OUT	0x1B,R24
(0077)   LCD_DATA_PORT|=data&0xf0;   //写低四位 
    00C2 2F84      MOV	R24,R20
    00C3 7F80      ANDI	R24,0xF0
    00C4 B22B      IN	R2,0x1B
    00C5 2A28      OR	R2,R24
    00C6 BA2B      OUT	0x1B,R2
(0078)   LCD_en_write(); 
    00C7 DFBD      RCALL	_LCD_en_write
    00C8 940E030D  CALL	pop_gset1
    00CA 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00CB 940E0308  CALL	push_gset2
    00CD 2F42      MOV	R20,R18
    00CE 2F60      MOV	R22,R16
(0079) } 
(0080) 
(0081) 
(0082) void LCD_set_xy( uchar x, uchar y )  //写地址函数 
(0083) { 
(0084)     uchar address; 
(0085)     if (y == 0) address = 0x80 + x; 
    00CF 2344      TST	R20
    00D0 F419      BNE	0x00D4
    00D1 2F46      MOV	R20,R22
    00D2 5840      SUBI	R20,0x80
    00D3 C002      RJMP	0x00D6
(0086)     else   address = 0xc0 + x; 
    00D4 2F46      MOV	R20,R22
    00D5 5440      SUBI	R20,0x40
(0087)     LCD_write_command( address); 
    00D6 2F04      MOV	R16,R20
    00D7 DFB3      RCALL	_LCD_write_command
    00D8 940E02F9  CALL	pop_gset2
    00DA 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    00DB 940E0306  CALL	push_gset3
    00DD 2EA2      MOV	R10,R18
    00DE 2F60      MOV	R22,R16
    00DF 814E      LDD	R20,Y+6
    00E0 815F      LDD	R21,Y+7
(0088) } 
(0089)    
(0090) void LCD_write_string(uchar X,uchar Y,uchar *s) //列x=0~15,行y=0,1 
(0091) { 
(0092)     LCD_set_xy( X, Y ); //写地址     
    00E1 2D2A      MOV	R18,R10
    00E2 2F06      MOV	R16,R22
    00E3 DFE7      RCALL	_LCD_set_xy
    00E4 C005      RJMP	0x00EA
(0093)     while (*s)  // 写显示字符 
(0094)     { 
(0095)       LCD_write_data( *s ); 
    00E5 01FA      MOVW	R30,R20
    00E6 8100      LDD	R16,Z+0
    00E7 DFC3      RCALL	_LCD_write_data
(0096)       s ++; 
    00E8 5F4F      SUBI	R20,0xFF
    00E9 4F5F      SBCI	R21,0xFF
    00EA 01FA      MOVW	R30,R20
    00EB 8020      LDD	R2,Z+0
    00EC 2022      TST	R2
    00ED F7B9      BNE	0x00E5
    00EE 940E02FC  CALL	pop_gset3
    00F0 9508      RET
_LCD_write_char:
  data                 --> Y+4
  Y                    --> R22
  X                    --> R20
    00F1 940E0308  CALL	push_gset2
    00F3 2F62      MOV	R22,R18
    00F4 2F40      MOV	R20,R16
(0097)     } 
(0098)        
(0099) } 
(0100) 
(0101) void LCD_write_char(uchar X,uchar Y,uchar data) //列x=0~15,行y=0,1 
(0102) { 
(0103)   LCD_set_xy( X, Y );      //写地址 
    00F5 2F26      MOV	R18,R22
    00F6 2F04      MOV	R16,R20
    00F7 DFD3      RCALL	_LCD_set_xy
(0104)   LCD_write_data( data); 
    00F8 810C      LDD	R16,Y+4
    00F9 DFB1      RCALL	_LCD_write_data
    00FA 940E02F9  CALL	pop_gset2
    00FC 9508      RET
(0105)    
(0106) } 
(0107) 
(0108) void init_lcd(void) 
(0109) { 
(0110)   CLI();             //禁止所有中断
_init_lcd:
    00FD 94F8      BCLR	7
(0111)   LCD_init(); 
    00FE DF71      RCALL	_LCD_init
(0112)   MCUCR = 0x00; 
    00FF 2422      CLR	R2
    0100 BE25      OUT	0x35,R2
(0113)   GICR  = 0x00; 
    0101 BE2B      OUT	0x3B,R2
(0114)   TIMSK = 0x00;     
    0102 BE29      OUT	0x39,R2
(0115)   SEI();            //重新开启所有中断
    0103 9478      BSET	7
    0104 9508      RET
FILE: E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\adc.c
(0001) //Project :ADC(10 bit) and LCD Display
(0002) //ICC-AVR application builder : 2007-5-10 21:20:44
(0003) // Target : M16
(0004) // Crystal : 8.0000Mhz
(0005) // Writer : you hu
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008) #include "lcd.h"
(0009) #include "display.h"
(0010) 
(0011) typedef  unsigned char uchar;
(0012) typedef  unsigned int uint;
(0013) 
(0014)  int value;         //全局变量,存储10位的AD转换数据
(0015) 
(0016) 
(0017) //ADC initialize
(0018) // Conversion time: 52uS
(0019) 
(0020) void adc_init(void)
(0021) {
(0022)  ADCSR = 0x00;              //禁止AD启动
_adc_init:
    0105 2422      CLR	R2
    0106 B826      OUT	0x06,R2
(0023)  ADMUX = 0xC0;              //选择通道0,默认的右对齐方式
    0107 EC80      LDI	R24,0xC0
    0108 B987      OUT	0x07,R24
(0024)  ACSR  = 0x80;
    0109 E880      LDI	R24,0x80
    010A B988      OUT	0x08,R24
(0025)  ADCSR = 0xED;              //启动AD转换
    010B EE8D      LDI	R24,0xED
    010C B986      OUT	0x06,R24
    010D 9508      RET
_adc_isr:
    010E 922A      ST	R2,-Y
    010F 923A      ST	R3,-Y
    0110 924A      ST	R4,-Y
    0111 925A      ST	R5,-Y
    0112 B62F      IN	R2,0x3F
    0113 922A      ST	R2,-Y
(0026) }
(0027) 
(0028) #pragma interrupt_handler adc_isr:15         //中断方式读取AD转换值
(0029) void adc_isr(void)
(0030) {
(0031)  value=ADCL;                //读取低8位转换值
    0114 B024      IN	R2,0x04
    0115 2433      CLR	R3
    0116 92300061  STS	value+1,R3
    0118 92200060  STS	value,R2
(0032)  value|=(int)ADCH << 8;     //读取高2位转换值
    011A B025      IN	R2,0x05
    011B 2433      CLR	R3
    011C 2C32      MOV	R3,R2
    011D 2422      CLR	R2
    011E 90400060  LDS	R4,value
    0120 90500061  LDS	R5,value+1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -