📄 电量计.lst
字号:
(0044)
(0045) /*------------------*
(0046) * 常 数 宏 定 义 *
(0047) *------------------*/
(0048)
(0049) /*------------------*
(0050) * 动 作 宏 定 义 *
(0051) *------------------*/
(0052)
(0053) /********************
(0054) * 模块结构体定义区 *
(0055) ********************/
(0056)
(0057) /********************
(0058) * 函 数 声 明 区 *
(0059) ********************/
(0060) void System_INIT(void);
(0061)
(0062) /********************
(0063) * 模块函数声明区 *
(0064) ********************/
(0065) static void Driver_INIT(void);
(0066)
(0067) /********************
(0068) * 模块变量声明区 *
(0069) ********************/
(0070)
(0071) /********************
(0072) * 全局变量声明区 *
(0073) ********************/
(0074)
(0075) /***********************************************************
(0076) * 函数说明:软件驱动初始化函数 *
(0077) * 输入: 无 *
(0078) * 输出: 无 *
(0079) * 调用函数:无 *
(0080) ***********************************************************/
(0081) static void Driver_INIT(void)
(0082) {
_Driver_INIT:
005C 9508 RET
(0083) //*在这里插入你的各类软件驱动初始化代码*//
(0084) }
(0085)
(0086) /***********************************************************
(0087) * 函数说明:系统初始化函数 *
(0088) * 输入: 无 *
(0089) * 输出: 无 *
(0090) * 调用函数:Device_INIT() Driver_INIT() *
(0091) ***********************************************************/
(0092) void System_INIT(void)
(0093) {
(0094) CLI();
_System_INIT:
005D 94F8 BCLR 7
(0095)
(0096) Device_INIT();
005E DFDC RCALL _Device_INIT
(0097) Driver_INIT();
005F DFFC RCALL _Driver_INIT
(0098)
(0099) //*在这里插入你的系统环境变量初始化代码*//
(0100)
(0101) SEI();
0060 9478 BSET 7
0061 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) unsigned int Voltage;
(0066) unsigned char Loop_Counter, Port_Value;
(0067)
(0068) System_INIT(); //调用初始化器件函数
_main:
Voltage --> R10
Port_Value --> R20
Loop_Counter --> R22
0062 DFFA RCALL _System_INIT
(0069)
(0070) SEI(); //器件初始化完成,允许中断
0063 9478 BSET 7
0064 C025 RJMP 0x008A
(0071)
(0072) while(TRUE)
(0073) {
(0074) ADCSRA |= 1<<ADSC; //置位ADSC位,启动一次转换
0065 9180007A LDS R24,0x7A
0067 6480 ORI R24,0x40
0068 9380007A STS 0x7A,R24
(0075) while(!(ADCSRA&(1<<ADIF))); //查询方式等待转换完成
006A 9020007A LDS R2,0x7A
006C FE24 SBRS R2,4
006D CFFC RJMP 0x006A
(0076)
(0077) Voltage = ADC; //读入ADCH和ADCL中的转换结果
006E 90A00078 LDS R10,0x78
0070 90B00079 LDS R11,0x79
(0078)
(0079) Loop_Counter = Voltage/170; //转换为光柱显示
0072 EA2A LDI R18,0xAA
0073 E030 LDI R19,0
0074 0185 MOVW R16,R10
0075 D018 RCALL div16u
0076 2F60 MOV R22,R16
(0080)
(0081) Port_Value = 0x00;
0077 2744 CLR R20
0078 C006 RJMP 0x007F
(0082) while(Loop_Counter>0)
(0083) {
(0084) Port_Value |= 1<<(Loop_Counter-1);
0079 2F16 MOV R17,R22
007A 5011 SUBI R17,1
007B E001 LDI R16,1
007C D02B RCALL lsl8
007D 2B40 OR R20,R16
(0085) Loop_Counter--;
007E 956A DEC R22
007F 2422 CLR R2
0080 1626 CP R2,R22
0081 F3B8 BCS 0x0079
(0086) }
(0087)
(0088) Port_Value^=0xFF; //由于端口上的LED在低电平时点亮,为了适应习惯
0082 EF8F LDI R24,0xFF
0083 E090 LDI R25,0
0084 2E24 MOV R2,R20
0085 2433 CLR R3
0086 2628 EOR R2,R24
0087 2639 EOR R3,R25
0088 2D42 MOV R20,R2
(0089) PORTB = Port_Value; //在这里对端口数据做了反相的处理
FILE: <library>
0089 B825 OUT 0x05,R2
008A CFDA RJMP 0x0065
008B 9508 RET
mod16u:
008C 9468 BSET 6
008D C001 RJMP xdiv16u
div16u:
008E 94E8 BCLR 6
xdiv16u:
008F 92EA ST R14,-Y
0090 92FA ST R15,-Y
0091 938A ST R24,-Y
0092 24EE CLR R14
0093 24FF CLR R15
0094 E180 LDI R24,0x10
0095 0F00 LSL R16
0096 1F11 ROL R17
0097 1CEE ROL R14
0098 1CFF ROL R15
0099 16E2 CP R14,R18
009A 06F3 CPC R15,R19
009B F018 BCS 0x009F
009C 1AE2 SUB R14,R18
009D 0AF3 SBC R15,R19
009E 9503 INC R16
009F 958A DEC R24
00A0 F7A1 BNE 0x0095
00A1 F416 BRTC 0x00A4
00A2 2D0E MOV R16,R14
00A3 2D1F MOV R17,R15
00A4 9189 LD R24,Y+
00A5 90F9 LD R15,Y+
00A6 90E9 LD R14,Y+
00A7 9508 RET
lsl8:
00A8 2311 TST R17
00A9 F019 BEQ 0x00AD
00AA 0F00 LSL R16
00AB 951A DEC R17
00AC CFFB RJMP lsl8
00AD 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -