hd_support.lis
来自「一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.」· LIS 代码 · 共 318 行
LIS
318 行
.module HD_Support.c
.area text(rom, con, rel)
0000 .dbfile F:\AVR\按键扫描\HD_Support.c
.area vector(rom, abs)
.org 18
0012 22C0 rjmp _Timer0_OVF_ISR
.area text(rom, con, rel)
0000 .dbfile F:\AVR\按键扫描\HD_Support.c
0000 .dbfunc e Device_INIT _Device_INIT fV
.even
0000 _Device_INIT::
0000 .dbline -1
0000 .dbline 84
0000 ; /***********************************************************
0000 ; * 函数库说明:底层硬件初始化函数库 *
0000 ; * 版本: *
0000 ; * 作者: *
0000 ; * 创建日期: *
0000 ; * -------------------------------------------------------- *
0000 ; * [硬件说明] *
0000 ; * 处理器: *
0000 ; * 系统时钟: *
0000 ; * -------------------------------------------------------- *
0000 ; * [支 持 库] *
0000 ; * 支持库名称:HD_Support.h *
0000 ; * 需要版本: ----- *
0000 ; * 支持库说明:底层硬件初始化声明库 *
0000 ; * *
0000 ; * 支持库名称:PF_Config.h *
0000 ; * 需要版本: ----- *
0000 ; * 支持库说明:硬件平台配置声明库 *
0000 ; * -------------------------------------------------------- *
0000 ; * [版本更新] *
0000 ; * 修改: *
0000 ; * 修改日期: *
0000 ; * 版本: *
0000 ; * -------------------------------------------------------- *
0000 ; * [版本历史] *
0000 ; * -------------------------------------------------------- *
0000 ; * [使用说明] *
0000 ; ***********************************************************/
0000 ;
0000 ; /********************
0000 ; * 头 文 件 配 置 区 *
0000 ; ********************/
0000 ; # include "PF_Config.h"
0000 ; # include "HD_Support.h"
0000 ;
0000 ; /********************
0000 ; * 系 统 宏 定 义 *
0000 ; ********************/
0000 ; # pragma interrupt_handler Timer0_OVF_ISR:iv_TIMER0_OVF
0000 ;
0000 ; /*------------------*
0000 ; * 常 数 宏 定 义 *
0000 ; *------------------*/
0000 ;
0000 ; /*------------------*
0000 ; * 动 作 宏 定 义 *
0000 ; *------------------*/
0000 ; #ifndef INSERT_TIMER0_OVF_ISR_CODE
0000 ; # define INSERT_TIMER0_OVF_ISR_CODE
0000 ; # warning "TIMER0_OVF_ISR haven`t been used but initialed!"
0000 ; #endif
0000 ;
0000 ; /********************
0000 ; * 模块结构体定义区 *
0000 ; ********************/
0000 ;
0000 ; /********************
0000 ; * 函 数 声 明 区 *
0000 ; ********************/
0000 ; void Device_INIT(void);
0000 ;
0000 ; /********************
0000 ; * 模块函数声明区 *
0000 ; ********************/
0000 ; static void Port_INIT(void);
0000 ; static void Timer0_INIT(void);
0000 ;
0000 ; /********************
0000 ; * 模块变量声明区 *
0000 ; ********************/
0000 ;
0000 ; /********************
0000 ; * 全局变量声明区 *
0000 ; ********************/
0000 ;
0000 ;
0000 ; /***********************************************************
0000 ; * 函数说明:系统硬件初始化函数 *
0000 ; * 输入: 无 *
0000 ; * 输出: 无 *
0000 ; * 调用函数:Port_INIT() Timer0_INIT() *
0000 ; ***********************************************************/
0000 ; void Device_INIT(void)
0000 ; {
0000 .dbline 85
0000 ; Port_INIT();
0000 04D0 rcall _Port_INIT
0002 .dbline 86
0002 ; Timer0_INIT();
0002 19D0 rcall _Timer0_INIT
0004 .dbline 89
0004 ; //*在这里添加其他初始化函数*//
0004 ;
0004 ; TIMSK = BIT(TOIE0); //启动定时期0溢出中断资源
0004 81E0 ldi R24,1
0006 89BF out 0x39,R24
0008 .dbline -2
0008 L1:
0008 .dbline 0 ; func end
0008 0895 ret
000A .dbend
000A .dbfunc s Port_INIT _Port_INIT fV
.even
000A _Port_INIT:
000A .dbline -1
000A .dbline 100
000A ; //*在这里添加其他全局寄存器的初始化代码*//
000A ; }
000A ;
000A ; /***********************************************************
000A ; * 函数说明:系统端口初始化函数 *
000A ; * 输入: 无 *
000A ; * 输出: 无 *
000A ; * 调用函数:无 *
000A ; ***********************************************************/
000A ; static void Port_INIT(void)
000A ; {
000A .dbline 104
000A ; //*在这里添加端口初始化代码*//
000A ;
000A ; //按键扫描
000A ; DDRC &= ~(BIT(PC1)|BIT(PC2));
000A 84B3 in R24,0x14
000C 897F andi R24,249
000E 84BB out 0x14,R24
0010 .dbline 105
0010 ; PORTC |= BIT(PC1)|BIT(PC2);
0010 85B3 in R24,0x15
0012 8660 ori R24,6
0014 85BB out 0x15,R24
0016 .dbline 107
0016 ;
0016 ; DDRC |= BIT(PC3)|BIT(PC4)|BIT(PC5)|BIT(PC0);
0016 84B3 in R24,0x14
0018 8963 ori R24,57
001A 84BB out 0x14,R24
001C .dbline 108
001C ; PORTC |= BIT(PC3)|BIT(PC4)|BIT(PC5)|BIT(PC0);
001C 85B3 in R24,0x15
001E 8963 ori R24,57
0020 85BB out 0x15,R24
0022 .dbline 111
0022 ;
0022 ; //结果显示用端口
0022 ; DDRD = 0xFF;
0022 8FEF ldi R24,255
0024 81BB out 0x11,R24
0026 .dbline 112
0026 ; PORTD = 0xFF;
0026 82BB out 0x12,R24
0028 .dbline 121
0028 ;
0028 ; #ifdef _USE_VIRTUAL_SPI_RCV_CODE
0028 ; //模拟SPI接收机
0028 ; DDRB &= ~(BIT(1)|BIT(2)|BIT(3));
0028 ; PORTB |= BIT(1)|BIT(2)|BIT(3);
0028 ; #endif
0028 ;
0028 ; #ifdef _USE_VIRTUAL_SPI_SND_CODE
0028 ; DDRB |= BIT(1)|BIT(2)|BIT(3);
0028 87B3 in R24,0x17
002A 8E60 ori R24,14
002C 87BB out 0x17,R24
002E .dbline 122
002E ; PORTB |= BIT(1)|BIT(2)|BIT(3);
002E 88B3 in R24,0x18
0030 8E60 ori R24,14
0032 88BB out 0x18,R24
0034 .dbline -2
0034 L2:
0034 .dbline 0 ; func end
0034 0895 ret
0036 .dbend
0036 .dbfunc s Timer0_INIT _Timer0_INIT fV
.even
0036 _Timer0_INIT:
0036 .dbline -1
0036 .dbline 133
0036 ; #endif
0036 ; }
0036 ;
0036 ; /***********************************************************
0036 ; * 函数声明:定时器0初始化函数 *
0036 ; * 输入: 无 *
0036 ; * 输出: 无 *
0036 ; * 调用函数:无 *
0036 ; ***********************************************************/
0036 ; static void Timer0_INIT(void)
0036 ; {
0036 .dbline 148
0036 ; //*在这里粘贴从代码生成向导中生成的初始化代码*//
0036 ; //*要求为1K的溢出中断 *//
0036 ;
0036 ; #ifdef USE_SYSTEM_CLOCK_1M
0036 ; TCCR0 = 0x00; //stop
0036 ; TCNT0 = 0x83; //set count
0036 ; TCCR0 = 0x02; //start timer
0036 ; #endif
0036 ; #ifdef USE_SYSTEM_CLOCK_4M
0036 ; TCCR0 = 0x00; //stop
0036 ; TCNT0 = 0xC2; //set count
0036 ; TCCR0 = 0x03; //start timer
0036 ; #endif
0036 ; #ifdef USE_SYSTEM_CLOCK_8M
0036 ; TCCR0 = 0x00; //stop
0036 2224 clr R2
0038 23BE out 0x33,R2
003A .dbline 149
003A ; TCNT0 = 0x83; //set count
003A 83E8 ldi R24,131
003C 82BF out 0x32,R24
003E .dbline 150
003E ; TCCR0 = 0x03; //start timer
003E 83E0 ldi R24,3
0040 83BF out 0x33,R24
0042 .dbline -2
0042 L3:
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbend
0044 .dbfunc e Timer0_OVF_ISR _Timer0_OVF_ISR fV
.even
0044 _Timer0_OVF_ISR::
0044 0A92 st -y,R0
0046 1A92 st -y,R1
0048 2A92 st -y,R2
004A 3A92 st -y,R3
004C 4A92 st -y,R4
004E 5A92 st -y,R5
0050 6A92 st -y,R6
0052 7A92 st -y,R7
0054 8A92 st -y,R8
0056 9A92 st -y,R9
0058 0A93 st -y,R16
005A 1A93 st -y,R17
005C 2A93 st -y,R18
005E 3A93 st -y,R19
0060 8A93 st -y,R24
0062 9A93 st -y,R25
0064 AA93 st -y,R26
0066 BA93 st -y,R27
0068 EA93 st -y,R30
006A FA93 st -y,R31
006C 0FB6 in R0,0x3f
006E 0A92 st -y,R0
0070 .dbline -1
0070 .dbline 161
0070 ; #endif
0070 ; }
0070 ;
0070 ; /***********************************************************
0070 ; * 函数声明:定时器0溢出中断处理程序 *
0070 ; * 输入: 无 *
0070 ; * 输出: 无 *
0070 ; * 调用函数:INSERT_TIMER0_OVF_ISR_CODE *
0070 ; ***********************************************************/
0070 ; void Timer0_OVF_ISR(void)
0070 ; {
0070 .dbline 169
0070 ; #ifdef USE_SYSTEM_CLOCK_1M
0070 ; TCNT0 = 0x83; //set count
0070 ; #endif
0070 ; #ifdef USE_SYSTEM_CLOCK_4M
0070 ; TCNT0 = 0xC2; //set count
0070 ; #endif
0070 ; #ifdef USE_SYSTEM_CLOCK_8M
0070 ; TCNT0 = 0x83; //set count
0070 83E8 ldi R24,131
0072 82BF out 0x32,R24
0074 .dbline 172
0074 ; #endif
0074 ;
0074 ; INSERT_TIMER0_OVF_ISR_CODE
0074 7894 sei
0076 .dbline 172
0076 00D0 rcall _Insert_Timer0_OVF_ISR_Code
0078 .dbline -2
0078 L4:
0078 .dbline 0 ; func end
0078 0990 ld R0,y+
007A 0FBE out 0x3f,R0
007C F991 ld R31,y+
007E E991 ld R30,y+
0080 B991 ld R27,y+
0082 A991 ld R26,y+
0084 9991 ld R25,y+
0086 8991 ld R24,y+
0088 3991 ld R19,y+
008A 2991 ld R18,y+
008C 1991 ld R17,y+
008E 0991 ld R16,y+
0090 9990 ld R9,y+
0092 8990 ld R8,y+
0094 7990 ld R7,y+
0096 6990 ld R6,y+
0098 5990 ld R5,y+
009A 4990 ld R4,y+
009C 3990 ld R3,y+
009E 2990 ld R2,y+
00A0 1990 ld R1,y+
00A2 0990 ld R0,y+
00A4 1895 reti
00A6 .dbend
00A6 ; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?