//PIC18F26K83
//配置字关闭了外部振荡器,启用内部64M时钟,其它的默认
//看门狗默认开启,使用内部31K时钟定时2s
//#include "Configuration.h"
#pragma config CONFIG1L=0b00000100 //配置字设置:时钟=内部64M,分频=1,外部振荡器关闭
#include <xc.h>
#include "BIT.h"
#include "DELAY_LONG.h"
#include "FONT0805.h"
#include "MCUIIC.h"
#include "SH1106.h"
#define out LATB
unsigned int ii, nn;
unsigned char xx, aa;
unsigned char test(unsigned char dat)
{
unsigned char yy;
yy=dat;
return yy;
}
void __interrupt(irq(TMR0),high_priority) myTmrIsr(void) //增强型PIC18有很多个中断向量
{
nn++;
LATC1=1; //LED亮
__asm("CLRWDT"); //清狗
TMR0IF=0; //清零中断标记
OLED_gotoxy(71,3); //显示时间
OLED_show(nn);
LATC1=0;
if(aa) //显示:程序在1600K个CPU时钟里运行for()语句的次数
{
aa=0;
OLED_gotoxy(35,3);
OLED_show(ii);
}
}
void main(void)
{
OSCCON1=0b01100000; //高4位是时钟选择,本例选择高频内部时钟HFINTOSC,低4位是“后”分配器选择,0000=1分频
OSCFRQ=8; //高频内部时钟HFINTOSC的频率选择,=8就是64MHz
WDTCON1=7; //看门狗溢出时间=65536/31K=2s,窗口期100%,窗口期就是说什么时候可以清狗,什么时候清狗属于违规
IIC_init();
OLED_init();
OLED_clear();
OLED_gotoxy(11,1);
OLED_string("PIC18F26K83>SH1106");
OLED_gotoxy(11,5);
OLED_string("21IC.COM PANXIAOYI");
TRISC1=0; //输出驱动LED,测试T0计数溢出中断
TRISC2=0; //输出驱动LED,测试T0输出,LED不会闪烁,不正常
RC2PPS=0x25; //某端口定义为由计数器TMR0计数溢出输出驱动电平翻转
TMR0H=195;
TMR0IP=1; //高级中断
TMR0IE=1; //中断允许
ei(); //总中断使能
T0CON1 B6H; //Fosc/4=16M时钟
T0CON1 B3H; //预分频8192
T0CON1 B2H;
T0CON1 B1L;
T0CON1 B0H;
T0CON0 B4L; //使用8位模式
T0CON0 B7H; //启动计时器
aa=1;
ii=1;
nn=0;
while(1)
{
for(ii=0; ii<65535; ii++) //全部语句可以运行8988次
{
xx=test(37); //注释这条可以运行9580次
out=xx;
if(xx>47) xx=57; else xx=67; //注释这条可以运行9998次
out=xx;
xx<<=1; //注释这条可以运行9248次
out=xx;
xx>>=1; //注释这条可以运行9248次
out=xx;
xx|=1; //注释这条可以运行9142次
out=xx;
xx&=1; //注释这条可以运行9142次
out=xx;
xx=~xx; //注释这条可以运行9142次
out=xx;
xx=xx^1; //注释这条可以运行9142次
out=xx;
xx+=1; //注释这条可以运行9090次
out=xx;
xx-=1; //注释这条可以运行9090次
out=xx;
xx*=3; //注释这条可以运行9523次
out=xx;
xx/=3; //注释这条可以运行9523次
out=xx;
xx%=3; //注释这条可以运行9638次
out=xx;
}
while(1);
}
}
代码如下:
|