📄 mega16_ad.lst
字号:
__start:
__text_start:
0040 E5CF LDI R28,0x5F
0041 E0D4 LDI R29,4
0042 BFCD OUT P3D,R28
0043 BFDE OUT P3E,R29
0044 51C0 SUBI R28,0x10
0045 40D0 SBCI R29,0
0046 EA0A LDI R16,0xAA
0047 8308 STD R16,0+Y
0048 2400 CLR R0
0049 E6E0 LDI R30,0x60
004A E0F0 LDI R31,0
004B E010 LDI R17,0
004C 36E0 CPI R30,0x60
004D 07F1 CPC R31,R17
004E F011 BEQ 0x0051
004F 9201 ST R0,Z+
0050 CFFB RJMP 0x004C
0051 8300 STD R16,0+Z
0052 E8E0 LDI R30,0x80
0053 E0F0 LDI R31,0
0054 E6A0 LDI R26,0x60
0055 E0B0 LDI R27,0
0056 E010 LDI R17,0
0057 38E0 CPI R30,0x80
0058 07F1 CPC R31,R17
0059 F021 BEQ 0x005E
005A 95C8 LPM
005B 9631 ADIW R30,1
005C 920D ST R0,X+
005D CFF9 RJMP 0x0057
005E 940E0171 CALL _main
_exit:
0060 CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
0061 940E0214 CALL push_gset2
0063 01B8 MOVW R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002) 文件:AVR_PQ1A.H
(0003) 功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型号头文件
(0007) #include <macros.h> //包含"位"操作头文件
(0008)
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2 //LED锁存器控制端
(0015) #define SEGLK PA3 //数码管段选锁存器控制端
(0016) #define BITLK PA4 //数码管位选锁存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功 能: 延时指定微秒(8M晶振)
(0024) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值 : 无
(0026) /********************************************/
(0027) void Delayus(uint US)
(0028) {
(0029) uint i;
(0030) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
0064 E005 LDI R16,5
0065 E010 LDI R17,0
0066 019B MOVW R18,R22
0067 940E01ED CALL empy16s
0069 01B8 MOVW R22,R16
006A 9576 LSR R23
006B 9567 ROR R22
006C 9576 LSR R23
006D 9567 ROR R22
(0031) for( i=0;i<US;i++);
006E 2744 CLR R20
006F 2755 CLR R21
0070 C002 RJMP 0x0073
0071 5F4F SUBI R20,0xFF
0072 4F5F SBCI R21,0xFF
0073 1746 CP R20,R22
0074 0757 CPC R21,R23
0075 F3D8 BCS 0x0071
(0032) }
0076 940E021C CALL pop_gset2
0078 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
0079 940E0214 CALL push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功 能: 延时指定毫秒(8M晶振)
(0036) 参 数: MS--延时的毫秒数
(0037) 返回值 : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)
(0040) {
(0041) uint i,j;
(0042) for( i=0;i<MS;i++)
007B 2744 CLR R20
007C 2755 CLR R21
007D C00B RJMP 0x0089
(0043) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
007E 2766 CLR R22
007F 2777 CLR R23
0080 C002 RJMP 0x0083
0081 5F6F SUBI R22,0xFF
0082 4F7F SBCI R23,0xFF
0083 3765 CPI R22,0x75
0084 E0E4 LDI R30,4
0085 077E CPC R23,R30
0086 F3D0 BCS 0x0081
0087 5F4F SUBI R20,0xFF
0088 4F5F SBCI R21,0xFF
0089 1740 CP R20,R16
008A 0751 CPC R21,R17
008B F390 BCS 0x007E
(0044) }
008C 940E021C CALL pop_gset2
008E 9508 RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功 能: 初始化实验板,关闭全部功能
(0048) 参 数: 无
(0049) 返回值 : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) DDRA=0xFF; //将四个IO口全部配置为输出
_Board_init:
008F EF8F LDI R24,0xFF
0090 BB8A OUT P1A,R24
(0054) DDRB=0xFF;
0091 BB87 OUT P17,R24
(0055) DDRC=0xFF;
0092 BB84 OUT P14,R24
(0056) DDRD=0xFF;
0093 BB81 OUT P11,R24
(0057)
(0058) SPCR=0x00; //还原SPI口,使其为正常端口
0094 2422 CLR R2
0095 B82D OUT P0D,R2
(0059)
(0060) PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
0096 9ADE SBI P1B,6
(0061) PORTC&=~BIT(PC6); //(RELAY)初始化继电器为常闭连接状态
0097 98AE CBI P15,6
(0062) PORTA&=~BIT(PA1); //关闭SPI总线DA
0098 98D9 CBI P1B,1
(0063) PORTB=0xFF; //关闭LED
0099 BB88 OUT P18,R24
(0064) PORTA|=BIT(LEDLK); //锁存数据,使LED熄灭
009A 9ADA SBI P1B,2
(0065) Delayus(5);
009B E005 LDI R16,5
009C E010 LDI R17,0
009D DFC3 RCALL _Delayus
(0066) PORTA&=~BIT(LEDLK);
009E 98DA CBI P1B,2
(0067)
(0068) PORTB=0x00; //输出段选
009F 2422 CLR R2
00A0 BA28 OUT P18,R2
(0069) PORTA|=BIT(SEGLK);
00A1 9ADB SBI P1B,3
(0070) Delayus(50);
00A2 E302 LDI R16,0x32
00A3 E010 LDI R17,0
00A4 DFBC RCALL _Delayus
(0071) PORTA&=~BIT(SEGLK);
00A5 98DB CBI P1B,3
(0072)
(0073) PORTB=0xFF; //输出位选
00A6 EF8F LDI R24,0xFF
00A7 BB88 OUT P18,R24
(0074) PORTA|=BIT(BITLK);
00A8 9ADC SBI P1B,4
(0075) Delayus(50);
00A9 E302 LDI R16,0x32
00AA E010 LDI R17,0
00AB DFB5 RCALL _Delayus
(0076) PORTA&=~BIT(BITLK);
00AC 98DC CBI P1B,4
(0077)
(0078) PORTD=0xFF;
00AD EF8F LDI R24,0xFF
00AE BB82 OUT P12,R24
(0079) PORTA|=BIT(PA7);
00AF 9ADF SBI P1B,7
(0080) Delayus(50);
00B0 E302 LDI R16,0x32
00B1 E010 LDI R17,0
00B2 DFAE RCALL _Delayus
(0081) PORTA&=~BIT(PA7);
00B3 98DF CBI P1B,7
(0082)
(0083)
(0084) }
00B4 9508 RET
_One_smg_display:
number --> R20
data --> R22
00B5 940E0214 CALL push_gset2
00B7 2F42 MOV R20,R18
00B8 2F60 MOV R22,R16
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD\SMG.C
(0001) /*******************************************
(0002) 文件:SMG.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动开发板上的数码管,滚动显示1、2、3、4、5、6
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012)
(0013) #pragma data:code
(0014) const SEGMENT[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
(0015) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0016)
(0017) /*******************************************
(0018) 函数名称: One_smg_display
(0019) 功 能: 指定的数码管显示指定的内容
(0020) 参 数: data--显示的内容(0-15)
(0021) number--指定的数码管(1-6)
(0022) 返回值 : 无
(0023) /********************************************/
(0024) void One_smg_display(uchar data,uchar number)
(0025) {
(0026) PORTB|=0x3F; //输出位选
00B9 B388 IN R24,P18
00BA 638F ORI R24,0x3F
00BB BB88 OUT P18,R24
(0027) PORTA|=BIT(BITLK); //更新位选
00BC 9ADC SBI P1B,4
(0028) Delayus(50); //调整时序
00BD E302 LDI R16,0x32
00BE E010 LDI R17,0
00BF DFA1 RCALL _Delayus
(0029) PORTA&=~BIT(BITLK); //锁存位选
00C0 98DC CBI P1B,4
(0030)
(0031) PORTB=SEGMENT[data]; //输出段选
00C1 E082 LDI R24,2
00C2 9F86 MUL R24,R22
00C3 01F0 MOVW R30,R0
00C4 E680 LDI R24,0x60
00C5 E090 LDI R25,0
00C6 0FE8 ADD R30,R24
00C7 1FF9 ADC R31,R25
00C8 9005 LD R0,R0
00C9 9014 LD R1,R1
00CA 01F0 MOVW R30,R0
00CB BBE8 OUT P18,R30
(0032) PORTA|=BIT(SEGLK); //更新段选
00CC 9ADB SBI P1B,3
(0033) Delayus(50); //调整时序
00CD E302 LDI R16,0x32
00CE E010 LDI R17,0
00CF DF91 RCALL _Delayus
(0034) PORTA&=~BIT(SEGLK); //锁存段选
00D0 98DB CBI P1B,3
(0035)
(0036) number=~BIT(number-1); //调整位选(指定时是1~6,而操作的时候是0~5)
00D1 2F14 MOV R17,R20
00D2 5011 SUBI R17,1
00D3 E001 LDI R16,1
00D4 940E0222 CALL lsl8
00D6 2F40 MOV R20,R16
00D7 9540 COM R20
(0037) PORTB=number; //输出位选
00D8 BB48 OUT P18,R20
(0038) PORTA|=BIT(BITLK); //更新位选
00D9 9ADC SBI P1B,4
(0039) Delayus(50); //调整时序
00DA E302 LDI R16,0x32
00DB E010 LDI R17,0
00DC DF84 RCALL _Delayus
(0040) PORTA&=~BIT(BITLK); //锁存位选
00DD 98DC CBI P1B,4
(0041) }
00DE 940E021C CALL pop_gset2
00E0 9508 RET
_All_smg_display:
i --> R20
pdata --> R22
00E1 940E0214 CALL push_gset2
00E3 01B8 MOVW R22,R16
(0042) /*******************************************
(0043) 函数名称: All_smg_display
(0044) 功 能: 6个数码管显示指定的内容
(0045) 参 数: *pdata--显示内容数组地址
(0046) 返回值 : 无
(0047) /********************************************/
(0048) void All_smg_display(uchar *pdata)
(0049) {
(0050) uchar i;
(0051) for(i=0;i<6;i++)
00E4 2744 CLR R20
00E5 C00C RJMP 0x00F2
(0052) {
(0053) One_smg_display(pdata[i],i+1);
00E6 2F24 MOV R18,R20
00E7 5F2F SUBI R18,0xFF
00E8 2FE4 MOV R30,R20
00E9 27FF CLR R31
00EA 0FE6 ADD R30,R22
00EB 1FF7 ADC R31,R23
00EC 8100 LDD R16,0+Z
00ED DFC7 RCALL _One_smg_display
(0054) Delayms(1);
00EE E001 LDI R16,1
00EF E010 LDI R17,0
00F0 DF88 RCALL _Delayms
00F1 9543 INC R20
00F2 3046 CPI R20,6
00F3 F390 BCS 0x00E6
(0055) }
(0056) }
00F4 940E021C CALL pop_gset2
00F6 9508 RET
_Cycle_smg_display:
i --> R20
j --> R10
pdata --> R22
00F7 940E0218 CALL push_gset3
00F9 01B8 MOVW R22,R16
(0057) /*******************************************
(0058) 函数名称: Cycle_smg_display
(0059) 功 能: 6个数码管从右向左循环滚动显示指定的内容(循环一次)
(0060) 参 数: *pdata--显示内容数组地址
(0061) 返回值 : 无
(0062) /********************************************/
(0063) void Cycle_smg_display(uchar *pdata)
(0064) {
(0065) uchar i,j;
(0066) for(i=0;i<240;i++) //共滚动6次,每次内容显示40个循环
00FA 2744 CLR R20
00FB C02B RJMP 0x0127
(0067) {
(0068) for(j=0;j<6;j++) //扫描6个数码管
00FC 24AA CLR R10
00FD C025 RJMP 0x0123
(0069) {
(0070) One_smg_display(pdata[(i/40+j)%6],j+1);//显示
00FE 2D2A MOV R18,R10
00FF 5F2F SUBI R18,0xFF
0100 E288 LDI R24,0x28
0101 E090 LDI R25,0
0102 2F04 MOV R16,R20
0103 2711 CLR R17
0104 932F PUSH R18
0105 933F PUSH R19
0106 019C MOVW R18,R24
0107 940E01D2 CALL div16s
0109 0118 MOVW R2,R16
010A 913F POP R19
010B 912F POP R18
010C 2C4A MOV R4,R10
010D 2455 CLR R5
010E 0C24 ADD R2,R4
010F 1C35 ADC R3,R5
0110 E086 LDI R24,6
0111 E090 LDI R25,0
0112 932F PUSH R18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -