[学习资料]

PIC16F877A应用笔记(转)

[复制链接]
1201|22
手机看帖
扫描二维码
随时随地手机跟帖
zljiu|  楼主 | 2019-6-21 13:12 | 显示全部楼层 |阅读模式
开发板型号:给力者 GL7


一、  点亮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);


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:33 | 显示全部楼层
//---------------------------------------

//名称: 主函数

//---------------------------------------

void main(void)            //主函数,单片机开机后就是从这个函数开始运行

{

    TRISD=0B11111110;      //初始化RD7-RD0的输入输出方向:RD0定义为输出

    PORTD=0B00000001;     //初始化RD7-RD0的数值:RD0输出高电平

    while(1)               //死循环,单片机初始化后,将一直运行这个死循环

    {

    }

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:34 | 显示全部楼层
二、  Timer0中断LED闪烁


4MHz内部晶振----4分频----8分频----定时器125KHz(8us)----250次----2000us----250次中断----500msLED翻转




#include <pic.h>          //调用PIC16F87XA单片机的头文件



//根据选项,配置字

__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状态取反,达到了秒闪烁的目的

                   }

    }

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:35 | 显示全部楼层
//---------------------------------------

//主函数

//---------------------------------------

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)//死循环,单片机初始化后,将一直运行这个死循环

    {

    }

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:58 | 显示全部楼层
三、  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状态取反,达到了秒闪烁的

   //******************************************

    }

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:59 | 显示全部楼层
//---------------------------------------

//名称: 主函数

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)               //死循环,单片机初始化后,将一直运行这个死循环

    {



    }

}



使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:59 | 显示全部楼层
四、  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端口

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状态取反,达到了秒闪烁的目的

                   }

   //******************************************

    }

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:00 | 显示全部楼层
//---------------------------------------

//名称: 主函数

//---------------------------------------

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)               //死循环,单片机初始化后,将一直运行这个死循环

    {

    }

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:00 | 显示全部楼层
五、  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<pic.h>           //调用PIC16F87XA单片机的头文件



//根据选项,配置字:

__CONFIG(HS&WDTDIS&LVPDIS);


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:01 | 显示全部楼层
//---------------------------------------

//名称: 主函数

//---------------------------------------

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;  //写入占空比

        }

    }

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:01 | 显示全部楼层
六、  CCP2的PWM功能调光



#include<pic.h>           //调用PIC16F87XA单片机的头文件

//根据选项,配置字

__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;//写入占空比

              }

    }

}

使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:01 | 显示全部楼层
七、  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 USARTbuf;   //设置8位的unsigend char型寄存器用来暂存串口接收内容

unsignedchar j;          //设置8位的unsigend char型寄存器用来暂存转换数据

bitclrbit;

//---------------------------------------



//---------------------------------------

//名称:1602液晶用延时函数

//---------------------------------------

voidDelay1602(unsigned int t)

{

     unsigned int k;      //定义一个16位寄存器用来做延时用

     for(k=0;k<t;k++);    //延时

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:02 | 显示全部楼层
//---------------------------------------

//名称: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口设置为输出口

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:03 | 显示全部楼层
//---------------------------------------

//名称: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的电平

}



使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:03 | 显示全部楼层
//---------------------------------------

//名称:1602写命令函数(带忙检测)

//---------------------------------------

voidLCD1602_Write_com_busy(unsigned char combuf)

{

     LCD1602_busy();            //调用忙检测函数

     LCD1602_Write_com(combuf); //调用忙检测函数

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:03 | 显示全部楼层
//---------------------------------------

//名称: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的电平

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:04 | 显示全部楼层
//---------------------------------------

//名称: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);//将列地址写入

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:04 | 显示全部楼层
//---------------------------------------

//名称: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);  //显示功能开,无光标

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:05 | 显示全部楼层
//---------------------------------------

//名称:1602液晶指定地址显示函数

//---------------------------------------

voidLCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)

{

     LCD1602_Write_address(x,y);    //先将地址信息写入

     LCD1602_Write_data_busy(buf);  //再写入要显示的数据

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:05 | 显示全部楼层
//---------------------------------------

//名称: 主函数

//---------------------------------------

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)处写入该数据

        }

    }

}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

3319

帖子

3

粉丝