📄 adc.lis
字号:
.module adc.c
.area data(ram, con, rel)
0000 _buf::
0000 .blkb 33
.area idata
0000 5445535420204348313A302E30303056 .byte 'T,'E,'S,'T,32,32,'C,'H,49,58,48,46,48,48,48,'V
0010 766F6C7420204348323A302E30303056 .byte 'v,'o,'l,'t,32,32,'C,'H,50,58,48,46,48,48,48,'V
0020 00 .byte 0
.area data(ram, con, rel)
0021 .dbfile E:\iccavr代码\实验7_片内模数转换器adc\adc.c
0021 .dbsym e buf _buf A[33:33]c
.area text(rom, con, rel)
0000 .dbfile E:\iccavr代码\实验7_片内模数转换器adc\adc.c
0000 .dbfunc e DelaymS _DelaymS fV
0000 ; j -> R20,R21
0000 ; k -> R22,R23
0000 ; i -> R16,R17
.even
0000 _DelaymS::
0000 00D0 rcall push_gset2
0002 .dbline -1
0002 .dbline 36
0002 ; //******************************************************************************
0002 ; // *
0002 ; // FileName : 实验板ADC.c ICCAVR V6.31A编译 *
0002 ; // Function : 实验板的片内模数转换器ADC的使用练习 *
0002 ; // Date : 2006-11-05 *
0002 ; // Version : 1.0 *
0002 ; // *
0002 ; // Author : 开关电源 hongtusy@163.com *
0002 ; // Company : 电子信息技术咨询网 http://www.itsn.cn *
0002 ; // *
0002 ; //***************************描述与记事*****************************************
0002 ; //实验板的AVR程序,片内模数转换器ADC的应用,用1602LCD显示两个通道的ADC测量电压数值
0002 ; //接线定义:使用PC和PD口驱动1602LCD作显示,PD4,5,6 为RS,R/W,EA。数据位为PC口。
0002 ; // 开关位置:SW2-1,2,3.SW1-1~8.SW2-5为背光开关。SW3-8为系统复位端。
0002 ; // PA0(SW3-1)和PA1(SW3-2)作为两个通道的模拟量输入端。
0002 ; //记事:本程序旨在对片内模数转换器ADC的理解与演示,程序适合初学者使用.
0002 ; // 使用ATmega8535,片内1MHz晶振。
0002 ; //******************************************************************************
0002 ;
0002 ; #include <iom8535v.h> //头文件,ATmega8535单片机的寄存器定义
0002 ; #include <macros.h> //包含有SEI()、CLI()、NOP()、WDR()、等宏定义.
0002 ;
0002 ; typedef unsigned char uchar; //数据类型说明
0002 ; typedef unsigned int uint; //数据类型说明
0002 ;
0002 ; uchar buf[]="TEST CH1:0.000Vvolt CH2:0.000V";
0002 ;
0002 ; /************************************************
0002 ; 函 数 名: DelaymS()
0002 ; 功 能: 毫秒级延时函数
0002 ; 输入参数: 延迟时间/系统晶体
0002 ; 输出参数: 做相应的延迟处理
0002 ; 描 述: /
0002 ; ***********************************************/
0002 ; void DelaymS (uint i) //延时函数,参数i为延时时间
0002 ; {
0002 .dbline 38
0002 ; uint j,k; //双重延时
0002 ; for (j=0;j<i;j++)
0002 4427 clr R20
0004 5527 clr R21
0006 0CC0 rjmp L5
0008 L2:
0008 .dbline 39
0008 ; {
0008 .dbline 40
0008 6627 clr R22
000A 7727 clr R23
000C 02C0 rjmp L9
000E L6:
000E .dbline 40
000E L7:
000E .dbline 40
000E 6F5F subi R22,255 ; offset = 1
0010 7F4F sbci R23,255
0012 L9:
0012 .dbline 40
0012 84EF ldi R24,500
0014 91E0 ldi R25,1
0016 8617 cp R24,R22
0018 9707 cpc R25,R23
001A C8F7 brsh L6
001C .dbline 41
001C L3:
001C .dbline 38
001C 4F5F subi R20,255 ; offset = 1
001E 5F4F sbci R21,255
0020 L5:
0020 .dbline 38
0020 4017 cp R20,R16
0022 5107 cpc R21,R17
0024 88F3 brlo L2
0026 .dbline -2
0026 L1:
0026 00D0 rcall pop_gset2
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbsym r j 20 i
002A .dbsym r k 22 i
002A .dbsym r i 16 i
002A .dbend
002A .dbfunc e write_data _write_data fV
002A ; h -> R20
.even
002A _write_data::
002A 00D0 rcall push_gset1
002C 402F mov R20,R16
002E .dbline -1
002E .dbline 51
002E ; for (k=0;k<=500;k++);
002E ; }
002E ; }
002E ; /********************************************************
002E ; 子程序名: write_data()
002E ; 功 能: 写入一字节LCD数据
002E ; 输入参数: /
002E ; 输出参数: /
002E ; 描 述: /
002E ; ********************************************************/
002E ; void write_data(uchar h)
002E ; {
002E .dbline 52
002E ; PORTC = h; //先将数据送出
002E 45BB out 0x15,R20
0030 .dbline 53
0030 ; PORTD |= (1<<PD4); //RS=1,数据
0030 949A sbi 0x12,4
0032 .dbline 54
0032 ; PORTD &= ~(1<<PD5); //R/W=0,写
0032 9598 cbi 0x12,5
0034 .dbline 55
0034 ; PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
0034 9698 cbi 0x12,6
0036 .dbline 56
0036 ; DelaymS (1);
0036 01E0 ldi R16,1
0038 10E0 ldi R17,0
003A E2DF rcall _DelaymS
003C .dbline 57
003C ; PORTD |= (1<<PD6); //EN=1 ,除能
003C 969A sbi 0x12,6
003E .dbline -2
003E L10:
003E 00D0 rcall pop_gset1
0040 .dbline 0 ; func end
0040 0895 ret
0042 .dbsym r h 20 c
0042 .dbend
0042 .dbfunc e write_code _write_code fV
0042 ; h -> R20
.even
0042 _write_code::
0042 00D0 rcall push_gset1
0044 402F mov R20,R16
0046 .dbline -1
0046 .dbline 67
0046 ; }
0046 ; /********************************************************
0046 ; 子程序名: write_code()
0046 ; 功 能: 写入一字节LCD指令/地址
0046 ; 输入参数: /
0046 ; 输出参数: /
0046 ; 描 述: /
0046 ; ********************************************************/
0046 ; void write_code(uchar h)
0046 ; {
0046 .dbline 68
0046 ; PORTC = h; //先将地址送出
0046 45BB out 0x15,R20
0048 .dbline 69
0048 ; PORTD &= ~(1<<PD4); //RS=0,命令或数据
0048 9498 cbi 0x12,4
004A .dbline 70
004A ; PORTD &= ~(1<<PD5); //R/W=0,写
004A 9598 cbi 0x12,5
004C .dbline 71
004C ; PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
004C 9698 cbi 0x12,6
004E .dbline 72
004E ; DelaymS (1);
004E 01E0 ldi R16,1
0050 10E0 ldi R17,0
0052 D6DF rcall _DelaymS
0054 .dbline 73
0054 ; PORTD |= (1<<PD6); //EN=1 ,除能
0054 969A sbi 0x12,6
0056 .dbline -2
0056 L11:
0056 00D0 rcall pop_gset1
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbsym r h 20 c
005A .dbend
005A .dbfunc e Init_lcd _Init_lcd fV
.even
005A _Init_lcd::
005A .dbline -1
005A .dbline 83
005A ; }
005A ; /********************************************************
005A ; 子程序名: Init_lcd()
005A ; 功 能: 初始化LCD
005A ; 输入参数: /
005A ; 输出参数: /
005A ; 描 述: /
005A ; ********************************************************/
005A ; void Init_lcd(void)
005A ; {
005A .dbline 84
005A ; write_code(0x01); //清除屏幕
005A 01E0 ldi R16,1
005C F2DF rcall _write_code
005E .dbline 85
005E ; write_code(0x38); //功能设定,8位数据口/2行/5*7的点阵
005E 08E3 ldi R16,56
0060 F0DF rcall _write_code
0062 .dbline 86
0062 ; write_code(0b00001111); //显示幕ON,光标ON,闪烁ON
0062 0FE0 ldi R16,15
0064 EEDF rcall _write_code
0066 .dbline 87
0066 ; write_code(0x06); //模式,加1,显示幕ON。
0066 06E0 ldi R16,6
0068 ECDF rcall _write_code
006A .dbline 88
006A ; write_code(0b00000011); //光标回到原点
006A 03E0 ldi R16,3
006C EADF rcall _write_code
006E .dbline -2
006E L12:
006E .dbline 0 ; func end
006E 0895 ret
0070 .dbend
0070 .dbfunc e display_lcd _display_lcd fV
0070 ; i -> R20
0070 ; p -> R22,R23
.even
0070 _display_lcd::
0070 00D0 rcall push_gset2
0072 B801 movw R22,R16
0074 .dbline -1
0074 .dbline 98
0074 ; }
0074 ; /********************************************************
0074 ; 子程序名: display_lcd()
0074 ; 功 能: 刷新显示一屏数据,独立的LCD显示程序,用户将显存内容更新后,只要调用此程序即可更新显示。
0074 ; 输入参数: /
0074 ; 输出参数: /
0074 ; 描 述: 在写一个字符前,先设定显示的位置地址,然后再写数据。系统可以自动地址加一。
0074 ; ********************************************************/
0074 ; void display_lcd(uchar *p)
0074 ; {
0074 .dbline 100
0074 ; uchar i;
0074 ; write_code(0x80); //第一行起始地址,0b10000000B=0x80.
0074 00E8 ldi R16,128
0076 E5DF rcall _write_code
0078 .dbline 101
0078 ; for(i=0;i<16;i++)
0078 4427 clr R20
007A 07C0 rjmp L17
007C L14:
007C .dbline 102
007C .dbline 103
007C E42F mov R30,R20
007E FF27 clr R31
0080 E60F add R30,R22
0082 F71F adc R31,R23
0084 0081 ldd R16,z+0
0086 D1DF rcall _write_data
0088 .dbline 104
0088 L15:
0088 .dbline 101
0088 4395 inc R20
008A L17:
008A .dbline 101
008A 4031 cpi R20,16
008C B8F3 brlo L14
008E .dbline 105
008E ; {
008E ; write_data(p[i]);
008E ; }
008E ; write_code(0xc0); //第二行起始地址,0b11000000B=0xc0.
008E 00EC ldi R16,192
0090 D8DF rcall _write_code
0092 .dbline 106
0092 ; for(i=16;i<32;i++)
0092 40E1 ldi R20,16
0094 07C0 rjmp L21
0096 L18:
0096 .dbline 107
0096 .dbline 108
0096 E42F mov R30,R20
0098 FF27 clr R31
009A E60F add R30,R22
009C F71F adc R31,R23
009E 0081 ldd R16,z+0
00A0 C4DF rcall _write_data
00A2 .dbline 109
00A2 L19:
00A2 .dbline 106
00A2 4395 inc R20
00A4 L21:
00A4 .dbline 106
00A4 4032 cpi R20,32
00A6 B8F3 brlo L18
00A8 .dbline -2
00A8 L13:
00A8 00D0 rcall pop_gset2
00AA .dbline 0 ; func end
00AA 0895 ret
00AC .dbsym r i 20 c
00AC .dbsym r p 22 pc
00AC .dbend
00AC .dbfunc e Init_mcu _Init_mcu fV
.even
00AC _Init_mcu::
00AC .dbline -1
00AC .dbline 119
00AC ; {
00AC ; write_data(p[i]);
00AC ; }
00AC ; }
00AC ; /************************************************
00AC ; 函 数 名: Init_mcu()
00AC ; 功 能: 单片机初始化函数
00AC ; 输入参数: /
00AC ; 输出参数: /
00AC ; 描 述: 相关口方向的设置等
00AC ; ***********************************************/
00AC ; void Init_mcu(void)
00AC ; {
00AC .dbline 120
00AC ; DDRC = 0xff; //PC口为推挽1输出,段码
00AC 8FEF ldi R24,255
00AE 84BB out 0x14,R24
00B0 .dbline 121
00B0 ; DDRD = 0xff; //PD口为推挽1输出,位码
00B0 81BB out 0x11,R24
00B2 .dbline 122
00B2 ; DDRA = 0x00; //PA口为输入
00B2 2224 clr R2
00B4 2ABA out 0x1a,R2
00B6 .dbline 123
00B6 ; PORTA = 0x00; //内部不接上拉电阻
00B6 2BBA out 0x1b,R2
00B8 .dbline -2
00B8 L22:
00B8 .dbline 0 ; func end
00B8 0895 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -