STM8的C语言例程
STM8单片机 UART发送完成中断C语言程序

STM8S105发送完成中断#define TXRXBUF_SIZE 128uchar UART_RxTx[TXRXBUF_SIZE];volatile uchar UART_OutLen=0;volatile uchar TXRX_IndexR=0;volatile uchar TXRX_IndexW=0;void UART2_Init(void){//485 CS1控制PA_DDR |=1 << 6;PA_CR1 |=1 << 6;PA_CR2 &= ~( 1 <<6 );RS485_TX_EN=0; //设置为接收模式UART2_CR1=0x00;UART2_CR2=0x00;UART2_CR3=0x00;// 设置波特率,必须注意以下几点:// (1) 必须先写BRR2// (2) BRR1存放的是分频系数的第11位到第4位,// (3) BRR2存放的是分频系数的第15位到第12位,和第3位// 到第0位// 例如对于波特率位9600时,分频系数=2000000/9600=208// 对应的十六进制数为00D0,BBR1=0D,BBR2=00//UART2_BRR2=0x30;//UART2_BRR1=0xE8; //1K//UART2_BRR2=0x35;//UART2_BRR1=0x41; //1200UART2_BRR2=0x1B;UART2_BRR1=0xA0; //2400UART2_CR2=0x2c;//允许接收,发送,开接收中断//UART2_CR2=0x08; //发送使能}//------------方式二发送结束中断--------------------------------------#pragma vector=UART2_T_TC_vector__interrupt void UART2_T_TC(void){UART2_SR&= ~(1<<6); //清除送完成状态位if(UART_OutLen>0){UART2_DR=UART_RxTx[TXRX_IndexR];--UART_OutLen;if(++TXRX_IndexR >= TXRXBUF_SIZE){TXRX_IndexR=0;//FIFO回头}}else //发送结束{//UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;//UART2_CR2 &= ~(1<<TCIEN);//关闭发送完成中断UART2_CR2 &= ~(1<<6);//关闭发送完成中断}}/************************************************************名称:Uart_IntSentBuf*功能:从串口UART0发送一组字节数据*入口参数:*p:待发的首个字节数据,len 发送个数*出口参数:返回1:发送成功* 返回0:发送失败*说明:在发送过程中,不阻塞CPU的运行。
STM8单片机C语言编程技巧

如何分配变量到指定的地址举例:unsigned char temp_A@0x00; //定义无符号变量temp_A,强制其地址为0x00 unsigned char temp_B@0x100; //定义无符号变量temp_B,强制其地址为0x100@tiny unsigned char temp_C; //定义无符号变量temp_C,由编译器自动在地址小于0x100的RAM中为其分配一个地址@near unsigned char temp_D; //定义无符号变量temp_D,由编译器自动在地址大于0xFF 的RAM中为其分配一个地址另外也可以采用伪指令"pragma"将函数或者变量定义到指定的section中,例如:#pragma section [name] // 将下面定义的未初始化变量定义到.name section中Unsigned char data1;Unsigned int data2;……(任何需要定义在.name section中的变量)……#pragma section [] // 返回到正常的section.注意:pragma伪指令可以用来定位函数,初始化变量或者未初始化变量。
这三者用不同的括号区分。
(name):代码[name] :未初始化变量{name}:初始化变量如何在COSMIC C文件中使用汇编语言在COSMIC C文件中使用汇编语言常见的方法有如下两种:使用#asm …#endasm组合格式或_asm("…"); 单行格式。
举例1:unsigned char temp_A;Void func1(void){...#asmPUSH ALD A,(X)LD _temp_A,APOP A#endasm...}注:在C嵌汇编环境下使用全局变量,要在该全局变量名称前加下划线"_"。
举例2:Void func1(void){..._asm("rim");_asm("nop");...}如何观察RAM/FLASH/EEPROM的最终分配情况在Project->settings->linker选项页中,将Category选为Output,再勾选Generate Map File。
STM8单片机的C语言编程基础与实践

/* MAIN.C file * * Copyright (c) 2002-2005 STMicroelectronics */
main() { while (1); } 而在 stm8_interrupt_vector.c 中,就是声明了对应该芯片的中断向量,如下所示: /* * */ typedef void @far (*interrupt_handler_t)(void); struct interrupt_vector { unsigned char interrupt_instruction; interrupt_handler_t interrupt_handler; }; @far @interrupt void NonHandledInterrupt (void) { /* in order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction BASIC INTERRUPT VECTOR TABLE FOR STM8 devices Copyright (c) 2007 STMicroelectronics
STM8 的 C 语言编程(2)-- 变量空间的分配
采用 C 这样的高级语言,其实可以不用关心变量在存储器空间中是如何具体分配的。但如果了解如何 分配,对编程还是有好处的,尤其是在调试时。 例如下面的程序定义了全局变量数组 buffer 和一个局部变量 i,在 RAM 中如何分配的呢? /* MAIN.C file * * Copyright (c) 2002-2005 STMicroelectronics */ unsigned char buffer[10]; // 定义全局变量
stm8s的c语言编程例程应用

void CLK_Configuration(void);
void main(void)////////////主函数
{
GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST);
)0:无触发事件产生;1:触发事件发生,此位当寄存器更新时由硬件置位(在timer4中该位保留)
位5:1 保留,须保持清零
位0:UIF:更新中断标志(此位在更新事件发生时由硬件置位。可以由软件清零)
0:无更新事件产生;1:跟新事件发生。
此位当寄存器更新时由硬件置位。
1.如果TIM4_CR1中的UDIS=0,则发生在计数器溢出时。
}
例题三:灯闪亮的同时蜂鸣器响
#include "stm8s.h"//头文件
#define ulong unsigned long
///////////////////////////////////////////////////////////////////////////////
void delay(ulong i)
位5:1保留,须保持清零
位0:UG更新事件产生 0:无更新事件产生;1:计数器重新初始化并产生寄存器更新。(注意:分频计数器也同时清零)
计数器(TIMX_CNTR)
位7:0 计数器值
预分频寄存器(TIMX_PSCR)
位7:3保留,须保持清零
位2:0 PSC分频器值分频器的值除分频时钟CLK_PSC
计数器时钟频率:
PSC中包含了每次更新事件(包含当通过TIM4_EGR寄存器的UG产生的更新事件)需要加载到实际分频寄存器的值。这就意味着为了使新的分频器值启用,必须产生一个更新事件。
STM8在IAR环境下的C语言开发

STM8单片机在IAR环境下的C语言开发1、头文件搜索路径设置在工程管理窗口按右键,选择option,打开选项设置窗口如下选择C/C++ compiler选项,然后选择Preprocssor标签,在《Additional include directories 下输入要包含的搜索路径,这样在程序编译时,编译器会自动到该目录下搜索头文件。
2、单片机类型的选择在工程管理窗口按右键选择option,选择<General Options>选项,然后再Target中选择相应的单片机型号。
3、Printf函数的使用要使用printf函数,需要在工程管理窗口按右键选择《option》,选择<General Options>选项,然后选择《library Configuration》标签,在《library》中选择Full,如下图所示。
对于程序空间非常小的单片机,如STM8S003只有8K的程序空间,如果使用全功能的printf函数,则程序编译后代码空间不足,此时应不使用printf或者使用Tiny版本的printf,选择Library Options标签,选择Printf formatter 为tiny。
为了能够使用printf,在程序中需要增加如下代码#include "stdio.h"//------------------------------------------------------------------------------// 使用Printf//------------------------------------------------------------------------------// 又有STM8S003只有8K的内存,使用完整的printf则程序空间不足,必须使用tiny的printf// 因此在工程的选项中Library configuration选择Full,在Library option 中选择tiny#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endifPUTCHAR_PROTOTYPE{//发送数据代码UART1->DR = ch;while(UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);return ch;}4、查看程序编译后的代码大小在工程的目录下有《Debug》和《Release》目录,目中中的《List》目录中有个扩展名为map的文件,文件名为工程名,打开该文件,可以看到程序编译后的代码大小。
STM8的C语言编程-RAM中变量分配

STM8的C语言编程(2)--RAM中变量分配采用C这样的高级语言,其实可以不用关心变量在存储器空间中是如何具体分配的。
但如果了解如何分配,对编程还是有好处的,尤其是在调试时。
例如下面的程序定义了全局变量数组buffer和一个局部变量i,在RAM中如何分配的呢?/* MAIN.C file** Copyright (c) 2002-2005 STMicroelectronics*/unsigned char buffer[10]; // 定义全局变量main(){unsigned char i; // 定义局部变量for(i=0;i<10;i++){buffer[i] = 0x55;}}我们可以通过DEBUG中的反汇编窗口,看到如下的对应代码:从这段代码中可以看到,全局变量buffer被分配到空间从地址0000H到0009H。
而局部变量i则在堆栈空间中分配,通过PUSH A指令,将堆栈指针减1,腾出一个字节的空间,而SP+1指向的空间就是分配给局部变量使用的空间。
由此可以得出初步的结论,对于全局变量,内存分配是从低地址0000H开始向上分配的。
而局部变量则是在堆栈空间中分配。
1 / 2另外从上一篇文章中,可以知道堆栈指针初始化时为0FFFH。
而根据PUSH指令的定义,当压栈后堆栈指针减1。
因此堆栈是从上往下使用的。
因此根据内存分配和堆栈使用规则,我们在程序设计时,不能定义过多的变量,免得没有空间给堆栈使用。
换句话说,当定义变量时,一定要考虑到堆栈空间,尤其是那些复杂的系统,程序调用层数多,这样就会占用大量的堆栈空间。
总之,在单片机的程序设计时,由于RAM空间非常有限,要充分考虑到全局变量、局部变量、程序调用层数和中断服务调用对空间的占用。
友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!。
STM8的C语言编程(5)--8位定时器应用之一

STM8的C语言编程(5)--8位定时器应用之一在STM8单片机中,有多种定时器资源,既有8位的定时器,也有普通的16位定时器,还有高级的定时器。
今天的实验是用最简单的8位定时器TIM4来进行延时,然后驱动LED闪烁。
为了简单起见,这里是通过程序查询定时器是否产生更新事件,来判断定时器的延时是否结束。
同样还是利用ST的开发工具,生成一个C程序的框架,然后修改其中的main. c,修改后的代码如下。
编译通过后,下载到开发板,运行程序,可以看到LED在闪烁,或者用示波器可以在LED引脚上看到方波。
在这里要特别提醒的是,从ST给的手册上看,这个定时器中的计数器是一个加1计数器,但本人在实验过程中感觉不太对,经过反复的实验,我认为应该是一个减1计数器(也许是我拿的手册不对,或许是理解上有误)。
例如,当给定时器中的自动装载寄存器装入255时,产生的方波频率最小,就象下面代码中计算的那样,产生的方波频率为30HZ左右。
若初始化时给自动装载寄存器装入1,则产生的方波频率最大,大约为3.9K左右。
也就是说实际的分频数为ARR寄存器的值+1。
// 程序描述:通过初始化定时器4,进行延时,驱动LED闪烁// LED接在MCU的GPIO的PD3上#include "STM8S207C_S.h"main(){// 首先初始化GPIOPD_DDR = 0x08;PD_CR1 = 0x08; // 将PD3设置成推挽输出PD_CR2 = 0x00;// 然后初始化定时器4TIM4_IER = 0x00; // 禁止中断TIM4_EGR = 0x01; // 允许产生更新事件TIM4_PSCR = 0x07; // 计数器时钟=主时钟/128=2MHZ/128// 相当于计数器周期为64uSTIM4_ARR = 255; // 设定重装载时的寄存器值,255是最大值TIM4_CNTR = 255; // 设定计数器的初值// 定时周期=(ARR+1)*64=16320uSTIM4_CR1 = 0x01; // b0 = 1,允许计数器工作// b1 = 0,允许更新// 设置控制器,启动定时器while(1) // 进入无限循环{while((TIM4_SR1 & 0x81) == 0x00); // 等待更新标志TIM4_SR1 = 0x00; // 清除更新标志PD_ODR = PD_ODR ^ 0x08; // LED驱动信号取反// LED闪烁频率=2MHZ/128/255/2=30.63 }}。
STM8汇编经典实例源码

============================延时的Delay_ms.asm===================== stm8/#include"mapping.inc"#include"stm8s105s6.inc"#include"D:\STM8程序\我的STM8程序\GPIO\User_register.inc"#include"D:\STM8程序\我的STM8程序\GPIO\define.inc"segment'rom';*************延时程序**************;CPU频率:2MHz;要用到的寄存器:X,Y;把要延时的值写入R0E.R0F,R0E为高位值.R0F为低位值;1msDelay_ms.LPUSHW XPUSHW YPUSH CCLDW X,#500;延时1SLDW Y,R0EDelay_next1:LDW X,#500Delay_next:DECW XJRNE Delay_nextDECW YJRNE Delay_next1POP CCPOPW YPOPW XRETFRETFRETFend=============================mai.asm============================== stm8/#include"mapping.inc"#include"stm8s105s6.inc"#include"D:\STM8程序\我的STM8程序\GPIO\User_register.inc"#include"D:\STM8程序\我的STM8程序\GPIO\define.inc"segment'rom'main.l;initialize SPldw X,#stack_endldw SP,X#ifdef RAM0;clear RAM0ram0_start.b EQU$ram0_segment_startram0_end.b EQU$ram0_segment_endldw X,#ram0_startclear_ram0.lclr(X)incw Xcpw X,#ram0_endjrule clear_ram0#endif#ifdef RAM1;clear RAM1ram1_start.w EQU$ram1_segment_startram1_end.w EQU$ram1_segment_endldw X,#ram1_startclear_ram1.lclr(X)incw Xcpw X,#ram1_endjrule clear_ram1#endif;clear stackstack_start.w EQU$stack_segment_startstack_end.w EQU$stack_segment_endldw X,#stack_startclear_stack.lclr(X)incw Xcpw X,#stack_endjrule clear_stackintel;主函数开始;更换成外部时钟,并且CPU8分频BSET CLK_SWCR,#1;允许更换时钟BRES CLK_SWCR,#2;SWIEN位为0,用查询方式确定时钟更换是否完成MOV CLK_SWR,#0B4H;目标时钟为HSE晶振CLK_SW_WAIT1:;等待时钟更换中断标志SWIF有效BTJF CLK_SWCR,#3,CLK_SW_WAIT1BRES CLK_SWCR,#3;清除时钟更换完成任务中断标志SWIFBRES CLK_SWCR,#1;SWEN位为0,禁止时钟再次更换BRES CLK_ICKR,#0;关闭HSI时钟,减少功耗MOV CLK_CKDIVR,#1bH;内部时钟8分频,CPU时钟128分频,现在使用外部时钟,前8分频没用BSET CLK_CSSR,#0;CSS时钟安全系统开;I/O口初始化BSET PD_DDR_DDR0;PD_0设置成输出BSET PE_DDR_DDR5;PE_5设置成输出,595的SDATA脚BSET PC_DDR_DDR2;PC_2设置成输出,595的SCLK脚BSET PC_DDR_DDR4;PC_4设置成输出,595的SRCK脚BSET PE_CR1_C5;设置成推换BSET PC_CR1_C2;设置成推换BSET PC_CR1_C4;设置成推换BSET PD_CR1_C0;PD_0设置成推换BSET PE_CR2_C5;PE_5设置成高速BSET PC_CR2_C2;PC_2设置成高速BSET PC_CR2_C4;PC_4设置成高速BSET PD_CR2_C0;PD_0设置成高速;数码管要显示的数字MOV R0D,#9;R0A为高位MOV R0C,#8MOV R0B,#6MOV R0A,#7CALLF Display_595;调用595显示LOOP1:MOV R0E,#02H;R0E和R0F两单元合起来对应十进制的2000MOV R0F,#0FFHBSET PD_ODR_ODR0CALLF Delay_ms;调用延时BRES PD_ODR_ODR0CALLF Delay_ms;调用延时CALLF AD_8BIT;调用AD转换CALLF BCD_8bit;调用数据转换CALLF Display_595;调用595显示JP LOOP1;*******************8位二进制的数值转化为BCD码***************************;把8位二进制的数值转化为BCD码;要转换的数值放在R09中;转换结果的高位在R0A,中位在R0B,低位在R0CBCD_8bit.LPUSH APUSH R01LD A,R09LD XL,ALD A,#100DIV X,ALD R01,ALD A,XLLD R0A,ALD A,R01LD XL,ALD A,#10DIV X,ALD R0C,ALD A,XLLD R0B,APOP R01POP ARETFRETFRETF;******************************************************************** *******;*************延时程序**************;CPU频率:2MHz;要用到的寄存器:X,Y;把要延时的值写入R0E.R0F,R0E为高位值.R0F为低位值;1msDelay_ms.LPUSHW XPUSH CCLDW X,#500;延时1SLDW Y,R0EDelay_next1:LDW X,#500Delay_next:DECW XJRNE Delay_nextDECW YJRNE Delay_next1POP CCPOPW YPOPW XRETFRETFRETF;****************************************;595串行数码管显示_4位;四位的值分别装在R0A,R0B,R0C,R0D单元中,高位在前;要用到A,X寄存?;过程用到的寄存器:R0FDisplay_595.LPUSH APUSH CCPUSH R0FPUSHW XCLRW XLD A,R0DLD XL,ALD A,(TABLE_LED,X)MOV R0F,#8Display_loop1:BSET PC_ODR_ODR2RLC ABCCM PE_ODR_ODR5NOPBRES PC_ODR_ODR2DEC R0FJRNE Display_loop1;送完一个数据CLRW XLD XL,ALD A,(TABLE_LED,X)MOV R0F,#8Display_loop2:BSET PC_ODR_ODR2RLC ABCCM PE_ODR_ODR5NOPBRES PC_ODR_ODR2DEC R0FJRNE Display_loop2CLRW XLD A,R0BLD XL,ALD A,(TABLE_LED,X)MOV R0F,#8Display_loop3:BSET PC_ODR_ODR2RLC ABCCM PE_ODR_ODR5NOPBRES PC_ODR_ODR2DEC R0FJRNE Display_loop3CLRW XLD A,R0ALD XL,ALD A,(TABLE_LED,X)MOV R0F,#8Display_loop4:BSET PC_ODR_ODR2RLC ABCCM PE_ODR_ODR5;SDATANOPBRES PC_ODR_ODR2;SCLKDEC R0FJRNE Display_loop4;4个数据送完成BSET PC_ODR_ODR2BRES PC_ODR_ODR4;置高SRCKBSET PC_ODR_ODR4;输出数据POPW XPOP R0FPOP CCPOP ARETFRETFRETF;***************************************************************;AD转换;入口参数:对PB_7进行转换;出口参数:转换结果放大R09AD_8BIT.LPUSH APUSH CCPUSHW X;引脚初始化BRES PB_DDR_DDR7;输入BRES PB_CR1_C7;浮空BRES PB_CR2_C7;禁止外中断;配置寄存器MOV ADC_CSR,#07H;禁止转换结束中断,通道为AIN7;MOV ADC_CR2,#00H;禁止外部触发,数据高8位对好MOV ADC_CR3,#00H;禁止数据缓存使能MOV ADC_CR1,#71H;转换速度为最慢,单次转换模式,开启AD转换电源MOV ADC_CR1,#71H;开始转换NOPNOPNOPAD_next:LD A,ADC_CSRAND A,#80HJREQ AD_nextMOV ADC_CSR,#07H;清除转换结束标志MOV ADC_CR1,#70H;停止AD转换MOV R09,ADC_DRH;把数据送到R09单元POPW XPOP CCPOP ARETFRETF;******************************************************************** ;***************************************************************;595的显示数表TABLE_LED:;DP,F,G,E,D,C,B,A;0,1,2,3,4,5,6,7,8,9DC.B0A0H,0F9H,0C4H,0D0H,99H,92H,82H,0F8H,80H,90H;*************************************************************** motorolainterrupt NonHandledInterruptNonHandledInterrupt.liretsegment'vectit'dc.l{$82000000+main};resetdc.l{$82000000+NonHandledInterrupt};trapdc.l{$82000000+NonHandledInterrupt};irq0dc.l{$82000000+NonHandledInterrupt};irq1dc.l{$82000000+NonHandledInterrupt};irq2dc.l{$82000000+NonHandledInterrupt};irq3dc.l{$82000000+NonHandledInterrupt};irq4dc.l{$82000000+NonHandledInterrupt};irq5dc.l{$82000000+NonHandledInterrupt};irq6dc.l{$82000000+NonHandledInterrupt};irq7dc.l{$82000000+NonHandledInterrupt};irq8dc.l{$82000000+NonHandledInterrupt};irq9dc.l{$82000000+NonHandledInterrupt};irq10dc.l{$82000000+NonHandledInterrupt};irq11dc.l{$82000000+NonHandledInterrupt};irq12dc.l{$82000000+NonHandledInterrupt};irq13dc.l{$82000000+NonHandledInterrupt};irq14dc.l{$82000000+NonHandledInterrupt};irq15dc.l{$82000000+NonHandledInterrupt};irq16dc.l{$82000000+NonHandledInterrupt};irq17dc.l{$82000000+NonHandledInterrupt};irq18dc.l{$82000000+NonHandledInterrupt};irq19dc.l{$82000000+NonHandledInterrupt};irq20dc.l{$82000000+NonHandledInterrupt};irq21dc.l{$82000000+NonHandledInterrupt};irq22dc.l{$82000000+NonHandledInterrupt};irq23dc.l{$82000000+NonHandledInterrupt};irq24dc.l{$82000000+NonHandledInterrupt};irq25dc.l{$82000000+NonHandledInterrupt};irq26dc.l{$82000000+NonHandledInterrupt};irq27dc.l{$82000000+NonHandledInterrupt};irq28dc.l{$82000000+NonHandledInterrupt};irq29end==========================User_register.asm====================== =stm8/;用户定义公用变量segment'ram0'BYTES;00-0F单元定义为字节变量(供主程序使用).R00.B ds.b1.R01.B ds.b1.R02.B ds.b1.R03.B ds.b1.R04.B ds.b1.R05.B ds.b1.R06.B ds.b1.R07.B ds.b1.R08.B ds.b1.R09.B ds.b1.R0A.B ds.b1.R0B.B ds.b1.R0C.B ds.b1.R0D.B ds.b1.R0E.B ds.b1.R0F.B ds.b1;10-1F单元定义为字节变量(供优先级为1中断服务程序使用).R10.B ds.b1.R11.B ds.b1.R12.B ds.b1.R13.B ds.b1.R14.B ds.b1.R15.B ds.b1.R16.B ds.b1.R17.B ds.b1.R18.B ds.b1.R19.B ds.b1.R1A.B ds.b1.R1B.B ds.b1.R1C.B ds.b1.R1D.B ds.b1.R1E.B ds.b1.R1F.B ds.b1;20-2F单元定义为字节变量(供优先级为2中断服务程序使用) .R20.B ds.b1.R21.B ds.b1.R22.B ds.b1.R23.B ds.b1.R24.B ds.b1.R25.B ds.b1.R26.B ds.b1.R27.B ds.b1.R28.B ds.b1.R29.B ds.b1.R2A.B ds.b1.R2B.B ds.b1.R2C.B ds.b1.R2D.B ds.b1.R2E.B ds.b1.R2F.B ds.b1;30-3F单元定义为字节变量(供优先级为3中断服务程序使用) .R30.B ds.b1.R31.B ds.b1.R32.B ds.b1.R33.B ds.b1.R34.B ds.b1.R35.B ds.b1.R36.B ds.b1.R37.B ds.b1.R38.B ds.b1.R39.B ds.b1.R3A.B ds.b1.R3B.B ds.b1.R3C.B ds.b1.R3D.B ds.b1.R3E.B ds.b1.R3F.B ds.b1;用户定义公用变量segment'ram1'WORDS;00-0F单元定义为字节变量(供主程序使用).R40.W ds.w1.R41.W ds.w1.R42.W ds.w1.R43.W ds.w1.R44.W ds.w1.R45.W ds.w1.R46.W ds.w1.R47.W ds.w1.R48.W ds.w1.R49.W ds.w1.R4A.W ds.w1.R4B.W ds.w1.R4C.W ds.w1.R4D.W ds.w1.R4E.W ds.w1.R4F.W ds.w1end========================define.inc I/O口引脚================;GPIO部分寄存器宏定义;******************************************************************** **********************************;GPIO PX_ODR;******************************************************************** **********************************;PA口输出数据锁存#define PA_ODR_ODR0PA_ODR,#0;PA口0位输出数据#define PA_ODR_ODR1PA_ODR,#1;PA口1位输出数据#define PA_ODR_ODR2PA_ODR,#2;PA口2位输出数据#define PA_ODR_ODR3PA_ODR,#3;PA口3位输出数据#define PA_ODR_ODR4PA_ODR,#4;PA口4位输出数据#define PA_ODR_ODR5PA_ODR,#5;PA口5位输出数据#define PA_ODR_ODR6PA_ODR,#6;PA口7位输出数据#define PA_ODR_ODR7PA_ODR,#7;PA口7位输出数据;PB口输出数据锁存#define PB_ODR_ODR0PB_ODR,#0;PB口0位输出数据#define PB_ODR_ODR1PB_ODR,#1;PB口1位输出数据#define PB_ODR_ODR2PB_ODR,#2;PB口2位输出数据#define PB_ODR_ODR3PB_ODR,#3;PB口3位输出数据#define PB_ODR_ODR4PB_ODR,#4;PB口4位输出数据#define PB_ODR_ODR5PB_ODR,#5;PB口5位输出数据#define PB_ODR_ODR6PB_ODR,#6;PB口7位输出数据#define PB_ODR_ODR7PB_ODR,#7;PB口7位输出数据;PC口输出数据锁存#define PC_ODR_ODR0PC_ODR,#0;PC口0位输出数据#define PC_ODR_ODR1PC_ODR,#1;PC口1位输出数据#define PC_ODR_ODR2PC_ODR,#2;PC口2位输出数据#define PC_ODR_ODR3PC_ODR,#3;PC口3位输出数据#define PC_ODR_ODR4PC_ODR,#4;PC口4位输出数据#define PC_ODR_ODR5PC_ODR,#5;PC口5位输出数据#define PC_ODR_ODR6PC_ODR,#6;PC口7位输出数据#define PC_ODR_ODR7PC_ODR,#7;PC口7位输出数据;PD口输出数据锁存#define PD_ODR_ODR0PD_ODR,#0;PD口0位输出数据#define PD_ODR_ODR1PD_ODR,#1;PD口1位输出数据#define PD_ODR_ODR2PD_ODR,#2;PD口2位输出数据#define PD_ODR_ODR3PD_ODR,#3;PD口3位输出数据#define PD_ODR_ODR4PD_ODR,#4;PD口4位输出数据#define PD_ODR_ODR5PD_ODR,#5;PD口5位输出数据#define PD_ODR_ODR6PD_ODR,#6;PD口7位输出数据#define PD_ODR_ODR7PD_ODR,#7;PD口7位输出数据;PE口输出数据锁存#define PE_ODR_ODR0PE_ODR,#0;PE口0位输出数据#define PE_ODR_ODR1PE_ODR,#1;PE口1位输出数据#define PE_ODR_ODR2PE_ODR,#2;PE口2位输出数据#define PE_ODR_ODR3PE_ODR,#3;PE口3位输出数据#define PE_ODR_ODR4PE_ODR,#4;PE口4位输出数据#define PE_ODR_ODR5PE_ODR,#5;PE口5位输出数据#define PE_ODR_ODR6PE_ODR,#6;PE口7位输出数据#define PE_ODR_ODR7PE_ODR,#7;PE口7位输出数据;******************************************************************** **********************************;GPIO PX_IDR;******************************************************************** **********************************;PA口输入数据寄存器,用来读取I/O口的电平状态#define PA_IDR_IDR1PA_IDR,#1;PA口对应位输入数据#define PA_IDR_IDR2PA_IDR,#2;PA口对应位输入数据#define PA_IDR_IDR3PA_IDR,#3;PA口对应位输入数据#define PA_IDR_IDR4PA_IDR,#4;PA口对应位输入数据#define PA_IDR_IDR5PA_IDR,#5;PA口对应位输入数据#define PA_IDR_IDR6PA_IDR,#6;PA口对应位输入数据#define PA_IDR_IDR7PA_IDR,#7;PA口对应位输入数据;PB口输入数据寄存器,用来读取I/O口的电平状态#define PB_IDR_IDR0PB_IDR,#0;PB口对应位输入数据#define PB_IDR_IDR1PB_IDR,#1;PB口对应位输入数据#define PB_IDR_IDR2PB_IDR,#2;PB口对应位输入数据#define PB_IDR_IDR3PB_IDR,#3;PB口对应位输入数据#define PB_IDR_IDR4PB_IDR,#4;PB口对应位输入数据#define PB_IDR_IDR5PB_IDR,#5;PB口对应位输入数据#define PB_IDR_IDR6PB_IDR,#6;PB口对应位输入数据#define PB_IDR_IDR7PB_IDR,#7;PB口对应位输入数据;PC口输入数据寄存器,用来读取I/O口的电平状态#define PC_IDR_IDR0PC_IDR,#0;PC口对应位输入数据#define PC_IDR_IDR1PC_IDR,#1;PC口对应位输入数据#define PC_IDR_IDR2PC_IDR,#2;PC口对应位输入数据#define PC_IDR_IDR3PC_IDR,#3;PC口对应位输入数据#define PC_IDR_IDR4PC_IDR,#4;PC口对应位输入数据#define PC_IDR_IDR5PC_IDR,#5;PC口对应位输入数据#define PC_IDR_IDR6PC_IDR,#6;PC口对应位输入数据#define PC_IDR_IDR7PC_IDR,#7;PC口对应位输入数据;PD口输入数据寄存器,用来读取I/O口的电平状态#define PD_IDR_IDR0PD_IDR,#0;PD口对应位输入数据#define PD_IDR_IDR1PD_IDR,#1;PD口对应位输入数据#define PD_IDR_IDR2PD_IDR,#2;PD口对应位输入数据#define PD_IDR_IDR3PD_IDR,#3;PD口对应位输入数据#define PD_IDR_IDR4PD_IDR,#4;PD口对应位输入数据#define PD_IDR_IDR5PD_IDR,#5;PD口对应位输入数据#define PD_IDR_IDR6PD_IDR,#6;PD口对应位输入数据#define PD_IDR_IDR7PD_IDR,#7;PD口对应位输入数据;PE口输入数据寄存器,用来读取I/O口的电平状态#define PE_IDR_IDR0PE_IDR,#0;PE口对应位输入数据#define PE_IDR_IDR1PE_IDR,#1;PE口对应位输入数据#define PE_IDR_IDR2PE_IDR,#2;PE口对应位输入数据#define PE_IDR_IDR3PE_IDR,#3;PE口对应位输入数据#define PE_IDR_IDR5PE_IDR,#5;PE口对应位输入数据#define PE_IDR_IDR6PE_IDR,#6;PE口对应位输入数据#define PE_IDR_IDR7PE_IDR,#7;PE口对应位输入数据;******************************************************************** **********************************;GPIO PX_DDR;******************************************************************** **********************************;PA数据传输方向控制寄存器#define PA_DDR_DDR0PA_DDR,#0;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR1PA_DDR,#1;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR2PA_DDR,#2;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR3PA_DDR,#3;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR4PA_DDR,#4;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR5PA_DDR,#5;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR6PA_DDR,#6;PA口对应位数据传输方向控制__0:输入1:输出#define PA_DDR_DDR7PA_DDR,#7;PA口对应位数据传输方向控制__0:输入1:输出;PB数据传输方向控制寄存器#define PB_DDR_DDR0PB_DDR,#0;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR1PB_DDR,#1;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR2PB_DDR,#2;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR3PB_DDR,#3;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR4PB_DDR,#4;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR5PB_DDR,#5;PB口对应位数据传输方向控制__0:输入1:输出#define PB_DDR_DDR6PB_DDR,#6;PB口对应位数据传输方向控制__0:输入1:输出1:输出;PC数据传输方向控制寄存器#define PC_DDR_DDR0PC_DDR,#0;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR1PC_DDR,#1;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR2PC_DDR,#2;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR3PC_DDR,#3;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR4PC_DDR,#4;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR5PC_DDR,#5;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR6PC_DDR,#6;PC口对应位数据传输方向控制__0:输入1:输出#define PC_DDR_DDR7PC_DDR,#7;PC口对应位数据传输方向控制__0:输入1:输出;PD数据传输方向控制寄存器#define PD_DDR_DDR0PD_DDR,#0;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR1PD_DDR,#1;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR2PD_DDR,#2;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR3PD_DDR,#3;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR4PD_DDR,#4;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR5PD_DDR,#5;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR6PD_DDR,#6;PD口对应位数据传输方向控制__0:输入1:输出#define PD_DDR_DDR7PD_DDR,#7;PD口对应位数据传输方向控制__0:输入1:输出;PE数据传输方向控制寄存器#define PE_DDR_DDR0PE_DDR,#0;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR1PE_DDR,#1;PE口对应位数据传输方向控制__0:输入1:输出1:输出#define PE_DDR_DDR3PE_DDR,#3;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR4PE_DDR,#4;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR5PE_DDR,#5;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR6PE_DDR,#6;PE口对应位数据传输方向控制__0:输入1:输出#define PE_DDR_DDR7PE_DDR,#7;PE口对应位数据传输方向控制__0:输入1:输出;******************************************************************** **********************************;GPIO PX_CR1;******************************************************************** **********************************;PA相应端口模式控制寄存器;PA口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PA_CR1_C0PA_CR1,#0#define PA_CR1_C1PA_CR1,#1#define PA_CR1_C2PA_CR1,#2#define PA_CR1_C3PA_CR1,#3#define PA_CR1_C4PA_CR1,#4#define PA_CR1_C5PA_CR1,#5#define PA_CR1_C6PA_CR1,#6#define PA_CR1_C7PA_CR1,#7;PB相应端口模式控制寄存器;PB口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PB_CR1_C0PB_CR1,#0#define PB_CR1_C1PB_CR1,#1#define PB_CR1_C2PB_CR1,#2#define PB_CR1_C3PB_CR1,#3#define PB_CR1_C4PB_CR1,#4#define PB_CR1_C5PB_CR1,#5#define PB_CR1_C6PB_CR1,#6#define PB_CR1_C7PB_CR1,#7;PC相应端口模式控制寄存器;PC口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PC_CR1_C0PC_CR1,#0#define PC_CR1_C1PC_CR1,#1#define PC_CR1_C2PC_CR1,#2#define PC_CR1_C3PC_CR1,#3#define PC_CR1_C4PC_CR1,#4#define PC_CR1_C5PC_CR1,#5#define PC_CR1_C6PC_CR1,#6#define PC_CR1_C7PC_CR1,#7;PD相应端口模式控制寄存器;PD口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PD_CR1_C0PD_CR1,#0#define PD_CR1_C1PD_CR1,#1#define PD_CR1_C2PD_CR1,#2#define PD_CR1_C3PD_CR1,#3#define PD_CR1_C4PD_CR1,#4#define PD_CR1_C5PD_CR1,#5#define PD_CR1_C6PD_CR1,#6#define PD_CR1_C7PD_CR1,#7;PE相应端口模式控制寄存器;PE口对应位模式控制寄存器:当DDR=0__输入时,0:浮空输入,1:上拉输入; DDR=1__输出时,0:开漏输出,1:推挽输出#define PE_CR1_C0PE_CR1,#0#define PE_CR1_C1PE_CR1,#1#define PE_CR1_C2PE_CR1,#2#define PE_CR1_C3PE_CR1,#3#define PE_CR1_C4PE_CR1,#4#define PE_CR1_C5PE_CR1,#5#define PE_CR1_C6PE_CR1,#6#define PE_CR1_C7PE_CR1,#7;******************************************************************** **********************************;GPIO PX_CR2;******************************************************************** **********************************;PA品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PA_CR2_C0PA_CR2,#0#define PA_CR2_C1PA_CR2,#1#define PA_CR2_C2PA_CR2,#2#define PA_CR2_C3PA_CR2,#3#define PA_CR2_C4PA_CR2,#4#define PA_CR2_C5PA_CR2,#5#define PA_CR2_C6PA_CR2,#6#define PA_CR2_C7PA_CR2,#7;PB品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PB_CR2_C0PB_CR2,#0#define PB_CR2_C1PB_CR2,#1#define PB_CR2_C2PB_CR2,#2#define PB_CR2_C3PB_CR2,#3#define PB_CR2_C4PB_CR2,#4#define PB_CR2_C5PB_CR2,#5#define PB_CR2_C6PB_CR2,#6#define PB_CR2_C7PB_CR2,#7;PC品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PC_CR2_C0PC_CR2,#0#define PC_CR2_C1PC_CR2,#1#define PC_CR2_C2PC_CR2,#2#define PC_CR2_C3PC_CR2,#3#define PC_CR2_C4PC_CR2,#4#define PC_CR2_C5PC_CR2,#5#define PC_CR2_C6PC_CR2,#6#define PC_CR2_C7PC_CR2,#7;PD品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PD_CR2_C0PD_CR2,#0#define PD_CR2_C1PD_CR2,#1#define PD_CR2_C2PD_CR2,#2#define PD_CR2_C3PD_CR2,#3#define PD_CR2_C4PD_CR2,#4#define PD_CR2_C5PD_CR2,#5#define PD_CR2_C6PD_CR2,#6#define PD_CR2_C7PD_CR2,#7;PE品相应位输入中断或输出速度控制寄存器;说明:当DDR=0__输入时0:禁止外部中断1:全能外部中断当DDR=1__输出时0:最大速度2MHZ1:最大速度10MHZ#define PE_CR2_C0PE_CR2,#0#define PE_CR2_C1PE_CR2,#1#define PE_CR2_C2PE_CR2,#2#define PE_CR2_C3PE_CR2,#3#define PE_CR2_C4PE_CR2,#4#define PE_CR2_C5PE_CR2,#5#define PE_CR2_C6PE_CR2,#6#define PE_CR2_C7PE_CR2,#7==========================User_register.inc======================= ;用户定义公用变量属性说明;00-0F单元定义为字节变量(供主程序使用)EXTERN R00.B;用户定义的变量EXTERN R01.B;用户定义的变量EXTERN R02.B;用户定义的变量EXTERN R03.B;用户定义的变量EXTERN R04.B;用户定义的变量EXTERN R05.B;用户定义的变量EXTERN R06.B;用户定义的变量EXTERN R07.B;用户定义的变量EXTERN R08.B;用户定义的变量EXTERN R09.B;用户定义的变量EXTERN R0A.B;用户定义的变量EXTERN R0B.B;用户定义的变量EXTERN R0C.B;用户定义的变量EXTERN R0D.B;用户定义的变量EXTERN R0E.B;用户定义的变量EXTERN R0F.B;用户定义的变量EXTERN R10.B;用户定义的变量EXTERN R11.B;用户定义的变量EXTERN R12.B;用户定义的变量EXTERN R13.B;用户定义的变量EXTERN R14.B;用户定义的变量EXTERN R15.B;用户定义的变量EXTERN R16.B;用户定义的变量EXTERN R17.B;用户定义的变量EXTERN R18.B;用户定义的变量EXTERN R19.B;用户定义的变量EXTERN R1A.B;用户定义的变量EXTERN R1B.B;用户定义的变量EXTERN R1C.B;用户定义的变量EXTERN R1D.B;用户定义的变量EXTERN R1E.B;用户定义的变量EXTERN R1F.B;用户定义的变量EXTERN R20.B;用户定义的变量EXTERN R21.B;用户定义的变量EXTERN R22.B;用户定义的变量EXTERN R23.B;用户定义的变量EXTERN R24.B;用户定义的变量EXTERN R25.B;用户定义的变量EXTERN R26.B;用户定义的变量EXTERN R27.B;用户定义的变量EXTERN R28.B;用户定义的变量EXTERN R29.B;用户定义的变量EXTERN R2A.B;用户定义的变量EXTERN R2B.B;用户定义的变量EXTERN R2C.B;用户定义的变量EXTERN R2D.B;用户定义的变量EXTERN R2E.B;用户定义的变量EXTERN R2F.B;用户定义的变量EXTERN R30.B;用户定义的变量EXTERN R31.B;用户定义的变量EXTERN R32.B;用户定义的变量EXTERN R33.B;用户定义的变量EXTERN R34.B;用户定义的变量EXTERN R35.B;用户定义的变量EXTERN R36.B;用户定义的变量EXTERN R37.B;用户定义的变量EXTERN R38.B;用户定义的变量EXTERN R39.B;用户定义的变量EXTERN R3A.B;用户定义的变量EXTERN R3B.B;用户定义的变量EXTERN R3C.B;用户定义的变量EXTERN R3D.B;用户定义的变量EXTERN R3E.B;用户定义的变量EXTERN R3F.B;用户定义的变量EXTERN R40.W;用户定义的变量EXTERN R41.W;用户定义的变量EXTERN R42.W;用户定义的变量EXTERN R43.W;用户定义的变量EXTERN R44.W;用户定义的变量EXTERN R45.W;用户定义的变量EXTERN R46.W;用户定义的变量EXTERN R47.W;用户定义的变量EXTERN R48.W;用户定义的变量EXTERN R49.W;用户定义的变量EXTERN R4A.W;用户定义的变量EXTERN R4B.W;用户定义的变量EXTERN R4C.W;用户定义的变量EXTERN R4D.W;用户定义的变量EXTERN R4E.W;用户定义的变量EXTERN R4F.W;用户定义的变量============================块编程========================== 3.3.3块编程Data EEPROM和FlashROM均支持块编程(块大小与芯片存储器密度有关,如表3-1所示),效率比字节、字编程要快得多,毕竟一次可同时写入一块(64字节或128字节),所不同的是块编程要求执行编程操作的程序代码必须部分(对于支持RWW功能的Data EEPROM至少要求数据装载程序段位于RAM中)、甚至全部位于RAM中,给程序编写带来了一定的难度。