我使用PIC16F877A我爱单片机机,我要...

开发板型号:给力者 GL7
/s/1sjQ8jU1
一、&&点亮LED
#include &pic.h& //调用PIC16F87XA单片机的头文件
//根据选项,配置字应该如下所示:
//实际使用中,这样太麻烦,对于默认选项,我们将其忽略掉:
//__CONFIG(HS&WRTEN&WDTDIS&BOREN&PWRTDIS&UNPROTECT&DUNPROT&DEBUGDIS&LVPDIS);
//HS 外部高频振荡(外部晶振频率超过4M用此方式)
//WDTDIS 看门狗关闭。DIS可以看成disable的缩写
//LVPDIS 低压编程方式关闭。
__CONFIG(HS&WDTDIS&LVPDIS);
//---------------------------------------
//---------------------------------------
void main(void) &&&&&&&&&&&//主函数,单片机开机后就是从这个函数开始运行
&&& TRISD=0B;&&&&& //初始化RD7-RD0的输入输出方向:RD0定义为输出
&&& PORTD=0B;&&&& //初始化RD7-RD0的数值:RD0输出高电平
&&& while(1)&&&&&&&&&&&&&& //死循环,单片机初始化后,将一直运行这个死循环
二、&&Timer0中断LED闪烁
4MHz内部晶振----4分频----8分频----定时器125KHz(8us)----250次----2000us----250次中断----500msLED翻转
#include &pic.h&&&&&&&&&&&//调用PIC16F87XA单片机的头文件
//根据选项,配置字
__CONFIG(HS&WDTDIS&LVPDIS);
#define V0 RD0&&& &&&&&&& //定义V0为RD0端口
//---------------------------------------
//名称:中断服务程序
//---------------------------------------
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=0B;&&&&& &//RD0定义为输出
&&& PORTD=0B;&&&&& //初始化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 &pic.h&&&&&&&&&&&//调用PIC16F87XA单片机的头文件
//根据选项,配置字
__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=0B;&&&&& //初始化RD7-RD0的输入输出方向
&&& PORTD=0B;&&&&& //初始化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微秒,置初值为+13
&&& TMR1L=0xE9;&&&&&&&&&& //定时62500×8微秒,置初值为+13=be9
&&& 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 &pic.h&&&&&&&&&&&//调用PIC16F87XA单片机的头文件
//根据选项,配置字
__CONFIG(HS&WDTDIS&LVPDIS);
#define V0 RD0&&& &&&&&&& //定义V0为RD0端口
//---------------------------------------
//名称:中断服务程序
//---------------------------------------
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=0B;&&&&& //初始化RD7-RD0的输入输出方向
&&& PORTD=0B;&&&&& //初始化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=0B;&&&&& //初始化RC7-RC0的输入输出方向-------(1)
&&& PORTC=0B;&&&& //初始化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&pic.h&&&&&&&&&&& //调用PIC16F87XA单片机的头文件
//根据选项,配置字:
__CONFIG(HS&WDTDIS&LVPDIS);
//---------------------------------------
//---------------------------------------
voidmain(void)
&&& unsigned int ycon=0;
&&& unsigned char pwmbuf=0;
&&& TRISC=0B;&&&&& //初始化RC7-RC0的输入输出方向
&&& PORTC=0B;&&&&& //初始化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=& //写入占空比
六、&&CCP2的PWM功能调光
#include&pic.h&&&&&&&&&&& //调用PIC16F87XA单片机的头文件
//根据选项,配置字
__CONFIG(HS&WDTDIS&LVPDIS);
//---------------------------------------
//---------------------------------------
voidmain(void)
&&& unsigned int ycon=0;
&&& unsigned char pwmbuf=0;
&&& TRISC=0B;//初始化RC7-RC0的输入输出方向
&&& PORTC=0B;//初始化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=//写入占空比
&& &&&&&&&&&& }
七、&&UART与LCD
#include&pic.h&&&&&&&&&&& //调用PIC16F87XA单片机的头文件
//根据选项,配置字:
__CONFIG(HS&WDTDIS&LVPDIS);
//---------------------------------------
//1602液晶相关I/O设置
#defineE&& RB3&&&&&&&&&&& //1602液晶的E脚接在RB3口上
#defineRW& RB4&&&&&&&&&&& //1602液晶的RW脚接在RB4口上
#defineRS& RB5&&&&&&&&&&& //1602液晶的RS脚接在RB5口上
//---------------------------------------
//寄存器设置
unsignedchar USART&& //设置8位的unsigend
char型寄存器用来暂存串口接收内容
&&&&&&&&& //设置8位的unsigend
char型寄存器用来暂存转换数据
//---------------------------------------
//---------------------------------------
//名称:1602液晶用延时函数
//---------------------------------------
voidDelay1602(unsigned int t)
&&&&&&&&& //定义一个16位寄存器用来做延时用
&&&& for(k=0;k&t;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=&&&&&&& //将命令字通过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=&&&&&& //将命令字通过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)
&&&& Delay);&&&&&&&&& //调用延时函数
&&&& LCD1602_Write_com(0x38);& //8位数据总线,两行显示模式,5*7点阵显示
&&&& Delay);&&&&&&&&&& //调用延时函数
&&&& LCD1602_Write_com(0x38);& //8位数据总线,两行显示模式,5*7点阵显示
&&&& Delay);&&&&&&&&&& //调用延时函数
&&&& 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=0B;&&&&& //初始化RB7-RB0的输入输出方向
&&& TRISC=0B;&&&&& //初始化RC7-RC0的输入输出方向
&&& TRISD=0B;&&&&& //初始化RD7-RD0的输入输出方向
&&& PORTB=0B;&&&&& //初始化RB7-RB0的数值&&&
&&& PORTD=0B;&&&&& //初始化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&pic.h&&&&&&&&&&& //调用PIC16F87XA单片机的头文件
//根据选项,配置字:
__CONFIG(HS&WDTDIS&LVPDIS);
//7& 6&5& 4& 3&2& 1& 0
//v7 v6 v5v4 v3 v2 v1 v0
constunsigned char liushui[64]=
0B,&& //10
0B,&& //20
unsignedint a=0;
unsignedchar b=0;
//---------------------------------------
//名称:中断服务程序
//---------------------------------------
voidinterrupt ISR(void)&& //PIC单片机的所有中断都是这一个入口
&&& if(INTF==1)//需要进一步判断是否是INT中断
&&&&&&& INTF=0;//清中断标志位,以备下次中断
&&& //***此处用户自行添加INT外部中断处理程序***
&&& &&&&&&b=0;//中断后清零,使流水从头开始
&&&//******************************************
//---------------------------------------
//---------------------------------------
voidmain(void)&&&&&&&&&&& //主函数,单片机开机后就是从这个函数开始运行
&&& TRISB=0B;//初始化RB7-RB0的输入输出方向
&&& PORTB=0B;//初始化RB7-RB0的数值
&&& TRISD=0B;//初始化RD7-RD0的输入输出方向
&&& PORTD=0B;//初始化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];//根据步骤参数查表格,将查出的参数放入临时缓冲寄存器中
&& &&&&&&&&&& }
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4316次
排名:千里之外

我要回帖

更多关于 我爱单片机 的文章

 

随机推荐