版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章C语言程序设计何宾2023.08内嵌汇编程序程序开发人员在使用C语言编写应用程序代码时,经常会遇到需要使用汇编语言编写部分代码的情况有些汇编程序在整个软件设计工程中是必须的比如:启动引导代码而其他地方使用汇编语言是为了提高整个软件设计工程的运行效率内嵌汇编程序
--嵌入汇编代码的方法在C语言中使用汇编语言的方法包括两种:在C语言程序代码中内嵌汇编语言C语言代码程序,调用外部汇编语言编写的程序在C源文件中,将汇编代码写在命令中间#pragmaasm……#pragmaendasm内嵌汇编程序
--嵌入汇编代码的方法编译器可以从有效的C源文件生成汇编程序源文件(.SRC)创建汇编源文件的原因包括:使用asm和endasm命令将内联汇编添加到C函数中需要手工优化编译器的汇编程序输出。
程序开发人员正在用汇编代码编写程序,并希望用C语言原型化函数和参数内嵌汇编程序
--嵌入汇编代码的方法无论创建.SRC的原因是什么,所需要的步骤始终相同:创建C源文件添加任何要求的内联汇编指令使用SRC命令编译重命名.SRC文件,这样不会被原始C源文件的后续编译覆盖(如果需要)对创建的汇编程序源文件进行修改使用汇编器进行汇编注:当使用SRC命令时,编译器输出汇编器源文件.SRC,不输出目标(.OBJ)文件。一旦C源文件转换为汇编器源文件,C符号和源代码级调试就不可用内嵌汇编程序
--设计实例#include"stdio.h"//包含头文件stdio.h#include"reg251s.h"//包含头文件reg251s.h
/*****声明整型变量C1,位于单片机地址为e:0x0100的存储单元****/unsignedintedataC1_at_0x100;/*****声明整型变量B1,位于单片机地址为e:0x0102的地址单元****/unsignedintedataB1_at_0x102;/*****声明整型变量D,位于单片机地址为e:0x0200的地址单元****/unsignedintedataD1_at_0x200;/*****声明整型变量e,位于单片机地址为e:0x0202的地址单元*****/unsignedintedatae_at_0x202;内嵌汇编程序
--设计实例voidmain()//定义main函数{ C1=1000;//定义并初始化整型变量C1 B1=900;//定义并初始化整型变量B1
SCON=0x52;//配置串口寄存器SCONTMOD=0x20;//配置串口寄存器TMODTCON=0x69;//配置串口寄存器TCON
TH1=0xF3;//配置串口寄存器TH1#pragmaasm//内嵌汇编命令,表示开始/****单片机e:0x0100单元的内容送给寄存器WR0*****/ MOVWR0,edata0x100 内嵌汇编程序
--设计实例ADDWR0,WR2//(WR2)+(WR0)→WR0/***寄存器WR0的内容保存到单片机e:0x0200单元*****/ MOVedata0x200,WR0#pragmaendasm//内嵌汇编命令,表示结束 e=D1;//将D1的值送给e printf("%d\n",e);//打印变量e的值 while(1);//无限循环设置断点}内嵌汇编程序
--设计实例定制文件
--基本I/O下面的文件包含低层流I/O程序使用μVisionIDE时,只需要将修改后的版本添加到工程中即可C源文件功能PUTCHAR.C有输出字符的所有流程序使用。程序开发人员可以根据自己的硬件(例如LCD或LED显示器)修改该程序。默认是通过串口输出字符。XON/XOFF协议用于流控制。换行符(“\n”)转换为回车符/换行符序列(“\r\n”)GETKEY.C由输入字符的所有流程序使用。程序开发人员可以根据自己的硬件(例如矩阵键盘)修改该程序。默认是通过串口读取字符。不执行数据转换定制文件
--存储器分配下面文件用于存储器分配例程的源代码C源文件功能CALLOC.C该文件包含calloc库例程的源代码。该例程从存储器池中为数组分配存储器FREE.C该文件包含free库例程的源代码。该例程将先前分配的存储器块返回到存储器池INIT_MEM.C该文件包含init_mempool库例程的源代码。该例程允许程序开发人员指定存储池的位置和大小,可以使用malloc、calloc和realloc例程从中分配存储器MALLOC.C该文件包含malloc库例程的源代码。该例程从存储池中分配存储器REALLOC.C该文件包含realloc库例程的源代码。该例程调整先前分配的存储块的大小存储器分配
--calloc该函数为具有num元素的数组分配存储器,数组中的每个元素占用len字节并初始化为0。分配的存储器字节总数为num*len该函数的原型为:#include<stdlib.h>*calloc(num,len);其中num为条目的个数,len为每个条目的长度该函数返回一个执行已分配存储器的指针如果无法满足存储器分配请求,则返回一个空指针存储器分配
--freefree函数将存储块返回到存储池中。参数p指向先前用calloc、malloc或realloc函数分配的存储器块该函数的原型为:#include<stdlib.h>voidfree(voidxdata*p);其中*p指向要释放的块一旦该函数将其返回到存储器池,该块就可以用于后续分配如果p是空指针,则忽略它存储器分配
--init_mempoolInit_mempool函数初始化存储器管理例程,并且提供存储池的起始地址和大小该函数的原型为:#include<stdlib.h>voidinit_mempool(voidxdata*p,unsignedintsize);其中p参数指向xdata中使用calloc、free、malloc和realloc库函数管理的存储区域size参数指定用于存储池的字节数存储器分配
--init_mempool注:在调用任何其他存储管理函数(calloc、free、malloc、realloc)之前,程序必须调用init_mempool函数来初始化存储器管理例程,并提供存储池的起始地址和大小。在程序开始时,只调用一次init_mempol函数存储器分配
--malloc该函数从长度为size大小的存储池中分配存储块该函数的原型为:#include<stdlib.h>voidxdata*malloc(unsignedintsize);其中size为要分配块的大小存储器分配
--reallocrealloc函数更改之前分配的存储块的大小该函数的原型为:#include<stdlib.h>voidxdata*realloc(voidxdata*p,unsignedintsize);其中:p参数指向分配的块,size指定块的新的大小现有块的内容将复制到新的块由于块大小较大,新块中的任何其他区域都不会初始化该函数返回指向新块的指针如果存储池中没有足够的存储器来满足存储器请求,则返回空指针,最初的存储块不受影响存储器分配
--设计实例存储器动态分配的C语言描述#include"stdlib.h"//包含头文件stdlib.h/*声明全局字符数组malloc_mempool*/unsignedcharxdatamalloc_mempool[0x1000];
voidmain()//定义main主函数{inti;//定义整型变量ivoid*p;//定义指针*p/*调用函数init_mempool,初始存储池*/init_mempool(&malloc_mempool,sizeof(malloc_mempool));
存储器分配
--设计实例p=malloc(100);//调用函数malloc,动态分配存储块for(i=0;i<100;i++)//p指向存储块,给存储块的单元分配数((char*)p)[i]=i;//总计执行100次写存储单元的操作free(p);//调用函数free,回收之前分配的存储块while(1);//无限循环设置断点}C语言设计实例
--按键扫描与显示本节将使用C语言编写代码,识别STC32G系列单片机硬件开发平台上的按键,并在七段数码管上以从左到右的形式,记录按键的顺序比如,第一次按键“1”时,在七段数码管上显示1;在第二次按键“2”时,在七段数码管上显示12;在第三次按键“4”时,在七段数码管上显示124由于STC系列单片机硬件开发平台上最多有8个七段数码管,因此可以最多显示当前按键以前8次的按键,按键以其所对应的数字标识C语言设计实例:按键扫描与显示
--按键的识别原理在STC32系列单片机硬件开发平台上提供了8个按键,这8个按键按2×4形式排列(2行和4列)C语言设计实例:按键扫描与显示
--按键的识别原理判断按键的方法,采用的是扫描法具体来说,首先要确定有无按键按下,然后确定具体按下了哪个键开发板上给每个按键进行标号,按照行的顺序从0~3(SW32~SW35)、4~7(SW36~SW39)C语言设计实例:按键扫描与显示
--按键的识别原理在上电复位后,除P3.0和P3.1引脚外,其他所有I/O引脚均设置为高阻模式因此,在上电复位后,需要使用软件正确设置I/O引脚的驱动模式当某个I/O引脚Px.y设置为准双向时,如果要读取该引脚的外部输入状态,需要先给引脚Px.y设置为逻辑“1”,然后才能回读该引脚的状态为什么?要特别注意!!!!!C语言设计实例:按键扫描与显示
--按键的识别原理从上图可知以下的事实P0.6和P0.7引脚分别通过上拉电阻R59和R60连接到SYS-VCC因此当没有按键按下时,这些引脚已经被拉高到逻辑“1”(高电平)当没有按下按键时,P0.0、P0.1、P0.2和P.3引脚处于悬空状态既没有拉高也没有拉低(即没有上拉到SYS-VCC和下拉到GND)从这两个方面综合判断得到下面的结论P0.0~P0.3引脚需要有确定的逻辑状态,也就是在实际中P0.0~P0.3应该为输出,或者逻辑”1”(高电平)或逻辑“0”(低电平)P0.7~P0.6为输入,也就是读取P0.7~P0.6引脚的状态C语言设计实例:按键扫描与显示
--按键的识别原理判断是否按下按键先将引脚P0.0、P0.1、P0.2和P0.3设置为逻辑“0”(低电平)如果没有按下任何一个按键,则引脚P0.6或P0.7仍然处于上拉状态,即逻辑“1”(高电平),此时如果读取这两个端口,读取的值应该是“11”,分别对应于引脚P0.7和引脚P0.6只要有一个按键按下,则引脚P0.6或引脚P0.7被拉到逻辑“0”(低电平),也就是读取引脚P0.6和引脚P0.7的输入逻辑状态,它们组合的值一定不等于“11”C语言设计实例:按键扫描与显示
--按键的识别原理下面将判断具体按下的是编号0~7之间某个按键驱动引脚P0.3为逻辑“0“(低电平),驱动引脚P0.2、引脚P0.1和引脚P0.0为逻辑”1“(高电平)当按下标号为0、1、2、4、5、6的按键时,引脚P0.6和引脚P0.7的输入逻辑状态不会发生任何变化如果按下标号为3的按键,则将引脚P0.6拉低,即变化到逻辑“0”(低电平),而其他引脚状态仍然为逻辑“1”(高电平)。此时,如果读取这引脚P0.7和引脚P0.6的输入状态,则读取值的组合应该为“10”如果按下标号为7的按键,则将引脚P0.7拉低,即变化到逻辑“0”(低电平),而其他引脚状态仍然为逻辑“1”(高电平)。此时,如果读取引脚P0.7和引脚P0.6的输入状态,则读取值的组合应该为“01”C语言设计实例:按键扫描与显示
--按键的识别原理驱动P0.2引脚为逻辑“0”(低电平),驱动引脚P0.3、引脚P0.1和引脚P0.0为逻辑“1”(高电平)则当按下标号为0、1、3、4、5、7的按键时,引脚P0.6和引脚P0.7的状态不会发生任何变化如果按下标号为2的按键,则将引脚P0.6拉低,即变化到逻辑“0”(低电平),而其他引脚状态仍然为逻辑”1“(高电平)。此时,如果读取引脚P0.7和引脚P0.6的输入状态,则取值的组合应该为”10”如果按下标号为6的按键,则将引脚P0.7拉低,即变化到逻辑“0”(低电平),而其他引脚状态仍然为逻辑“1”(高电平)。此时,如果读取引脚P0.7和引脚P0.6的输入状态,读取的值应该是“01”C语言设计实例:按键扫描与显示
--按键的识别原理驱动P0.1引脚为逻辑“0”(低电平),驱动引脚P0.3、引脚P0.2和引脚P0.0引脚为逻辑“1”(高电平)则当按下标号为0、2、3、4、6、7的按键时,引脚P0.6和引脚P0.7的状态不会发生任何变化如果按下标号为1的按键,则将引脚P0.6拉低,即变化到逻辑“0”(低电平),而其他引脚状态仍然为逻辑“1”(高电平)。此时,如果读取引脚P0.7和引脚P0.6的输入状态,读取的值应该是“10”如果按下标号为5的按键,则将引脚P0.7拉低,即变化到逻辑“0”(低电平),而其他引脚状态仍然为逻辑“1”(高电平)。此时,如果读取引脚P0.7和引脚P0.6的输入状态,读取的值应该是“01”C语言设计实例:按键扫描与显示
--按键的识别原理驱动P0.0引脚为逻辑“0”(低电平),驱动引脚P0.3、引脚P0.2和引脚P0.1为逻辑“1”(高电平)则当按下标号为1、2、3、5、6、7的按键时,引脚P0.6和引脚P0.7的状态不会发生任何变化如果按下标号为0的按键,则将引脚P0.6拉低,即变化到逻辑“0“(低电平),而其他引脚状态仍然为逻辑“1”(高电平)。此时,如果读取引脚P0.7和引脚P0.6的输入状态,读取的值应该是“10”如果按下标号为4的按键,则将引脚P0.7拉低,即变化到逻辑“0”(低电平),而其他引脚状态仍然为逻辑“1”(高电平)。此时,如果读取引脚P0.7和引脚P0.6的输入状态,读取的值应该是“01”C语言设计实例:按键扫描与显示
--按键的识别原理上面详细介绍了具体扫描矩阵按键的方法所谓的扫描就是让驱动引脚P0.0、引脚P0.1、引脚P0.2和引脚P0.3的逻辑电平(用逻辑“0”和逻辑“1”表示)快速的在“0111”、“1011”、“1101”和“1110”之间进行变化,这样就能在按下按键的时候,知道按下那个具体的按键C语言设计实例:按键扫描与显示
--七段数码管的原理STC32G系列单片机硬件开发平台上的七段数码管驱动电路C语言设计实例:按键扫描与显示
--七段数码管的原理在该硬件开发平台上,通过两个4位七段数码管拼接成一个8位七段数码管这8位七段数码管共用a、b、c、d、e、f、g和h段,这8个段通过限流电阻分别连接到STC32G12K128单片机的引脚P6.0~引脚P6.7用于选择8位7段数码管的其中一位数码管的信号是COM0~COM7(即管选信号),而COM0~COM7又是由PNP型三极管SS8550驱动。当SS8550的基级为逻辑“0”(低电平)时,三极管导通,8个三极管SS8550的基级通过限流电阻分别连接到STC32G12K128单片机的引脚P7.0~引脚P7.7。当三极管导通时,迅速进入饱和状态,数码管的管选信号COMx为逻辑“1”(高电平)C语言设计实例:按键扫描与显示
--七段数码管的原理根据上面的分析可知,要想在8位七段数码管上的某个数码管上正确的显示数字首先,要将对应的P7.x引脚驱动为逻辑“0”(低电平),这样对应的COMx信号为逻辑“1”(高电平)然后,给段码选择信号所连接的引脚P6.0~引脚P6.7施加逻辑“0”(低电平)重要!!!根据上面的分析过程可知这个8位七段数码管为共阳极七段数码管,即COMx为逻辑“1”(高电平),对应的段码为逻辑“0”(低电平)时,在七段数码管上显示正确的数字C语言设计实例:按键扫描与显示
--设计中使用的寄存器在该设计中,使用了端口P0、P6和P7,对于这3个端口的驱动和控制,需要使用端口模式寄存器和数据寄存器对于端口P6,在前面章节进行了详细的介绍,在此仅介绍与端口P0和端口P7相关的寄存器设计中使用的寄存器
--端口模式寄存器P0端口模式寄存器P0M0该寄存器位于SFR地址为0x94的位置。当复位后,该寄存器的内容为“00000000”P0端口模式寄存器P0M1该寄存器位于SFR地址为0x93的位置。当复位后,该寄存器的内容为“11111111”位索引76543210名字P07M0P06M0P05M0P04M0P03M0P02M0P01M0P00M0位索引76543210名字P07M1P06M1P05M1P04M1P03M1P02M1P01M1P00M1设计中使用的寄存器
--端口模式寄存器寄存器P0M0和寄存器P0M1中,一对相同的位索引设置对应的引脚工作模式比如寄存器P0M0中的位索引0(P0M0.0)和寄存器P0M1中的位索引0(P0M1.0)共同设置P0端口内引脚0(P0.0)的工作模式寄存器P0M0中的位索引7(P0M0.7)和寄存器P0M1中的位索引7(P0M1.7)共同设置P0端口内引脚7(P0.7)的工作模式设计中使用的寄存器
--端口模式寄存器PxM0.y和PxM1.y(x对应具体的端口号,y对应端口中的某个引脚编号)组合在一起的功能PxM1.yPxM0.yPx.y引脚工作模式00准双向01推挽输出10高阻输入11开漏输出设计中使用的寄存器
--端口模式寄存器P7端口模式寄存器对于P7口来说,其驱动模式由端口模式寄存器P7M0和P7M1控制P7端口模式寄存器P7M0位于SFR地址为0xE2的位置。当复位后,该寄存器的内容为“00000000”
P7端口模式寄存器P7M1位于SFR地址为0xE1的位置。当复位时,该寄存器的内容为“11111111”位索引76543210名字P77M0P76M0P75M0P74M0P73M0P72M0P71M0P70M0位索引76543210名字P77M1P76M1P75M1P74M1P73M1P72M1P71M1P70M1设计中使用的寄存器
--端口数据寄存器P0端口数据寄存器P0端口数据寄存器P0位于SFR地址为0x80的位置。当复位时,该寄存器的内容为“11111111”给对应的位写”0”时,输出逻辑“0“(低电平)到端口对应引脚(P0.y)的缓冲区;当给对应的位写”1“时,输出逻辑”1“(高电平)到端口对应引脚(P0.y)的缓冲区当读取该寄存器时,直接读取端口对应引脚(P0.y)上的电平注:当引脚驱动模式设置为准双向时,要读取该引脚的状态,需要先给该引脚设置为逻辑“1”(高电平),然后才能读取该引脚的状态,这一点要特别注意位索引76543210名字P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0设计中使用的寄存器
--端口数据寄存器P7端口数据寄存器P7端口数据寄存器P7位于SFR地址为0xF8的位置。当复位时,该寄存器的内容为“11111111”当给对应的位写”0”时,输出逻辑“0“(低电平)到端口对应引脚(P7.y)的缓冲区;当给对应的位写”1“时,输出逻辑”1“(高电平)到端口对应引脚(P7.y)的缓冲区当读取该寄存器时,直接读取端口对应引脚(P7.y)上的电平位索引76543210名字P7.7P7.6P7.5P7.4P7.3P7.2P7.1P7.0C语言设计实例:按键扫描与显示
--设计代码configure.h头文件#ifndefSTC32G12K128_SYMBOL#defineSTC32G12K128_SYMBOLsfrP6=0xE8;//定义寄存器P6在SFR中的地址0xE8sfrP7=0xF8;//定义寄存器P7在SFR中的地址0xF8sfrP0M0=0x94;//定义寄存器P0M0在SFR中的地址0x94sfrP0M1=0x93;//定义寄存器P0M1在SFR中的地址0x93sfrP6M0=0xCC;//定义寄存器P6M0在SFR中的地址0xCCsfrP6M1=0xCB;//定义寄存器P6M1在SFR中的地址0xCBsfrP7M0=0xE2;//定义寄存器P7M0在SFR中的地址0xE2sfrP7M1=0xE1;//定义寄存器P7M1在SFR中的地址0xE1#endifC语言设计实例:按键扫描与显示
--设计代码main.c文件#include"reg251s.h"//包含reg251s.h头文件#include"configure.h"//包含configure.h头文件
voidIO_KeyDelay(void)//声明IO_KeyDelay子函数,延迟{ unsignedchari; i=60; while(--i) ;}C语言设计实例:按键扫描与显示
--设计代码voidmain()//主程序main{chari=0;//定义并初始化整型变量I/*定义数组seg[8],保存着0~7这8个数字对应的段码模式h-g-f-e-d-c-b-a*/
/*如seg[0]为数字0对应的段码模式,逻辑“0”(低电平)所对应的段点亮*/charseg[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
/*声明数组key_record,保存着8个按键的信息,从左到右对应每个数码管*/charkey_record[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};unsignedcharc1_new,c1_old=0,c1;//声明字符型变量c1_new,c1_old和c1P0M0=0;//寄存器P0M0初始化为0P0M1=0;//寄存器P0M1初始化为0,端口P0为准双向C语言设计实例:按键扫描与显示
--设计代码P6M0=0;//寄存器P6M0初始化为0P6M1=0;//寄存器P6M1初始化为0,端口P6为准双向
P7M0=0;//寄存器P7M0初始化为0P7M1=0;//寄存器P7M1初始化为0,端口P7为准双向
P7=0xff;//端口P7的所有引脚驱动为逻辑“1”(高电平)while(1)//无限循环{ P0=0xC0;//将P0.0~P0.3拉低,读P0.6~P0.7前,发"1100" IO_KeyDelay();//延迟读c1_new=P0&0xC0;//得到矩阵按键引脚P0.7和P0.6的信息C语言设计实例:按键扫描与显示
--设计代码
if(c1_new!=c1_old)//如果新按键和旧按键状态不一样,则继续 {c1_old=c1_new;//把新按键的状态变量保存作为旧的按键 if(c1_new!=0xC0)//如果有按键按下,继续 { P0=0xCE;//P0[3..0]置”1110”,读P0.6~P0.7前,发"1100" IO_KeyDelay();//延迟读 c1_new=P0&0xc0;//获取P0.7和p0.6引脚的输入逻辑状态值switch(c1_new) { case0x80:c1=0;break;//若值为0x80,则按下0号按键 case0x40:c1=4;break;//若值为0x40,则按下4号按键 default:; }C语言设计实例:按键扫描与显示
--设计代码P0=0xCD;//P0[3..0]置”1101”,读P0.7和P0.6前,发"1100" IO_KeyDelay();//延迟读 c1_new=P0&0xc0; //获取P0端口P0.7和P0.6引脚的值 switch(c1_new) { case0x80:c1=1;break;//若值为0x80,则按下1号按键 case0x40:c1=5;break;//若值为0x40,则按下5号按键 default:; }P0=0xCB;//P0[3..0]置”1011”,读P0.7和P0.6前,发"1100" IO_KeyDelay();//延迟读 c1_new=P0&0xc0; //获取P0端口P0.7和P0.6引脚的值C语言设计实例:按键扫描与显示
--设计代码
switch(c1_new) { case0x80:c1=2;break;//若值为0x80,则按下2号按键 c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年奶茶店室内设计服务合同协议
- 2026道德与法治五年级拓展空间 发展援助了解
- 2025工程(石材采购)合同
- 新苏教版三年级数学下册第五单元第2课《画垂线和点到直线的距离》教案
- 2026年中外教育史试题及答案
- 广电机房巡检制度
- 2026年医疗器具采购合同(1篇)
- 市政工程管道开挖钢便桥施工技术方案
- 闭经的益母草调理
- 扁桃体炎的免疫调节
- 南平市2025年南平仲裁委员会秘书处招聘工作人员2人笔试历年参考题库典型考点附带答案详解
- 2026年及未来5年市场数据中国玻璃酸钠注射液行业市场竞争格局及投资前景展望报告
- 2026广岩国际投资有限责任公司招聘14人建设笔试模拟试题及答案解析
- 【历史】 明清时期社会经济的发展 课件 2025-2026学年统编版七年级历史下册
- 国为什么说勇于自我革命是党能够引领社会革命的根本原因?参考答案(三)
- 雨课堂学堂在线学堂云《跨文化交际英语(北京理工)》单元测试考核答案
- 中国老年2型糖尿病防治临床指南(2026版)解读课件
- 紫金投资集团招聘笔试题库2026
- 游泳池设施设备安全检查制度
- 2025年安徽交控集团招聘笔试及答案
- 骨科护理中的人文关怀与沟通
评论
0/150
提交评论