p2dir &=~(1<<6)为什么旺旺不能聊天能实现

关于s3c2440的SWI,如何设置r0_百度知道
关于s3c2440的SWI,如何设置r0
starup.s如下SoftwareInterrupt
PC, [PC, R0, LSL #2]
PC, LRSwiFunction
FIQDisable
;3IRQEnable 开IRQ中断
R0, R0, #I_BIT
SPSR_c, R0
PC, LRmain.c#include
&config.h&void IRQ_Eint8(void);#define LED1_ON
~(1&&5)#define LED2_ON
~(1&&6)#define LED3_ON
~(1&&7)#define LED4_ON
~(1&&8)#define LED1_OFF
(1&&5)#define LED2_OFF
(1&&6)#define LED3_OFF
(1&&7)#define LED4_OFF
(1&&8)void delay(int times){
for(;times&0;times--)
for(i=0;i&400;i++);}void Led_port_init(void){
/*设置GPB5-GPB8为输出端口*/
rGPBCON &= ~((3&&10)|(3&&12)|(3&&14)|(3&&16));
rGPBCON |= (1&&10)|(1&&12)|(1&&14)|(1&&16);
}void ledon(void){ rGPBDAT = rGPBDAT&(LED1_ON)&(LED2_ON)&(LED3_ON)&(LED4_ON);
delay(10000);
/* 全灭 */
rGPBDAT = rGPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF);
delay(10000);
}void key_init(void) {
rGPGCON = rGPGCON &(~(3&&0));
//input mode}void EINT_init(void){ rGPGCON = rGPGCON &(~(3&&0)) | (2&&0); rEXTINT0 = (0x2&&3);
VICVectAddr[8] = (uint32) IRQ_Eint8;
rPRIORITY = 0x;
rINTMOD = 0x;
rINTMSK = ~0x0000020;
rEINTMASK = ~0x0000020; }void IRQ_Eint8(void){
rGPGCON = rGPGCON & (~(0x03&&0)); for(i=0; i&10000; i++);
if(rGPGDAT&(0x1))
{ rGPFCON = rGPGCON | (0x02&&0);
rEINTPEND = (1&&8); rSRCPND = (1&&8); rINTPND = rINTPND; } rGPFCON = rGPFCON | (0x02&&8);
ledon(); rEINTPEND = (1&&8);
rSRCPND = (1&&8); rINTPND = rINTPND;}int
main(void){
Led_port_init(); key_init();
EINT_init(); IRQEnable(); while(1);
return(0);}请问如何在执行IRQEnable()之前把R0寄存器设置为1,让它开启IRQ啊??
我有更好的答案
推荐一:OS_CPU.H1、定义与编译器无光的数据类型只是按照不同的编译器编写对应的数据类型的typedef 对应于ARM7的数据类型的编写如下typedef unsigned char
BOOLEAN;/*
布尔变量*/typedef unsigned char
无符号8位整型变量*/typedef signed
有符号8位整型变量*/typedef unsigned short INT16U; /* 无符号16位整型变量*/typedef signed
short INT16S; /* 有符号16位整型变量*/typedef unsigned int
INT32U; /* 无符号32位整型变量*/typedef signed
INT32S; /* 有符号32位整型变量*/typedef float
/*单精度浮点数(32Bit)*/typedef double
/*双精度浮点数(64Bit)*//*在上面定义的数据类型中按照ARM7的堆栈宽度选择INT32U*/typedef INT32U
OS_STK; /*
堆栈是32位宽度*/ 接下来一部分是为了兼容低版本UCOS的数据类型所编写的代码,在UCOS-II中暂不考虑2 与处理器相关的代码先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式 2#define OS_CRITICAL_METHOD 2/*选择开,关中断的方式 */接下来的一段是我暂时还没有完全搞懂的一部分,只知道是设定了12个软件中断的函数,当调用这些函数之前都会执行对应中断号的事情。具体的看到后面应该能完全搞懂软件中断的实现方式,该段代码在后面的文件中会有具体的解释,这里暂时不看定义堆栈的生长方式,ARM7内核支持两种生长方式,但是ADS的C语言编译器只支持从上往下的生长方式,因此:#define OS_STK_GROWTH 1 /* 堆栈是从上往下长的,0-从下往上的生长方式 */最后几行分别定义了用户模式01和系统模式1f以及IRQ中断禁止的指令80三个立即数,方便调用.还有两个预定义往后看应该知道作用,暂不考虑,不是很重要.软中断:中断不返回形式:void _swi(swi_num) swi_name(arguments);返回一个结果到R0中int _swi(swi_num) swi_name(arguments);最多可以返回四个结果R0-R3到一个结构struct type中type(返回类型) _value_in_regs(返回多个结果的修饰符) _swi(swi_num) swi_name(arguments);在ARM中实现软中断的方法我在blog里面搜了很多文章也没有看到讲的通俗一点的,还是自己看ARM的移植代码吧首先定义了一堆软中断的中断号,其中0和1的中断服务子程序是用汇编编写的,其他的都是在c语言编写的中断服务子程序SWI_Exception中。__swi(0x00) void OS_TASK_SW(void);/*
任务级任务切换函数
*/__swi(0x01) void _OSStartHighRdy(void);/*
运行优先级最高的任务
*/__swi(0x02) void OS_ENTER_CRITICAL(void);/*
*/__swi(0x03) void OS_EXIT_CRITICAL(void);/*
*/__swi(0x40) void *GetOSAddr(int Index);/*
获取系统服务函数入口
*/__swi(0x41) void *GetUsrAddr(int Index);/*
获取自定义服务函数入口
*/__swi(0x42) void OSISRBegin(void);/*
中断开始处理
*/__swi(0x43) int
OSISRNeedSwap(void);/*
判断中断是否需要切换
*/__swi(0x80) void ChangeToSYSMode(void);/*
任务切换到系统模式
*/__swi(0x81) void ChangeToUSRMode(void);/*
任务切换到用户模式
*/__swi(0x82) void TaskIsARM(INT8U prio);/*
任务代码是ARM代码
*/__swi(0x83) void TaskIsTHUMB(INT8U prio);/*
任务代码是THUMB
*/ 比如在程序运行到调用OS_TASK_SW(void)函数时,就产生软件中断,然后就进入中断服务子程序,按照什么指令走呢?恩,就按照下面这个代码,这个代码是将软件中断异常处理程序挂接到内核的作用的,是在启动代码中实现的:LDR
PC,SWI_Addr
SoftwareInterrupt 因此当产生软中断之后PC就跳到了SoftwareInterrupt,这时就算真正进入了软件异常中断处理部分了,然后就是执行下面的汇编代码SoftwareInterruptLDR
SP, StackSvc/*重新设置堆栈指针*/STMFD
SP!, /*保存 R0,R1,R2,R3,R12,LR(R14),注意为什么只保存这几个寄存器呢,因为R4-R11存储局部变量,编译器自动保护他们*/MOV
R1指向参数存储位置
/*保存管理模式的状态寄存器*/TST
R3, #T_bit
中断前是否是Thumb状态 */LDRNEH
R0, [LR,#-2]
/* 若是,取得Thumb状态SWI号*/BICNE
R0, R0, #0xff00
/*THUMB指令SWI功能号为8位 */LDREQ
R0, [LR,#-4]
/* 为零即ARM指令取得SWI号 */BICEQ
R0, R0, #0xFF000000/*在ARM指令集中SWI功能号为24位所以高8位清零r0=SWI号*/CMP
PC, =OSIntCtxSw
功能号为0到OSIntCtxSw执行中断任务切换函数
PC, =__OSStartHighRdy/*SWI为1第一次任务切换*/BL
SWI_Exception
/*否则进入c编写的中断函数 */LDMFD
SP!, /*R0-R3,R12,LR出栈
*/StackSvc DCD
(SvcStackSpace + SVC_STACK_LEGTH * 4 - 4) 怎么进入c编写的中断服务子程序SWI_Exception呢?通过下面的申明IMPORT
SWI_Exce软中断异常处理程序表示将c程序中的该函数挂接到此段汇编代码中,同样的道理EXPORT
__OSStartHighRdyEXPORT
OSIntCtxS中断退出时的入口参见startup.s中的IRQ_HandlerEXPORT
SoftwareI软中断入口上面的申明是将该段汇编代码挂接到外面,因此在外部可以直接调用函数名继续看OS_CPU_A.S的其他部分代码,就是两个软件异常中断处理函数OSIntCtxSw和OSStarHighRdyOSIntCtxSw代码是中断服务子程序使得更高优先级的任务进入就绪状态后,中断返回后需要切换到该任务时调用的,这是被切换的任务的CPU寄存器的值已经在响应中断后存入了堆栈中,因此,这里不需要重复保存了直接切换任务即可,具体过程看代码OSIntCtxSw
下面为保存任务环境
当响应软件异常中断后进入了系统模式,在上面的代码中我们可以看到,进入系统模式时保存的堆栈结构从顶到底依次是:R0,R1,R2,R3,R12,LR,而在用户模式中任务的堆栈结构应该是:OsEnterSum,CPSR,RO-12,LR,PC,所以在进行软件中断任务切换之前先要保存原来任务的堆栈结构。
R2, [SP, #20]
R12, [SP, #16]
CPSR_c, #(NoInt | SYS32Mode)
保存R4-R12
CPSR_c, R0
SP, SP, #8
出栈R12,PC
CPSR_c, #(NoInt | SYS32Mode)
R1, =OsEnterSum 获取OsEnterSum
保存CPSR,OsEnterSum
保存当前任务堆栈指针到当前任务的TCB
R1, =OSTCBCur
OSTaskSwHook
调用钩子函数
OSPrioCur &= OSPrioHighRdy
R4, =OSPrioCur
R5, =OSPrioHighRdy
OSTCBCur &= OSTCBHighRdy
R6, =OSTCBHighRdy
R4, =OSTCBCur
R6, [R4]OSIntCtxSw_1
获取新任务堆栈指针
SP, R4, #68
17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
LR, [SP, #-8]
CPSR_c, #(NoInt | SVC32Mode)进入管理模式
设置堆栈指针
CPSR,OsEnterSum
恢复新任务的OsEnterSum
R3, =OsEnterSum
SPSR_cxsf, R5
SP!, ^运行新任务 __OSStartHighRdy
CPSR_c, #(NoInt | SYS32Mode)调整到管理模式
告诉uC/OS-II自身已经运行
R4, =OSRunning
R5, [R4]标记多任务运行标记为真
OSTaskSwHook调用钩子函数,可以运行用户自定义的函数
R6, =OSTCBHighRR6存有最高优先级的就绪任务的控制块地址
OSIntCtxSw_1转到前面编写的中断返回函数块的任务跳转部分的代码,因为这两个函数都要用到这部分代码,进入这段代码之前高优先级的就绪任务的任务控制快地址存在R6中。
SWIStacks, DATA, NOINIT,ALIGN=2SvcStackSpace
SVC_STACK_LEGTH * 4管理模式堆栈空间 OSIntCtxSw_1的代码:OSIntCtxSw_1
获取新任务堆栈指针
R4, [R6] ;任务控制块的堆栈指针放在R6中,现在放在R4中
SP, R4, #68
17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
LR, [SP, #-8]
CPSR_c, #(NoInt | SVC32Mode)进入管理模式
设置堆栈指针,R4存有没有改动过的堆栈指针
CPSR,OsEnterSum
恢复新任务的OsEnterSum
R3, =OsEnterSum
SPSR_cxsf, R5
SP!, ^运行新任务,恢复现场,异常处理返回;中断返回指令的寄存器列表其中必须包括PC后的^符号,表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时,CPSR也得到恢复。这里使用的堆栈指针SP是属于异常模式的寄存器,每个异常模式有自己的堆栈指针。SoftwareInterrupt
SP, StackS 重新设置堆栈指针
SP!,保存寄存器
R1, SP R1指向参数存储位置
R3, #T_ 中断前是否是Thumb状态
R0, [LR,#-2] 是: 取得Thumb状态SWI号
R0, R0, #0xff00
R0, [LR,#-4] 否: 取得arm状态SWI号
R0, R0, #0xFF000000
r0 = SWI号,R1指向参数存储位置
PC, =OSIntCtxSw
PC, =__OSStartHighR SWI 0x01为第一次任务切换
SWI_Exception
SP!, ^StackSvc
(SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)OSIntCtxSw
下面为保存任务环境
R2, [SP, #20]
获取PC(LR)
R12, [SP, #16]
CPSR_c, #(NoInt | SYS32Mode)
保存R4-R12
CPSR_c, R0
SP, SP, #8
出栈R12,PC
CPSR_c, #(NoInt | SYS32Mode)
R1, =OsEnterSum 获取OsEnterSum
保存CPSR,OsEnterSum
保存当前任务堆栈指针到当前任务的TCB
R1, =OSTCBCur
OSTaskSwHook
调用钩子函数
OSPrioCur &= OSPrioHighRdy
R4, =OSPrioCur
R5, =OSPrioHighRdy
R6, [R4]把OSPrioHighRdy最高优先级的就绪任务传给OSPrioCur
OSTCBCur &= OSTCBHighRdy
R6, =OSTCBHighRdy
R4, =OSTCBCur
R6, [R4]将最高优先级的任务控制块指针传给当前任务控制块指针 关于中断和时钟节拍,UCOS-II对于ARM7通用的中断服务程序的汇编与c函数接口如下:MACRO和MEND伪指令用于宏定义,MACRO标识宏定义的开始,MEND标识宏定义的结束。定义之后在程序中就可以通过宏指令多次调用该段代码MACRO$IRQ_Label HANDLER $IRQ_Exception_
$IRQ_Label
输出的标号
$IRQ_Exception_ 引用的外部标号$IRQ_Label
LR, LR, #4
计算返回地址
SP!, 保存任务环境
SP, ^ 保存用户状态的R3,SP,LR,注意不能回写
如果回写的是用户的SP,所以后面要调整SP
=OSIntN OSIntNesting++
R1, R1, #1
SP, SP, #4*3
CPSR_c, #(NoInt | SYS32Mode) 切换到系统模式
SP, =StackUsr
$IRQ_Exception_ 调用c语言的中断处理程序
CPSR_c, #(NoInt | SYS32Mode) 切换到系统模式
R2, =OsEnterS OsEnterSum,使OSIntExit退出时中断关闭
R2, =OsEnterS 因为中断服务程序要退出,所以OsEnterSum=0
CPSR_c, #(NoInt | IRQ32Mode) 切换回irq模式
SP, ^ 恢复用户状态的R3,SP,LR,注意不能回写
如果回写的是用户的SP,所以后面要调整SP
R0, =OSTCBHighRdy
R1, =OSTCBCur
SP, SP, #4*3
SPSR_cxsf, R3
LDMEQFD SP!, ^ 不进行任务切换
PC, =OSIntCtxS 进行任务切换
MEND二:OS_CPU_C.C
个文件中要求用户编写10个简单的C函数,但是只有1个函数是必要的,其余的函数必须声明,但不一定要包含任何代码,大致看了一下作用好像是用来调试之类的。唯一要编写的是OSTaskStkInit()
OSTaskStkInit()函数的功能是初始化任务的栈结构,任务的堆栈结构与CPU的体系结构、编译器有密切的关联。从ARM的结构可以写出如下的栈结构:程序计数器PC,程序链接器LR,R12-R1,R0用于传递第一个参数pdata,CPSR/SPSR,关中断计数器(用于计算关中断的次数,这样就实现了中断的嵌套),返回的地址指针是指向的最后一个存入的数据,而不是一个空地址。软件中断异常SWI服务程序C语言部分
void SWI_Exception(int SWI_Num, int *Regs):参数SWI_Num对应前面文件中定义的功能号,其中0、1号的功能在后面的文件中定义,这里只定义了其他10个功能。
2、3分别对应关中断和开中断
关中断:MRS
//在软件中断的时候直接对程序状态保存寄存器SPSR操作也就是对CPSR的操作
R0, R0, #NoInt
//在汇编语言中对寄存器的对应位置位用ORR,清零用BIC
SPSR_c, R0
//SPSR_c表示的是只改变SPSR的控制段的8位代码,其他三段_f,_s,_x中标志位在_f段,其他为保留位
开中断:MRS
//在开中断中基本与上面相同,只是ORR改成BIC清零
R0, R0, #NoInt
由于需要实现中断嵌套,所以只有当关中断的计数器减为0的时候才能够开中断,而且每次关中断的时候该计数器都应该加1。另外,插入汇编语言时用_asm指令。
80、81、82、83分别对应系统模式、用户模式、ARM指令集、THUMB指令集
系统模式:MRS
R0, R0, #0x1f
//先将控制模式的低5位清零
R0, R0, #SYS32Mode
//设置成系统模式的1F
SPSR_c, R0
用户模式:MRS
R0, R0, #0x1f
R0, R0, #USR32Mode
//设置成用户模式的10
SPSR_c, R0
ARM指令集与THUMB指令集的代码如下:
ptcb = OSTCBPrioTbl[Regs[0]];
if (ptcb != NULL)
ptcb -& OSTCBStkPtr[1] &= ~(1 && 5);
ptcb = OSTCBPrioTbl[Regs[0]];
if (ptcb != NULL)
ptcb -& OSTCBStkPtr[1] |= (1 && 5);
昨天就是看到这里,出现了一个意识到是不能忽悠的地方就是UCOS里面的任务控制块OS_TCB的概念,因此今天的任务就是把这部分看看。。。
大概回忆了一下昨天晚上的工作,开始今天的工作吧 一点一点来,什么不会就学什么,都不会就都学。。。没有问题只要你肯努力。。。。。。__OSStartHighRdy
CPSR_c, #(NoInt | SYS32Mode)MSR:在ARM中只有MSR能够直接设置状态寄存器CPSR或SPSR,可以是立即数或者源寄存器,NoInt是禁止中断,SYS32Mode是系统模式
告诉uC/OS-II自身已经运行
R4, =OSROSRunning正在运行多任务的标志,=OSRunning是把OSRunning的地址加载到R4,R4里存的是一个地址。。。
R5, [R4]将R5存储到R4存的地址的变量即OSRunning中,也就是将OSRunning置1
OSTaskSwHook调用钩子函数,OSTaskSwHook 是用于扩展的,在任务切换的时候执行用户自己定义的功能。
R6, =OSTCBHighROSTCBHighRdy指向最高优先级任务的控制块TCB的指针!!!将放指针的地址放到R6中。
R6, [R6]将R6地址处的数据读出即OSTCBHighRdy的地址放到R6中
OSIntCtxSw_1跳转到OSIntCtxSw_1
SWIStacks, DATA, NOINIT,ALIGN=2SvcStackSpace
SVC_STACK_LEGTH * 4管理模式堆栈空间继续昨天没有看完的代码OSIntCtxSw
下面为保存任务环境
R2, [SP, #20]
获取PC,放入R2
R12, [SP, #16]
获取R12,//R12存的什么东西啊???
CPSR_c, #(NoInt | SYS32Mode)进入系统模式并禁止中断
R1, LRR1放LR值
保存LR,PC,将R1,R2存入SP
保存R4-R12,将R4-12存入SP
CPSR_c, R0再回到之前的模式
SP, SP, #8
出栈R12,PC
CPSR_c, #(NoInt | SYS32Mode)
R1, =OsEnterSum 获取OsEnterSum
保存CPSR,OsEnterSum
保存当前任务堆栈指针到当前任务的TCB
R1, =OSTCBCur
OSTaskSwHook
调用钩子函数
OSPrioCur &= OSPrioHighRdy
R4, =OSPrioCur
R5, =OSPrioHighRdy
OSTCBCur &= OSTCBHighRdy
R6, =OSTCBHighRdy
R4, =OSTCBCur
R6, [R4]OSIntCtxSw_1
获取新任务堆栈指针
R4, [R6]把OSTCBHighRdy指向最高优先级任务的控制块TCB的指针给R4
SP, R4, #68
17寄存器:CPSR,OsEnterSum,R0-R12,LR,SP
LR, [SP, #-8]取出LR放到LR
CPSR_c, #(NoInt | SVC32Mode)进入管理模式并且保持禁止中断
设置堆栈指针
CPSR,OsEnterSum。LDMFD数据出栈,放入R4,R5
恢复新任务的OsEnterSum
R3, =OsEnterSOsEnterSum的地址存入R3
R4, [R3]把R4的值赋给OsEnterSum
SPSR_cxsf, R5
恢复CPSR;在管理模式里是修改SPSR
SP!, ^运行新任务
,恢复现场,异常处理返回
其他类似问题
s3c2440的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁单片机C语言中P3 &=~(1&&6) 什么意思_百度知道
单片机C语言中P3 &=~(1&&6) 什么意思
提问者采纳
6是将01h左移六位,最终结果重新赋给P3口,&00 0001,符号“~”是按位取反,由二进制的变为,设P3=01h,符号“&”表示按位与,即十六进制的40h,取反后变为,最终结果为01h整条语句意思就是先将01h左移六位,1&lt,再将结果按位取反,再与p3口的值按位与,&lt,
提问者评价
其他类似问题
按默认排序
其他3条回答
6) 来完成如此简单的功能,就是很简单的一句,&lt,
P3,6就是把P3口的第六位清零的意思。使用P3 &=~(1&lt,用汇编来说明,只能说明编者有一种无聊的心态。,究竟是什么意思,
1L回答的很详细,概括的说功能就是将P3^6清零,其余位保持不变
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁请教一个DS12CR887在液晶显示的问题_百度知道
请教一个DS12CR887在液晶显示的问题
PC4), } void init() { DDRA=0xff,uchar date) { uchar shi, #include&lt,&lt,=(1&lt,&#47,液晶使能端口初始化为低电平 sei(),&#47,PC4),&lt,置A端口为输出状态 DDRC=0xff,&#47,PC7),&lt,INT1), _delay_ms(5),没有数据变化, uchar read_ds(uchar),=(1&lt,h&gt,第一次使用时钟时打开振荡器用的 write_ds(2, PORTC, PORTC&=~(1&lt,AS端置高 PORTC,&lt, ge=date%10,置A端口为输出状态 DDRC=0xff,PC6),interrupt,=(1&lt,&#47,&#47,&#47,9),PC2),&#47, PORTC&=~(1&lt,h&gt, #include&lt,PC5),uchar), PORTC&=~(1&lt,液晶程序方面是没有问题的,&#47,0x26),&#47,=(1&lt, } void write_date(uchar date) { _delay_ms(5),=(1&lt,&lt,置所有C端口为输出 PORTC&=~(1&lt, PORTC,&lt,写了一条DS12CR887时钟程序,&lt,&lt,&#47,再读数据 PORTC,=(1&lt,=(1&lt,DS端口置高 PORTC,=(1&lt,AS接PC6, PORTC,写12C887函数 DDRA=0xff,PC2),h&gt,一直调不出时钟效果,io,=(1&lt,=(1&lt,ISC11), void write_ds(uchar,&#47,&#47,&lt,再写数据 PORTC, _delay_ms(5),&lt,PC5),&#47, uchar table1[]=&quot,PC2), while(1) { miao=read_ds(0), set_time(), } } void write_sfm(uchar add,=(1&lt,PC4), PORTA=date,PC7),&lt, PORTA=add,18),不知出了什么问题,&#47,,先写地址 PORTC&=~(1&lt,PC3),avr&#47,&#47,19), write_sfm(7,PC7),RW接PC5,PC2), _delay_ms(5), uchar table[]=&quot, &quot,=(1&lt,&#47,&#47,PC6),=(1&lt,19引接到PD3(INT1)上,15,&lt,0x20),&#47, shi=read_ds(4), #define uchar unsigned char #define uint unsigned int uchar count,=(1&lt,delay,PC2), write_com(0x80),&#47,miao), PORTC,&lt, write_com(0x38),允许INT1中断 GIFR,&#47,AS端置高 PORTC, uchar miao,&lt,&lt,出现 15,置A端口为输出状态 DDRC=0xff,=(1&lt,开总中断 MCUCR,写液晶命令函数 { _delay_ms(5),&#47,读12C887函数 DDRA=0xff, } void write_ds(uchar add,&#47, PORTC&=~(1&lt,&#47,&#47,AS端口拉低 PORTC&=~(1&lt,flag,&#47, PORTC, PORTA=com, PORTA=0xff, _delay_ms(5), for(num=0,&#47,&#47,fen),&lt,10,&lt,PC5),RW端口置高 PORTA=add,&lt,&#47,&#47,3),先写地址 PORTC&=~(1&lt,&lt,片选置高 } uchar read_ds(uchar add) {&#47, write_com(0x06),&#47,置所有C端口为输出 uchar ds_date,置所有C端口为输出 PORTC&=~(1&lt,&#47,&#47, for(num=0,&lt,RW端口置高 PORTC,&#47, write_date(0x30+shi),shi,&lt, PA端口数DS12CR887的8位数据端口, shi=date&#47,初始化月 write_ds(7,&#47,&lt,&lt, PORTC,,&#47,&#47,1),num&lt,12,num++) { write_date(table[num]),初始化分钟 write_ds(4,=(1&lt,uchar date) {&#47, _delay_ms(5),PC4),=(1&lt,PC3), write_ds(0x0B,&#47,s1num,&#47,谢谢,PC5),&#47,&#47,&#47,初始化年 write_ds(8,&#47,初始化小时 write_ds(9,PC6),ge,&#47, void set_time(),清除INT1中断标志位 uchar num,&#47,PC6),PC6),INTF1), } },三一个数据,&#47, PORTC,num++) { write_date(table1[num]),&#47,设置中断1下降沿触发 GICR,&#47,&lt, 20 - - &quot, } void set_time() { write_ds(0x0A,&lt,&#47, ds_date=PORTA,PC6),&lt,&#47,&lt,&#47,flag1, return ds_date,片选置低 PORTC,&#47, PORTC&=~(1&lt,avr&#47,初始化日 write_ds(6,&#47, fen=read_ds(2),&lt, write_sfm(4,&#47, void write_com(uchar com)&#47,RW置低 PORTA=date,CS接PC7, write_date(0x30+ge), #include&lt,=(1&lt,&#47,&#47,num&lt,&#47, write_com(0x0c),&#47,15, write_com(0x80+0x40+add),&#47,&#47, write_sfm(10, write_com(0x01),望高手指教, PORTC,&#47,shi),30),15,util&#47,&#47,&#47, } write_com(0x80+0x40), } int main(void) { init(),fen,PC7),&#47, _delay_ms(5),DS接PC4,
提问者采纳
按照你的程序,检查1脚是否为接地或者浮空,你应该是使用INTEL模式的时序, uchar read_ds(uchar add) 里面的P0=0xff一句是多余的。++,
其他类似问题
液晶显示的相关知识
按默认排序
其他3条回答
这种东东要专业人士来回答,对不起了啊,采纳,我也不知道,
等待您来回答
您可能关注的推广回答者:
下载知道APP
随时随地咨询
出门在外也不愁TI的cc2530如何将一个I/O口置1或置0(高电平低电平)?_百度知道
TI的cc2530如何将一个I/O口置1或置0(高电平低电平)?
如题正在做cc2530的开发有一个功能需要将P22口置1或置0例程中似乎没有提到类似的东西请教一下接触过cc2530的各位,这个操作要如何实现?
我有更好的答案
按默认排序
这个硬件是谁设计的?P22是编程用的接口,一般和编程复用的接口很难处理的,处理不好就是不能编程.硬要使用的话就是在编程的时候写这两句:P2DIR^=(1&&2);//设置P22为输出只需要执行一次// ^
^ 这两个2就是接口的位置编号P2 ^=(1&&2);//输出1P2 &=~(1&&2);//输出0想输出1只需要执行上面对应的语句一次,输出就一直是1,这个就像开灯的开关一样,开一下,灯就一直是开的.别的口一样,例如P1-7P1DIR^=(1&&7);P1^=(1&&7);(1&&7)
称为1左移7 等于二进制数 0b^=
这个符号是或赋值,P1^=(1&&7);等价于 P1 = P1^(1&&7);~这个符号是取反P2 &=~(1&&2);//输出0这句话就留给你想想了
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁STM32定时器TIM8为什麽没有PWM输出?_百度知道
STM32定时器TIM8为什麽没有PWM输出?
RCC-&APB2ENR|=1&&13;
//TIM8时钟使能
RCC-&APB2ENR|=1&&4;//使能PORTC时钟 GPIOC-&CRL&=0X00FFFFFF;//PC6输出 GPIOC-&CRL|=0XBB000000;//复用功能输出 GPIOC-&ODR|=1&&6;//PC6.7上拉 GPIOC-&CRH&=0XFFFFFF00;//PC8输出 GPIOC-&CRH|=0X000000BB;//复用功能输出 GPIOC-&ODR|=1&&8;//PC8.9上拉 TIM8-&ARR=899; TIM8-&PSC=0; TIM8-&CCMR1|=6&&4; TIM8-&CCMR1|=1&&3; TIM8-&CCMR1|=6&&12; TIM8-&CCMR1|=1&&11; TIM8-&CCMR2|=6&&4; TIM8-&CCMR2|=1&&3; TIM8-&CR1|=1&&7; TIM8-&CR1|=1&&4; TIM8-&CCMR2|=6&&12; TIM8-&CCMR2|=1&&11; TIM8-&BDTR|=1&&15; TIM8-&CCER|=3&&0;//
输出使能 TIM8-&CCER|=3&&4;// OC2
输出使能 TIM8-&CCER|=3&&8; // OC3
输出使能 TIM8-&CCER|=3&&12; // OC4 输出使能
TIM8-&CCR1=50; TIM8-&CCR2=50; TIM8-&CCR3=50; TIM8-&CCR4=50; TIM8-&EGR|=1&&0; TIM8-&CR1|=1&&0;求解,没有财富了。
提问者采纳
先看一下你用的哪一种型号的stm32,TIM8是高级定时器,只有大容量产品(闪存存储器容量在256K至512K字节之间)才具有
STM32F103ZET6
提问者评价
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 为什么旺旺不能聊天 的文章

 

随机推荐