📄 smg.lst
字号:
__start:
__text_start:
0043 E5CF LDI R28,0x5F
0044 E0D4 LDI R29,4
0045 BFCD OUT P3D,R28
0046 BFDE OUT P3E,R29
0047 51C0 SUBI R28,0x10
0048 40D0 SBCI R29,0
0049 EA0A LDI R16,0xAA
004A 8308 STD R16,0+Y
004B 2400 CLR R0
004C E6E0 LDI R30,0x60
004D E0F0 LDI R31,0
004E E010 LDI R17,0
004F 36E0 CPI R30,0x60
0050 07F1 CPC R31,R17
0051 F011 BEQ 0x0054
0052 9201 ST R0,Z+
0053 CFFB RJMP 0x004F
0054 8300 STD R16,0+Z
0055 E8E6 LDI R30,0x86
0056 E0F0 LDI R31,0
0057 E6A0 LDI R26,0x60
0058 E0B0 LDI R27,0
0059 E010 LDI R17,0
005A 38E6 CPI R30,0x86
005B 07F1 CPC R31,R17
005C F021 BEQ 0x0061
005D 95C8 LPM
005E 9631 ADIW R30,1
005F 920D ST R0,X+
0060 CFF9 RJMP 0x005A
0061 940E012F CALL _main
_exit:
0063 CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
0064 940E01A2 CALL push_gset2
0066 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晶振下,通过软件仿真反复实验得到的数值
0067 E005 LDI R16,5
0068 E010 LDI R17,0
0069 019B MOVW R18,R22
006A 940E017B CALL empy16s
006C 01B8 MOVW R22,R16
006D 9576 LSR R23
006E 9567 ROR R22
006F 9576 LSR R23
0070 9567 ROR R22
(0031) for( i=0;i<US;i++);
0071 2744 CLR R20
0072 2755 CLR R21
0073 C002 RJMP 0x0076
0074 5F4F SUBI R20,0xFF
0075 4F5F SBCI R21,0xFF
0076 1746 CP R20,R22
0077 0757 CPC R21,R23
0078 F3D8 BCS 0x0074
(0032) }
0079 940E01AA CALL pop_gset2
007B 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
007C 940E01A2 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++)
007E 2744 CLR R20
007F 2755 CLR R21
0080 C00B RJMP 0x008C
(0043) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
0081 2766 CLR R22
0082 2777 CLR R23
0083 C002 RJMP 0x0086
0084 5F6F SUBI R22,0xFF
0085 4F7F SBCI R23,0xFF
0086 3765 CPI R22,0x75
0087 E0E4 LDI R30,4
0088 077E CPC R23,R30
0089 F3D0 BCS 0x0084
008A 5F4F SUBI R20,0xFF
008B 4F5F SBCI R21,0xFF
008C 1740 CP R20,R16
008D 0751 CPC R21,R17
008E F390 BCS 0x0081
(0044) }
008F 940E01AA CALL pop_gset2
0091 9508 RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功 能: 初始化实验板,关闭全部功能
(0048) 参 数: 无
(0049) 返回值 : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) DDRA=0xFF; //将四个IO口全部配置为输出
_Board_init:
0092 EF8F LDI R24,0xFF
0093 BB8A OUT P1A,R24
(0054) DDRB=0xFF;
0094 BB87 OUT P17,R24
(0055) DDRC=0xFF;
0095 BB84 OUT P14,R24
(0056) DDRD=0xFF;
0096 BB81 OUT P11,R24
(0057)
(0058) SPCR=0x00; //还原SPI口,使其为正常端口
0097 2422 CLR R2
0098 B82D OUT P0D,R2
(0059)
(0060) PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
0099 9ADE SBI P1B,6
(0061) PORTC&=~BIT(PC6); //(RELAY)初始化继电器为常闭连接状态
009A 98AE CBI P15,6
(0062) PORTA&=~BIT(PA1); //关闭SPI总线DA
009B 98D9 CBI P1B,1
(0063) PORTB=0xFF; //关闭LED
009C BB88 OUT P18,R24
(0064) PORTA|=BIT(LEDLK); //锁存数据,使LED熄灭
009D 9ADA SBI P1B,2
(0065) Delayus(5);
009E E005 LDI R16,5
009F E010 LDI R17,0
00A0 DFC3 RCALL _Delayus
(0066) PORTA&=~BIT(LEDLK);
00A1 98DA CBI P1B,2
(0067)
(0068) PORTB=0x00; //输出段选
00A2 2422 CLR R2
00A3 BA28 OUT P18,R2
(0069) PORTA|=BIT(SEGLK);
00A4 9ADB SBI P1B,3
(0070) Delayus(50);
00A5 E302 LDI R16,0x32
00A6 E010 LDI R17,0
00A7 DFBC RCALL _Delayus
(0071) PORTA&=~BIT(SEGLK);
00A8 98DB CBI P1B,3
(0072)
(0073) PORTB=0xFF; //输出位选
00A9 EF8F LDI R24,0xFF
00AA BB88 OUT P18,R24
(0074) PORTA|=BIT(BITLK);
00AB 9ADC SBI P1B,4
(0075) Delayus(50);
00AC E302 LDI R16,0x32
00AD E010 LDI R17,0
00AE DFB5 RCALL _Delayus
(0076) PORTA&=~BIT(BITLK);
00AF 98DC CBI P1B,4
(0077)
(0078) PORTD=0xFF;
00B0 EF8F LDI R24,0xFF
00B1 BB82 OUT P12,R24
(0079) PORTA|=BIT(PA7);
00B2 9ADF SBI P1B,7
(0080) Delayus(50);
00B3 E302 LDI R16,0x32
00B4 E010 LDI R17,0
00B5 DFAE RCALL _Delayus
(0081) PORTA&=~BIT(PA7);
00B6 98DF CBI P1B,7
(0082)
(0083)
(0084) }
00B7 9508 RET
_One_smg_display:
number --> R20
data --> R22
00B8 940E01A2 CALL push_gset2
00BA 2F42 MOV R20,R18
00BB 2F60 MOV R22,R16
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\2_SMG\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) #include <AVR_PQ1A.h> //包含自定义常量头文件
(0013)
(0014) #pragma data:code
(0015) const SEGMENT[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
(0016) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0017)
(0018) /*******************************************
(0019) 函数名称: One_smg_display
(0020) 功 能: 指定的数码管显示指定的内容
(0021) 参 数: data--显示的内容(0-15)
(0022) number--指定的数码管(1-6)
(0023) 返回值 : 无
(0024) /********************************************/
(0025) void One_smg_display(uchar data,uchar number)
(0026) {
(0027) PORTB|=0x3F; //输出位选
00BC B388 IN R24,P18
00BD 638F ORI R24,0x3F
00BE BB88 OUT P18,R24
(0028) PORTA|=BIT(BITLK); //更新位选
00BF 9ADC SBI P1B,4
(0029) Delayus(50); //调整时序
00C0 E302 LDI R16,0x32
00C1 E010 LDI R17,0
00C2 DFA1 RCALL _Delayus
(0030) PORTA&=~BIT(BITLK); //锁存位选
00C3 98DC CBI P1B,4
(0031)
(0032) PORTB=SEGMENT[data]; //输出段选
00C4 E082 LDI R24,2
00C5 9F86 MUL R24,R22
00C6 01F0 MOVW R30,R0
00C7 E680 LDI R24,0x60
00C8 E090 LDI R25,0
00C9 0FE8 ADD R30,R24
00CA 1FF9 ADC R31,R25
00CB 9005 LD R0,R0
00CC 9014 LD R1,R1
00CD 01F0 MOVW R30,R0
00CE BBE8 OUT P18,R30
(0033) PORTA|=BIT(SEGLK); //更新段选
00CF 9ADB SBI P1B,3
(0034) Delayus(50); //调整时序
00D0 E302 LDI R16,0x32
00D1 E010 LDI R17,0
00D2 DF91 RCALL _Delayus
(0035) PORTA&=~BIT(SEGLK); //锁存段选
00D3 98DB CBI P1B,3
(0036)
(0037) number=~BIT(number-1); //调整位选(指定时是1~6,而操作的时候是0~5)
00D4 2F14 MOV R17,R20
00D5 5011 SUBI R17,1
00D6 E001 LDI R16,1
00D7 940E01C9 CALL lsl8
00D9 2F40 MOV R20,R16
00DA 9540 COM R20
(0038) PORTB=number; //输出位选
00DB BB48 OUT P18,R20
(0039) PORTA|=BIT(BITLK); //更新位选
00DC 9ADC SBI P1B,4
(0040) Delayus(50); //调整时序
00DD E302 LDI R16,0x32
00DE E010 LDI R17,0
00DF DF84 RCALL _Delayus
(0041) PORTA&=~BIT(BITLK); //锁存位选
00E0 98DC CBI P1B,4
(0042) }
00E1 940E01AA CALL pop_gset2
00E3 9508 RET
_All_smg_display:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -