开发板型号:给力者 GL7
http://pan.baidu.com/s/1sjQ8jU1
一、 点亮LED
#include
//根据选项,配置字应该如下所示:
//实际使用中,这样太麻烦,对于默认选项,我们将其忽略掉:
//__CONFIG(HS&WRTEN&WDTDIS&BOREN&PWRTDIS&UNPROTECT&DUNPROT&DEBUGDIS&LVPDIS);
//HS 外部高频振荡(外部晶振频率超过4M用此方式)
//WDTDIS 看门狗关闭。DIS可以看成disable的缩写
//LVPDIS 低压编程方式关闭。
__CONFIG(HS&WDTDIS&LVPDIS);
//---------------------------------------
//名称: 主函数
//---------------------------------------
void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
TRISD=0B11111110; //初始化RD7-RD0的输入输出方向:RD0定义为输出
PORTD=0B00000001; //初始化RD7-RD0的数值:RD0输出高电平
while(1) //死循环,单片机初始化后,将一直运行这个死循环
{
}
}
二、 Timer0中断LED闪烁
4MHz内部晶振----4分频----8分频----定时器125KHz(8us)----250次----2000us----250次中断----500msLED翻转
#include
//根据选项,配置字
__CONFIG(HS&WDTDIS&LVPDIS);
#define V0 RD0 //定义V0为RD0端口
unsigned char q;
//---------------------------------------
//名称:中断服务程序
//---------------------------------------
void interrupt ISR(void) //PIC单片机的所有中断都是这一个入口
{
if(T0IF==1) //需要进一步判断是否是T0中断(Timer0溢出标志位)
{
TMR0=0x13; //定时器中断后,要重置初值,以备下次中断
T0IF=0; //清中断标志位,以备下次中断
//***此处用户自行添加定时器T0中断处理程序***
if(++q>250) //2000us中断一次,再计次250次后就是500毫秒
{
q=0;
V0=!V0; //0.5S对V0状态取反,达到了秒闪烁的目的
}
}
}
//---------------------------------------
//主函数
//---------------------------------------
void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
TRISD=0B11111110; //RD0定义为输出
PORTD=0B00000000; //初始化RD7-RD0的数值
//***定时器TMR0初始化***
T0CS=0; //1.TMRO时钟源选择内部指令周期时钟(Fosc/4)
PSA=0; //2.预分频器分配给TMR0模块
PS0=0; //3.TMR0预分频比1:8,PS0=0
PS1=1; //TMR0预分频比1:8,PS1=1
PS2=0; //TMR0预分频比1:8,PS2=0
TMR0=0x13; //4.定时2000微秒,置初值256-250+13
T0IF=0; //5.清除TMR0的中断标志
T0IE=1; //TMR0中断允许
//**********************
//***开全局中断设置****
//定时器T0设置了中断允许,此处要开全局中断
GIE=1; //6.开全局中断
//*********************
while(1)//死循环,单片机初始化后,将一直运行这个死循环
{
}
}
三、 Timer1中断LED闪烁
4MHz内部晶振----4分频----8分频----定时器125KHz(8us)----62500次----1次中断500ms ----LED翻转
#include
//根据选项,配置字
__CONFIG(HS&WDTDIS&LVPDIS);
#define V0 RD0 //定义V0为RD0端口
//---------------------------------------
//名称:中断服务程序
//---------------------------------------
void interrupt ISR(void) //PIC单片机的所有中断都是这一个入口
{
if(TMR1IF==1) //需要进一步判断是否是T1中断
{
TMR1H=0x0B; //重置初值
TMR1L=0xE9; //重置初值
TMR1IF=0; //清中断标志位,以备下次中断
//***此处用户自行添加定时器T1中断处理程序***
V0=!V0; //0.5S对V0状态取反,达到了秒闪烁的
//******************************************
}
}
//---------------------------------------
//名称: 主函数
void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
TRISD=0B11111110; //初始化RD7-RD0的输入输出方向
PORTD=0B00000000; //初始化RD7-RD0的数值
//***定时器TMR1初始化***
TMR1CS=0; //1. TMR1时钟源选择内部指令周期时钟(Fosc/4)
T1CKPS0=1; //2. 1:8预分频比,T1CKPS0=1
T1CKPS1=1; // 1:8预分频比,T1CKPS1=1
TMR1H=0x0B; //3. 定时62500×8微秒,置初值为65536-62500+13
TMR1L=0xE9; //定时62500×8微秒,置初值为65536-62500+13=3049=0x0be9
TMR1ON=1; //4. 启动定时器T1
TMR1IF=0; //清除T1的中断标志
TMR1IE=1; //T1中断允许
PEIE=1; //外设中断允许,TMR1属于外设中断范围
//**********************
//***开全局中断设置****
//定时器T1设置了中断允许,此处要开全局中断
GIE=1; //5.开全局中断
//*********************
while(1) //死循环,单片机初始化后,将一直运行这个死循环
{
}
}
四、 Timer2中断LED闪烁
4MHz内部晶振----4分频----16分频----定时器62.5KHz(16us)----250次----1次中断4ms ----125次中断500ms----LED翻转
#include
//根据选项,配置字
__CONFIG(HS&WDTDIS&LVPDIS);
#define V0 RD0 //定义V0为RD0端口
unsigned char q;
//---------------------------------------
//名称:中断服务程序
//---------------------------------------
void interrupt ISR(void) //PIC单片机的所有中断都是这一个入口
{
if(TMR2IF==1) //需要进一步判断是否是T2中断
{
TMR2=0x13; //重置初值
TMR2IF=0; //清中断标志位,以备下次中断
//***此处用户自行添加定时器T2中断处理程序***
if(++q>125) //4000us中断一次,再计次125次后就是500毫秒
{
q=0;
V0=!V0; //0.5S对V0状态取反,达到了秒闪烁的目的
}
//******************************************
}
}
//---------------------------------------
//名称: 主函数
//---------------------------------------
void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
TRISD=0B11111110; //初始化RD7-RD0的输入输出方向
PORTD=0B00000000; //初始化RD7-RD0的数值
//***定时器TMR2初始化***
T2CKPS0=0; //1. 1:16预分频比,T2CKPS0=0或T2CKPS0=1均可
T2CKPS1=1; // 1:16预分频比,T2CKPS1=1
TOUTPS0=0; //1:1后分频比,TOUTPS0=0
TOUTPS1=0; //1:1后分频比,TOUTPS1=0
TOUTPS2=0; //1:1后分频比,TOUTPS2=0
TOUTPS3=0; //1:1后分频比,TOUTPS3=0
TMR2=0x13; //2. 定时250×16×1微秒,置初值为256-250+13
TMR2ON=1; //3. 启动定时器T2
TMR2IF=0; //清除T2的中断标志
TMR2IE=1; //T2中断允许
PEIE=1; //外设中断允许,TMR2属于外设中断范围
//**********************
//***开全局中断设置****
//定时器T2设置了中断允许,此处要开全局中断
GIE=1; //4. 开全局中断
//*********************
while(1) //死循环,单片机初始化后,将一直运行这个死循环
{
}
}
五、 CCP1的PWM功能调光
TRISC=0B11111111; //初始化RC7-RC0的输入输出方向-------(1)
PORTC=0B00000000; //初始化RC7-RC0的数值
//PWM =256*4*(1/4MHz)*1分频=256us--à3906Hz
PR2=0xFF; //装载PR2寄存器设置PWM周期,频率为3906Hz-------(2)
CCP1CON=0x0C; //CCP1模块工作在PWM模式-------(3)
CCPR1L=0xCD; //装载CCPR1L寄存器设置PWM占空比,为80%=0xCD/0xFF
T2CKPS0=0; //定时器TMR2设置1:1预分频比,T2CKPS0=0-------(4)
T2CKPS1=0; //定时器TMR2设置1:1预分频比,T2CKPS1=0
TMR2IF=0; //清零PIR1寄存器中的TMR2IF中断标志位-------(5)
TMR2ON=1; //T2CON寄存器中的TMR2ON位置1使能Timer2
TRISC2=0; //清零TRISC2位,使能CCP1引脚输出驱动器
#include
//根据选项,配置字:
__CONFIG(HS&WDTDIS&LVPDIS);
//---------------------------------------
//名称: 主函数
//---------------------------------------
voidmain(void)
{
unsigned int ycon=0;
unsigned char pwmbuf=0;
TRISC=0B11111111; //初始化RC7-RC0的输入输出方向
PORTC=0B00000000; //初始化RC7-RC0的数值
//***CCP1的PWM功能初始化***
//PWM =256*4*(1/4MHz)*1分频=256us--à3906Hz
PR2=0xFF; //装载PR2寄存器设置PWM周期,频率为3906Hz
CCP1CON=0x0C; //CCP1模块工作在PWM模式
CCPR1L=0xCD; //装载CCPR1L寄存器设置PWM占空比,为80%=0xCD/0xFF
TMR2IF=0; //清零PIR1寄存器中的TMR2IF中断标志位
T2CKPS0=0; //定时器TMR2设置1:1预分频比,T2CKPS0=0
T2CKPS1=0; //定时器TMR2设置1:1预分频比,T2CKPS1=0
TMR2ON=1; //T2CON寄存器中的TMR2ON位置1使能Timer2
TRISC2=0; //清零TRISC2位,使能CCP1引脚输出驱动器
//**************************
while(1)
{
if(++ycon>1000) //延时1000个软件周期,非精确定时
{
ycon=0; //清零以备下次重新计数
pwmbuf++; //占空比加一
CCPR1L=pwmbuf; //写入占空比
}
}
}
六、 CCP2的PWM功能调光
#include
//根据选项,配置字
__CONFIG(HS&WDTDIS&LVPDIS);
//---------------------------------------
//名称: 主函数
//---------------------------------------
voidmain(void)
{
unsigned int ycon=0;
unsigned char pwmbuf=0;
TRISC=0B11111111;//初始化RC7-RC0的输入输出方向
PORTC=0B00000000;//初始化RC7-RC0的数值
//***CCP2的PWM功能初始化***
//PWM =256*4*(1/4MHz)*1分频=256us--à3906Hz
PR2=0xFF; //装载PR2寄存器设置PWM周期,频率为3906Hz
CCP2CON=0x0C;//CCP2模块工作在PWM模式
CCPR2L=0xCD; //装载CCPR2L寄存器设置PWM占空比,为80%
TMR2IF=0; //清零PIR1寄存器中的TMR2IF中断标志位
T2CKPS0=0; //定时器TMR2设置1:1预分频比,T2CKPS0=0
T2CKPS1=0; //定时器TMR2设置1:1预分频比,T2CKPS1=0
TMR2ON=1; //T2CON寄存器中的TMR2ON位置1使能Timer2
TRISC1=0; //清零TRISC1位,使能CCP2引脚输出驱动器
//**************************
while(1)
{
if(++ycon>1000) //延时1000个软件周期,非精确定时
{
ycon=0;//清零以备下次重新计数
pwmbuf++;//占空比加一
CCPR2L=pwmbuf;//写入占空比
}
}
}
七、 UART与LCD
#include
//根据选项,配置字:
__CONFIG(HS&WDTDIS&LVPDIS);
//---------------------------------------
//1602液晶相关I/O设置
#defineE RB3 //1602液晶的E脚接在RB3口上
#defineRW RB4 //1602液晶的RW脚接在RB4口上
#defineRS RB5 //1602液晶的RS脚接在RB5口上
//---------------------------------------
//寄存器设置
unsignedchar USARTbuf; //设置8位的unsigend char型寄存器用来暂存串口接收内容
unsignedchar j; //设置8位的unsigend char型寄存器用来暂存转换数据
bitclrbit;
//---------------------------------------
//---------------------------------------
//名称:1602液晶用延时函数
//---------------------------------------
voidDelay1602(unsigned int t)
{
unsigned int k; //定义一个16位寄存器用来做延时用
for(k=0;k
}
//---------------------------------------
//名称:1602液晶忙检测函数
//---------------------------------------
voidLCD1602_busy(void)
{
TRISD7=1; //将RD7口设置为输入口,为读做准备
RS=0; //RS=0、RW=1、E=1时,忙信号输出到DB7,由RD7读入
RW=1; //RS=0、RW=1、E=1时,忙信号输出到DB7,由RD7读入
E=1; //RS=0、RW=1、E=1时,忙信号输出到DB7,由RD7读入
while(RD7==1); //由RD7读入1,表示1602液晶忙,需要等待
E=0; //读完以后,恢复E的电平
TRISD7=0; //将RD7口设置为输出口
}
//---------------------------------------
//名称:1600写命令函数
//---------------------------------------
voidLCD1602_Write_com(unsigned char combuf)
{
RS=0; //选择指令寄存器
RW=0; //选择写状态
PORTD=combuf; //将命令字通过RD口送至DB
E=1; //E高电平将命令字写入1602液晶
asm("NOP"); //添加一个空操作,使高电平至少维持1us
E=0; //写完以后,恢复E的电平
}
//---------------------------------------
//名称:1602写命令函数(带忙检测)
//---------------------------------------
voidLCD1602_Write_com_busy(unsigned char combuf)
{
LCD1602_busy(); //调用忙检测函数
LCD1602_Write_com(combuf); //调用忙检测函数
}
//---------------------------------------
//名称:1602写数据函数(带忙检测)
//---------------------------------------
voidLCD1602_Write_data_busy(unsigned char databuf)
{
LCD1602_busy(); //调用忙检测函数
RS=1; //选择数据寄存器
RW=0; //选择写状态
PORTD=databuf; //将命令字通过RD口送至DB
E=1; //E高电平将命令字写入1602液晶
asm("NOP"); //添加一个空操作,使高电平至少维持1us
E=0; //写完以后,恢复E的电平
}
//---------------------------------------
//名称:1602液晶显示地址写函数
//---------------------------------------
voidLCD1602_Write_address(unsigned char x,unsigned char y)
{
x&=0x0f; //列地址限制在0-15间
y&=0x01; //行地址限制在0-1间
if(y==0) //如果是第一行
LCD1602_Write_com_busy(x|0x80);//将列地址写入
else //如果是第二行
LCD1602_Write_com_busy((x+0x40)|0x80);//将列地址写入
}
//---------------------------------------
//名称:1602液晶初始化函数
//---------------------------------------
voidLCD1602_init(void)
{
Delay1602(1500); //调用延时函数
LCD1602_Write_com(0x38); //8位数据总线,两行显示模式,5*7点阵显示
Delay1602(500); //调用延时函数
LCD1602_Write_com(0x38); //8位数据总线,两行显示模式,5*7点阵显示
Delay1602(500); //调用延时函数
LCD1602_Write_com(0x38); //8位数据总线,两行显示模式,5*7点阵显示
LCD1602_Write_com_busy(0x38); //8位数据总线,两行显示模式,5*7点阵显示
LCD1602_Write_com_busy(0x08); //显示功能关,无光标
LCD1602_Write_com_busy(0x01); //清屏
LCD1602_Write_com_busy(0x06); //写入新的数据后,光标右移,显示屏不移动
LCD1602_Write_com_busy(0x0C); //显示功能开,无光标
}
//---------------------------------------
//名称:1602液晶指定地址显示函数
//---------------------------------------
voidLCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
{
LCD1602_Write_address(x,y); //先将地址信息写入
LCD1602_Write_data_busy(buf); //再写入要显示的数据
}
//---------------------------------------
//名称: 主函数
//---------------------------------------
voidmain(void) //主函数,单片机开机后就是从这个函数开始运行
{
TRISB=0B11000111; //初始化RB7-RB0的输入输出方向
TRISC=0B11111111; //初始化RC7-RC0的输入输出方向
TRISD=0B00000000; //初始化RD7-RD0的输入输出方向
PORTB=0B00000000; //初始化RB7-RB0的数值
PORTD=0B00000000; //初始化RD7-RD0的数值
LCD1602_init(); //调用1602液晶初始化函数
//*****USART串口初始化*****
SPBRG=25; //设置波特率为9600,误差0.16%
BRGH=1; //设置高速波特率
SYNC=0; //SYNC=0为异步模式,SYNC=1为同步模式
SPEN=1; //允许串口操作
CREN=1; //CREN=0禁止连续接收,CREN=1允许连续接收
TXIE=0; //禁止发送中断
RCIE=0; //禁止接收中断
TX9=0; //TX9=0为8位发送,TX9=1为9位发送
RX9=0; //RX9=0为8位接收,RX9=1为9位接收
TXEN=1; //TXEN=0为禁止发送,TXEN=1为允许发送
//**************************
LCD1602_Disp(0,0,'R'); //在坐标(0,0)处写入R
LCD1602_Disp(1,0,'E'); //在坐标(1,0)处写入e
LCD1602_Disp(2,0,'C'); //在坐标(2,0)处写入c
LCD1602_Disp(3,0,'E'); //在坐标(3,0)处写入e
LCD1602_Disp(4,0,'I'); //在坐标(4,0)处写入i
LCD1602_Disp(5,0,'V'); //在坐标(5,0)处写入v
LCD1602_Disp(6,0,'E'); //在坐标(6,0)处写入e
LCD1602_Disp(8,0,'A'); //在坐标(8,0)处写入a
LCD1602_Disp(10,0,'B'); //在坐标(10,0)处写入b
LCD1602_Disp(11,0,'Y'); //在坐标(11,0)处写入y
LCD1602_Disp(12,0,'T'); //在坐标(12,0)处写入t
LCD1602_Disp(13,0,'E'); //在坐标(13,0)处写入e
LCD1602_Disp(0,1,'B'); //在坐标(0,1)处写入B
LCD1602_Disp(1,1,'A'); //在坐标(1,1)处写入a
LCD1602_Disp(2,1,'U'); //在坐标(2,1)处写入u
LCD1602_Disp(3,1,'D'); //在坐标(3,1)处写入d
LCD1602_Disp(5,1,'R'); //在坐标(5,1)处写入r
LCD1602_Disp(6,1,'A'); //在坐标(6,1)处写入a
LCD1602_Disp(7,1,'T'); //在坐标(7,1)处写入t
LCD1602_Disp(8,1,'E'); //在坐标(8,1)处写入e
LCD1602_Disp(9,1,':'); //在坐标(9,1)处写入:
LCD1602_Disp(10,1,'9'); //在坐标(10,1)处写入9
LCD1602_Disp(11,1,'6'); //在坐标(11,1)处写入6
LCD1602_Disp(12,1,'0'); //在坐标(12,1)处写入0
LCD1602_Disp(13,1,'0'); //在坐标(13,1)处写入0
clrbit=1; //置清屏标志位
while(1)
{
//****查询式串口接收程序****
if(RCIF==1) //如果接收标志位为1,说明有数据接收完毕
{ //RCIF在寄存器被读出后自动清零
USARTbuf=RCREG; //将接收缓冲区内容转至USARTbuf寄存器中
if(OERR==1); //如果有溢出错误
{
CREN=0; //清零CREN位可将OERR位清零
CREN=1; //再次将CREN置一,以允许继续接收
}
TXREG=USARTbuf+1; //将接收到的内容+1后发送出去
while(TRMT==0); //一直等到数据发送完毕,即TRMT=1
if(clrbit) //如果为第一次收到数据启动清屏操作
{
clrbit=0;
LCD1602_init();//调用1602液晶初始化函数,目的清屏
}
LCD1602_Disp(0,0,'R'); //在坐标(0,0)处写入R
LCD1602_Disp(1,0,'E'); //在坐标(1,0)处写入e
LCD1602_Disp(2,0,'C'); //在坐标(2,0)处写入c
LCD1602_Disp(3,0,'E'); //在坐标(3,0)处写入e
LCD1602_Disp(4,0,':'); //在坐标(4,0)处写入:
LCD1602_Disp(6,0,'0'); //在坐标(6,0)处写入0
LCD1602_Disp(7,0,'X'); //在坐标(7,0)处写入x
j=USARTbuf>>4; //把要显示内容的高4位移到低4位上
if(j<10) //0-F在ASCII码中并不连续,所以要分开处理
{
j+='0'; //0-9的数据以0为基点进行偏移即可
}
else
{
j-=10;
j+='A'; //A-F的数据以A为基点进行偏移即可
}
LCD1602_Disp(8,0,j); //在坐标(8,0)处写入该数据
j=USARTbuf&0x0f; //把要显示内容的高4位移到低4位上
if(j<10) //0-F在ASCII码中并不连续,所以要分开处理
{
j+='0'; //0-9的数据以0为基点进行偏移即可
}
else
{
j-=10;
j+='A'; //A-F的数据以A为基点进行偏移即可
}
LCD1602_Disp(9,0,j); //在坐标(9,0)处写入该数据
USARTbuf+=1; //做一次加一动作
LCD1602_Disp(0,1,'S'); //在坐标(0,1)处写入S
LCD1602_Disp(1,1,'E'); //在坐标(1,1)处写入e
LCD1602_Disp(2,1,'N'); //在坐标(2,1)处写入n
LCD1602_Disp(3,1,'D'); //在坐标(3,1)处写入d
LCD1602_Disp(4,1,':'); //在坐标(4,1)处写入:
LCD1602_Disp(6,1,'0'); //在坐标(6,1)处写入0
LCD1602_Disp(7,1,'X'); //在坐标(7,1)处写入x
j=USARTbuf>>4; //发送的数据高4位放入BUF
if(j<10) //0-F在ASCII码中并不连续,所以要分开处理
{
j+='0'; //0-9的数据以0为基点进行偏移即可
}
else
{
j-=10;
j+='A'; //A-F的数据以A为基点进行偏移即可
}
LCD1602_Disp(8,1,j); //在坐标(8,1)处写入该数据
j=USARTbuf&0x0f; //发送的数据低4位放入BUF
if(j<10) //0-F在ASCII码中并不连续,所以要分开处理
{
j+='0'; //0-9的数据以0为基点进行偏移即可
}
else
{
j-=10;
j+='A'; //A-F的数据以A为基点进行偏移即可
}
LCD1602_Disp(9,1,j); //在坐标(9,1)处写入该数据
}
}
}
八、 外部中断
#include
//根据选项,配置字:
__CONFIG(HS&WDTDIS&LVPDIS);
//7 6 5 4 3 2 1 0
//v7 v6 v5v4 v3 v2 v1 v0
constunsigned char liushui[64]=
{
0B00000001, //0
0B00000010,
0B00000100,
0B00001000,
0B00010000,
0B00100000,
0B01000000,
0B10000000,
0B11000000,
0B11100000,
0B11110000, //10
0B11111000,
0B11111100,
0B11111110,
0B11111111,
0B11111110,
0B11111100,
0B11111000,
0B11110000,
0B11100000,
0B11000000, //20
0B10000000,
0B10000000,
0B01000000,
0B00100000,
0B00010000,
0B00001000,
0B00000100,
0B00000010,
0B00000001,
0B00000010, //30
0B00000100,
0B00001000,
0B00010000,
0B00100000,
0B01000000,
0B10000000,
0B01000000,
0B00100000,
0B00010000,
0B00001000, //40
0B00000100,
0B00000010,
0B00000001,
0B00000011,
0B00000110,
0B00001100,
0B00011000,
0B00110000,
0B01100000,
0B11000000, //50
0B00000000,
0B00000001,
0B00000101,
0B00010101,
0B01010101,
0B01010111,
0B01011111,
0B01111111,
0B11111111,
0B00000000, //60
0B10101010,
0B01010101,
0B00000000, //63
};
unsignedint a=0;
unsignedchar b=0;
//---------------------------------------
//名称:中断服务程序
//---------------------------------------
voidinterrupt ISR(void) //PIC单片机的所有中断都是这一个入口
{
if(INTF==1)//需要进一步判断是否是INT中断
{
INTF=0;//清中断标志位,以备下次中断
//***此处用户自行添加INT外部中断处理程序***
b=0;//中断后清零,使流水从头开始
//******************************************
}
}
//---------------------------------------
//名称: 主函数
//---------------------------------------
voidmain(void) //主函数,单片机开机后就是从这个函数开始运行
{
TRISB=0B11111111;//初始化RB7-RB0的输入输出方向
PORTB=0B00000000;//初始化RB7-RB0的数值
TRISD=0B00000000;//初始化RD7-RD0的输入输出方向
PORTD=0B00000000;//初始化RD7-RD0的数值
//***外部中断RB0/INT初始化***
INTEDG=1; //设置RB0/INT为上升沿触发
INTF=0; //清除RB0/INT的中断标志
INTE=1; //设置RB0/INT中断允许
//***************************
//***开全局中断设置****
//外部中断RB0/INT设置了中断允许,此处要开全局中断
GIE=1; //开全局中断
//外部中断RB0/INT设置了中断允许,此处要允许所有未被屏蔽的外设中断
PEIE=1; //允许外设中断
//*********************
while(1)
{
if(++a>10000) //延时10000个软件周期,非精确定时
{
a=0; //清零以备下次重新计数
b++; //步骤参数加1,以进一步
b&=0x3f;//因为我们定义的表格长度为64,所以这里需要限制步骤参数在0-63间
PORTD=liushui[b];//根据步骤参数查表格,将查出的参数放入临时缓冲寄存器中
}
}
}