3881|4

27

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

1602在PIC16F914单片机上显示问题搞定了,谢谢大家 [复制链接]

嘿嘿,搞定了,原来IO口需要这样配置(原先我咨询了Microchip上海技术支持,一女的说不用段式LCD功能,就不用管COMCON0和LCDCON,搞的我.......看来,还是要自己细心才行啊),同志们,不要犯我这样的错误哦,嘿嘿,谢谢各位的指导啊。
/*-----------1602端口初始化-------------*/
void Port_1602_Init(void)
{
    PORTA=0x00;
        CMCON0=0xff;
    ANSEL = 0x00;
    TRISA=0X00;
   
    PORTC=0x00;
    TRISC=0x00;
    LCDCON=0x00;
}

 

完整程序如下:

main.c如下:

#include <htc.h>
#include "Display.h"
#include "main.h"

#define uchar unsigned char
#define uint  unsigned int

__CONFIG(WDTDIS & HS & PWRTDIS & BORDIS);//设置配置位
 
/************************定义显示字符*****************************************/
uchar Wel[]  = {"Welcome To"};
uchar tab[]  = {"Bei Jing"};

/*******************************************************************************
* 函 数 名: Delay_US(uint8 delay)
* 函数功能: 微秒延时--12us 
* 入口参数: delay
* 返    回: 无
*******************************************************************************/
void Delay_US(uint delay)   
{
   for(;delay;)
   {
      delay--;
   }
}

/*******************************************************************************
* 函 数 名: Delay_MS(uint16 delay)
* 函数功能: 毫秒延时--1ms 
* 入口参数: delay
* 返    回: 无
*******************************************************************************/
void Delay_Ms(uint delay) 
{
   uint i;
   for(i=0;i<delay;i++)
       Delay_US(83);
}

/*******************************************************************************
* 函 数 名: Delay_Sec(uint16 delay)
* 函数功能: 毫秒延时--1ms 
* 入口参数: delay
* 返    回: 无
*******************************************************************************/
void Delay_Sec(uint delay)
{
   uint i,j;
   for(i=0;i<20*delay;i++)
   {
       for(j=0;j<4536;j++);
   }   
}

/******************************************************************************
* 函 数 名: main()
* 函数功能: LCD显示字符
* 入口参数: 无
* 返    回: 无
*******************************************************************************/

void main()

 Port_1602_Init();
 INIT_1602();
 Display_1602_string(3,0,10,Wel);
 Display_1602_string(4,1,8,tab);
 
 while(1)
 {
 } 
}

 

main.h如下:


#ifndef     __MAIN_H__
#define     __MAIN_H__

#define uchar unsigned char
#define uint  unsigned int

#define  LCD_RS  RA0
#define  LCD_RW  RA1
#define  LCD_EN      RA2

void Delay_US(uint delay);           //12微秒延时
void Delay_Ms(uint delay);           //1毫秒延时
void Delay_Sec(uint delay);          //1秒延时


#endif


Display.c如下:

 

#include <htc.h>
#include "Display.h"
#include "main.h"
/*******************************************************************************
* 函 数 名: uchar Chk_1602_busy(void)
* 函数功能: 读液晶忙通道数据
* 入口参数: 无
* 返    回: 无
*******************************************************************************/
uchar Chk_1602_busy(void)
{
   uint gR_data;
   uint gwait_time=0xff;     //设置忙超时数

   LCD_RS=0;                 //表示状态
   LCD_RW=1;                 //选择读
   LCD_EN=1;
   TRISC = 0xFF;             //接收口设为输入口
   Delay_US(30);
   gR_data=PORTC;

   while(TESTBIT(gR_data,7))  //表示busy
   {
      --gwait_time;
      if(!gwait_time)
      { LCD_EN=0;TRISC = 0x00; return 0; }
   }

    LCD_EN=0;
    TRISC = 0x00;   //恢复为输出口
    return 1;
}

/******************************************************************************
* 函 数 名: void Write_1602_command(uchar gcmd,uchar gvalue)
* 函数功能: 写指令
* 入口参数: gcmd--指令  gvalue--是否查忙
* 返    回: 无
*******************************************************************************/

void Write_1602_command(uchar gcmd,uchar gvalue)
{
   if(gvalue)             //写命令时大部分情况下是在LCD空闲模式下写
   {
      if(Chk_1602_busy())
      {
         LCD_RS=0;         //选择指令
         LCD_RW=0;         //选择写
         PORTC=gcmd;       //赋指令
         LCD_EN=1;         //使能
         Delay_US(30);
         LCD_EN=0;
      }
   }

   else
   {
      LCD_RS=0;         //选择指令
      LCD_RW=0;         //选择写
      PORTC=gcmd;       //赋指令
      LCD_EN=1;         //使能
      Delay_US(30);
      LCD_EN=0;
   }
}

/******************************************************************************
* 函 数 名: void Write_1602_data(uchar gdata)
* 函数功能: 写数据
* 入口参数: gdata--数据
* 返    回: 无
*******************************************************************************/

/*----------- 写数据 -------------*/
void Write_1602_data(uchar gdata)
{
   if(Chk_1602_busy())     //写数据必须是在LCD空闲模式下才能写
   {
      LCD_RS=1;             //选择数据
      LCD_RW=0;             //选择写
      PORTC=gdata;
      LCD_EN=1;             //使能
      Delay_US(30);
      LCD_EN=0;
      Delay_US(10);
   }
}

/******************************************************************************
* 函 数 名: void INIT_1602(void)
* 函数功能: 初始化1602LCD
* 入口参数: 无
* 返    回: 无
*******************************************************************************/

/*-----------1602初始化函数-------------*/
void INIT_1602(void)
{
   Delay_Ms(15);
   Write_1602_command(0x38,0);  //设置16X2显示,5X7点阵,8位数据传送,不检测忙信号
   Delay_Ms(5);
   Write_1602_command(0x38,0);
   Delay_Ms(5);
   Write_1602_command(0x38,0);  //设置16X2显示,5X7点阵,8位数据传送,不检测忙信号
   Write_1602_command(0x38,1);  //设置16X2显示,5X7点阵,8位数据传送,检测忙信号
   Write_1602_command(0x08,1);  //关闭显示、无光标、检测忙信号
   Write_1602_command(0x01,1);  //清屏、光标归位、AC=0、检测忙信号
   Write_1602_command(0x06,1);  //显示光标右移位置、检测忙信号
   Write_1602_command(0x0c,1);  //显示功能开、无光标

}


/******************************************************************************
* 函 数 名: void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata)
* 函数功能: 显示字符串
* 入口参数: gadd_start-列号,uchar gline-行号,glength-数据长度,pdata-数组元素
* 返    回: 无
*******************************************************************************/
/*-----------显示字符串-------------*/
//                                列号           行号       数据长度     数组元素
void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata)
{
   uchar gaddress;
   uchar *pdat;
   uchar gcount=0;

   if(!gline)                          //第0行
   { gaddress=0x80+gadd_start; }      //地址对应
   else
   { gaddress=0xc0+gadd_start; }      //第一行

   for(;gcount<glength;gcount++)
   {
      Write_1602_command(gaddress,1);        //设定数据地址
      Write_1602_data(*pdata);  //取设定地址里的数据
      gaddress++;
      pdata++;
   }
}

 

 

/******************************************************************************
* 函 数 名: void Display_1602(uchar x,uchar y,uchar gdata)
* 函数功能: 指定位置显示字符
* 入口参数: x-起始地址横坐标,y-起始地址纵坐标,gdata-要显示的字符
* 返    回: 无
*******************************************************************************/

/*-----------指定位置显示字符-------------*/
void DispChar_XY_1602(uchar x,uchar y,uchar gdata)
{
   uchar gaddress;

   if(!y)
   { gaddress=0x80+x; }

   else
   { gaddress=0xc0+x; }

   Write_1602_command(gaddress,1);   //设定数据地址
   Write_1602_data(gdata);
}

/*-----------指定位置显示数字-------------*/
void DispNum_XY_1602(uchar x,uchar y,uchar gdata)
{
   uchar gaddress;

   if(!y)
   { gaddress=0x80+x; }

   else
   { gaddress=0xc0+x; }

   Write_1602_command(gaddress,1);   //设定数据地址
   Write_1602_data(gdata+0x30);
}

/*-----------清屏-------------*/
void Clear_Display(void)
{
  Write_1602_command(0x01,1);
  Delay_Ms(5);
}

void Open_Disp(void)
{
 Write_1602_command(0x0c,1);
}

void Close_Disp(void)
{
 Write_1602_command(0x08,1);
}

/*-----------显示光标-------------*/
void Display_Cursor(void)
{
  Write_1602_command(0x06,1);  //显示光标右移位置、检测忙信号
  Write_1602_command(0x0D,1);  //显示功能开、无光标

}

/*-----------1602端口初始化-------------*/
void Port_1602_Init(void)
{
    PORTA=0x00;
 CMCON0=0xff;
    ANSEL = 0x00;
    TRISA=0X00;
   
    PORTC=0x00;
    TRISC=0x00;
    LCDCON=0x00;
}

Display.h如下:

#ifndef     __Display_H__
#define     __Display_H__

#define     uchar unsigned char
#define     uint unsigned int

#define TESTBIT(a,b) ((a)&(1<<(b)))

#define  LCD_RS  RA0
#define  LCD_RW  RA1
#define  LCD_EN      RA2


/************************声明函数*********************************************/
uchar Chk_1602_busy(void);
void Write_1602_command(uchar gcmd,uchar gvalue);
void Write_1602_data(uchar gdata);
void INIT_1602(void);
void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata);

void DispChar_XY_1602(uchar x,uchar y,uchar gdata);
void DispNum_XY_1602(uchar x,uchar y,uchar gdata);

void Clear_Display(void);

void Open_Disp(void);
void Close_Disp(void);

void Display_Cursor(void);
void Port_1602_Init(void);

#endif

 

 

最新回复

对  要是都跟你这样  那就好了  详情 回复 发表于 2012-5-1 15:45
点赞 关注
 

回复
举报

2万

帖子

74

TA的资源

管理员

沙发
 

回复 楼主 544852010 的帖子

哈 谢谢分享
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
mark  学习了!
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 楼主 544852010 的帖子

对  要是都跟你这样  那就好了
 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

5
 

嘿嘿,大家加油啊

嘿嘿,大家加油啊
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表