📄 电量计.lst
字号:
(0063)
(0064) /********************
(0065) * 模块函数声明区 *
(0066) ********************/
(0067) static void Driver_INIT(void);
(0068)
(0069) /********************
(0070) * 模块变量声明区 *
(0071) ********************/
(0072)
(0073) /********************
(0074) * 全局变量声明区 *
(0075) ********************/
(0076)
(0077) /***********************************************************
(0078) * 函数说明:软件驱动初始化函数 *
(0079) * 输入: 无 *
(0080) * 输出: 无 *
(0081) * 调用函数:无 *
(0082) ***********************************************************/
(0083) static void Driver_INIT(void)
(0084) {
_Driver_INIT:
0072 9508 RET
(0085) //*在这里插入你的各类软件驱动初始化代码*//
(0086) }
(0087)
(0088) /***********************************************************
(0089) * 函数说明:系统初始化函数 *
(0090) * 输入: 无 *
(0091) * 输出: 无 *
(0092) * 调用函数:Device_INIT() Driver_INIT() *
(0093) ***********************************************************/
(0094) void System_INIT(void)
(0095) {
(0096) CLI();
_System_INIT:
0073 94F8 BCLR 7
(0097)
(0098) Device_INIT();
0074 DFC6 RCALL _Device_INIT
(0099) Driver_INIT();
0075 DFFC RCALL _Driver_INIT
(0100)
(0101) //*在这里插入你的系统环境变量初始化代码*//
(0102)
(0103) SEI();
0076 9478 BSET 7
0077 9508 RET
(0104) }
(0105)
(0106) /***********************************************************
(0107) * 函数说明:定时器0中断处理程序代码插入函数 *
(0108) * 输入: 无 *
(0109) * 输出: 无 *
(0110) * 调用函数:无 *
(0111) ***********************************************************/
(0112) void Insert_Timer0_OVF_ISR_Code (void)
(0113) {
(0114) TCNT0 = 0xFD; //重新加载定时器0
_Insert_Timer0_OVF_ISR_Code:
0078 EF8D LDI R24,0xFD
0079 BD86 OUT 0x26,R24
(0115)
(0116) if (IfGotADCValue) //检查是否采样完成
007A 90200100 LDS R2,IfGotADCValue
007C 2022 TST R2
007D F041 BEQ 0x0086
(0117) {
(0118) IfGotADCValue = False; //设置标志信号[*] 这里需要讲解一下信号同步的概念
007E 2422 CLR R2
007F 92200100 STS IfGotADCValue,R2
(0119) //同时需要说明,设置标志信号和启动ADC的顺序不能改变
(0120) START_ADC; //1MS启动一次AD转换
0081 9180007A LDS R24,0x7A
0083 6480 ORI R24,0x40
0084 9380007A STS 0x7A,R24
(0121) }
0086 9508 RET
_Insert_Adc_ISR_Code:
ADCValue --> R10
PORTValue --> R20
LoopCounter --> R22
0087 D045 RCALL push_gset3
(0122) }
(0123)
(0124) /***********************************************************
(0125) * 函数说明:ADC采样完成中断处理程序 *
(0126) * 输入: 无 *
(0127) * 输出: 无 *
(0128) ***********************************************************/
(0129) void Insert_Adc_ISR_Code(void)
(0130) {
(0131) unsigned int ADCValue = ADC; //获取ADC10位精度的采样结果
0088 90A00078 LDS R10,0x78
008A 90B00079 LDS R11,0x79
(0132) unsigned char LoopCounter = 0,PORTValue = 0;
008C 2766 CLR R22
008D 2744 CLR R20
(0133)
(0134) LoopCounter = ADCValue / 170; //转换为端口光柱显示
008E EA2A LDI R18,0xAA
008F E030 LDI R19,0
0090 0185 MOVW R16,R10
0091 D01B RCALL div16u
0092 2F60 MOV R22,R16
0093 C006 RJMP 0x009A
(0135)
(0136) while(LoopCounter)
(0137) {
(0138) PORTValue |= 1<<(LoopCounter-1);
0094 2F16 MOV R17,R22
0095 5011 SUBI R17,1
0096 E001 LDI R16,1
0097 D07E RCALL lsl8
0098 2B40 OR R20,R16
(0139) LoopCounter--;
0099 956A DEC R22
009A 2366 TST R22
009B F7C1 BNE 0x0094
(0140) }
(0141)
(0142) PORTB = PORTValue ^ 0xFF; //由于端口上的LED在低电平时点亮,为了适应习惯
009C EF8F LDI R24,0xFF
009D E090 LDI R25,0
009E 2E24 MOV R2,R20
009F 2433 CLR R3
00A0 2628 EOR R2,R24
00A1 2639 EOR R3,R25
00A2 B825 OUT 0x05,R2
(0143) //在这里对端口数据做了反相的处理
(0144) IfGotADCValue = True; //设置采样完成标志
00A3 E081 LDI R24,1
00A4 93800100 STS IfGotADCValue,R24
00A6 D020 RCALL pop_gset3
00A7 9508 RET
FILE: D:\设计项目\深入浅出AVR\光盘文件\实例程序源代码\实例13_电量计\实例13_电量计_中断方式\System.c
(0001) /*********************************************************/
(0002) /* */
(0003) /* 实例13 电量计 中断方式 */
(0004) /* */
(0005) /* 程序设计 江海波 */
(0006) /* */
(0007) /* 编写时间 : 2007-05 版本 : V1.0 */
(0008) /* */
(0009) /* 提示 : 代码受版权保护,示例程序用于工程应谨慎 */
(0010) /* */
(0011) /* E-mail : soundman@sohu.com */
(0012) /*-------------------------------------------------------*/
(0013) /* 硬件环境: */
(0014) /* */
(0015) /* 实验电路板,ATmega48单片机,CPU时钟1MHz */
(0016) /* ------------------------------------------------------*/
(0017) /* 软件环境: */
(0018) /* */
(0019) /* ICCAVR 6.31A */
(0020) /* ------------------------------------------------------*/
(0021) /* 最后修改时间: */
(0022) /* */
(0023) /*-------------------------------------------------------*/
(0024) /* 历史版本纪录: */
(0025) /* */
(0026) /*********************************************************/
(0027)
(0028) /********************
(0029) * 头 文 件 配 置 区 *
(0030) ********************/
(0031) # include "PF_Config.h"
(0032)
(0033) /********************
(0034) * 系 统 宏 定 义 *
(0035) ********************/
(0036)
(0037) /*------------------*
(0038) * 常 数 宏 定 义 *
(0039) *------------------*/
(0040)
(0041) /*------------------*
(0042) * 动 作 宏 定 义 *
(0043) *------------------*/
(0044)
(0045) /********************
(0046) * 模块结构体定义区 *
(0047) ********************/
(0048)
(0049) /********************
(0050) * 模块函数声明区 *
(0051) ********************/
(0052)
(0053) /********************
(0054) * 模块变量声明区 *
(0055) ********************/
(0056)
(0057) /***********************************************************
(0058) * 函数说明:主函数 *
(0059) * 输入: 无 *
(0060) * 输出: 无 *
(0061) * 调用函数:System_INIT() *
(0062) ***********************************************************/
(0063) void main(void)
(0064) {
(0065) System_INIT(); //代码初始化
_main:
00A8 DFCA RCALL _System_INIT
(0066)
(0067) while(TRUE); //超级循环
FILE: <library>
00A9 CFFF RJMP 0x00A9
00AA 9508 RET
mod16u:
00AB 9468 BSET 6
00AC C001 RJMP xdiv16u
div16u:
00AD 94E8 BCLR 6
xdiv16u:
00AE 92EA ST R14,-Y
00AF 92FA ST R15,-Y
00B0 938A ST R24,-Y
00B1 24EE CLR R14
00B2 24FF CLR R15
00B3 E180 LDI R24,0x10
00B4 0F00 LSL R16
00B5 1F11 ROL R17
00B6 1CEE ROL R14
00B7 1CFF ROL R15
00B8 16E2 CP R14,R18
00B9 06F3 CPC R15,R19
00BA F018 BCS 0x00BE
00BB 1AE2 SUB R14,R18
00BC 0AF3 SBC R15,R19
00BD 9503 INC R16
00BE 958A DEC R24
00BF F7A1 BNE 0x00B4
00C0 F416 BRTC 0x00C3
00C1 2D0E MOV R16,R14
00C2 2D1F MOV R17,R15
00C3 9189 LD R24,Y+
00C4 90F9 LD R15,Y+
00C5 90E9 LD R14,Y+
00C6 9508 RET
pop_gset3:
00C7 E0E4 LDI R30,4
00C8 C00C RJMP pop
push_gset5:
00C9 92FA ST R15,-Y
00CA 92EA ST R14,-Y
push_gset4:
00CB 92DA ST R13,-Y
00CC 92CA ST R12,-Y
push_gset3:
00CD 92BA ST R11,-Y
00CE 92AA ST R10,-Y
push_gset2:
00CF 937A ST R23,-Y
00D0 936A ST R22,-Y
push_gset1:
00D1 935A ST R21,-Y
00D2 934A ST R20,-Y
00D3 9508 RET
pop_gset1:
00D4 E0E1 LDI R30,1
pop:
00D5 9149 LD R20,Y+
00D6 9159 LD R21,Y+
00D7 FDE0 SBRC R30,0
00D8 9508 RET
00D9 9169 LD R22,Y+
00DA 9179 LD R23,Y+
00DB FDE1 SBRC R30,1
00DC 9508 RET
00DD 90A9 LD R10,Y+
00DE 90B9 LD R11,Y+
00DF FDE2 SBRC R30,2
00E0 9508 RET
00E1 90C9 LD R12,Y+
00E2 90D9 LD R13,Y+
00E3 FDE3 SBRC R30,3
00E4 9508 RET
00E5 90E9 LD R14,Y+
00E6 90F9 LD R15,Y+
00E7 9508 RET
push_lset:
00E8 93FA ST R31,-Y
00E9 93EA ST R30,-Y
00EA 93BA ST R27,-Y
00EB 93AA ST R26,-Y
00EC 939A ST R25,-Y
00ED 938A ST R24,-Y
00EE 933A ST R19,-Y
00EF 932A ST R18,-Y
00F0 931A ST R17,-Y
00F1 930A ST R16,-Y
00F2 929A ST R9,-Y
00F3 928A ST R8,-Y
00F4 927A ST R7,-Y
00F5 926A ST R6,-Y
00F6 925A ST R5,-Y
00F7 924A ST R4,-Y
00F8 923A ST R3,-Y
00F9 922A ST R2,-Y
00FA 921A ST R1,-Y
00FB 920A ST R0,-Y
00FC B60F IN R0,0x3F
00FD 920A ST R0,-Y
00FE 9508 RET
pop_lset:
00FF 9009 LD R0,Y+
0100 BE0F OUT 0x3F,R0
0101 9009 LD R0,Y+
0102 9019 LD R1,Y+
0103 9029 LD R2,Y+
0104 9039 LD R3,Y+
0105 9049 LD R4,Y+
0106 9059 LD R5,Y+
0107 9069 LD R6,Y+
0108 9079 LD R7,Y+
0109 9089 LD R8,Y+
010A 9099 LD R9,Y+
010B 9109 LD R16,Y+
010C 9119 LD R17,Y+
010D 9129 LD R18,Y+
010E 9139 LD R19,Y+
010F 9189 LD R24,Y+
0110 9199 LD R25,Y+
0111 91A9 LD R26,Y+
0112 91B9 LD R27,Y+
0113 91E9 LD R30,Y+
0114 91F9 LD R31,Y+
0115 9508 RET
lsl8:
0116 2311 TST R17
0117 F019 BEQ 0x011B
0118 0F00 LSL R16
0119 951A DEC R17
011A CFFB RJMP lsl8
011B 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -