|
PICC每日一贴(浅谈PICC的位操作) void set_tmr1(){
tmr1l=0xdc;
tmr1h=0xb; /*设定初值3036*/
t1con=0b10001; /*设定tmr1 0.125s溢出一次*/
}
void interrupt time(){
if(tmr1if){
t1con=0b10000; /*关闭tmr1*/
tmr1l=0xdc;
tmr1h=0xb; /*tmr1设初值*/
t1con=0b10001; /*从新设分频比,打开tmr1*/
if(s++>8){ /*每s清0*/
s=0;
if(ss++>60)/*每分钟清0*/
ss=0;
}
tmr1if=0;
return;
}
}
unsigned char s; /*每0.125s累加1*/
unsigned char ss; /*每1秒累加1*/
void main(){
set_tmr1();
........; /*设定i/o口,开tmr1中断*/
while(1){
if(...) /*判断闪烁方式语句,下同*/
rb1=(bit)(s>4); /*每1s闪烁一次,占空比50%(调节>后面值可以改变)*/
if(...)
rb2=(bit)(!ss); /*每1分钟闪烁一次,亮1秒,熄59秒*/
if(...)
rb3=(bit)(s==0 || s==2 || s== 4 || s== 6); /*每0.25s闪烁一次*/
.........; /*其它工作*/
}
}
这样的框架对于基于要求实时性高的软件查询的程序是很有效的。
在picc中使用常数指针。
常数指针使用非常灵活,可以给编程带来很多便利。
我测试过,picc也支持常数指针,并且也会自动分页,实在是一大喜事。
定义一个指向8位ram数据的常数指针(起始为0x00):
#define dbyte ((unsigned char volatile *) 0)
定义一个指向16位ram数据的常数指针(起始为0x00):
#define cword ((unsigned int volatile *) 0)
((unsigned char volatile *) 0)中的0表示指向ram区域的起始地址,可以灵活修改它。
dbyte[x]中的x表示偏移量。
下面是一段代码1:
char a1,a2,a3,a4;
#define dbyte ((unsigned char volatile *) 0)
void main(void){ long cc=0x89abcdef; a1=dbyte[0x24]; a2=dbyte[0x25]; a3=dbyte[0x26];
|