搜索
bottom↓
回复: 22

求助:PIC16F1937段式LCD程序

[复制链接]

出0入0汤圆

发表于 2011-8-24 16:30:07 | 显示全部楼层 |阅读模式
如题,在做PIC16F1937段式LCD程序时,不知道怎么回事段式LCD一直点不亮,还请高手帮帮忙,谢谢!

SEG0~SEG9 COM0~COM3
代码如下:
#include <pic16f1937.h>
//-------------------------------------------------------------------------------//
//函数名:Init_Port                                                                                                                            //
//功能:初始化I/O口                                                                                                                    //
//------------------------------------------------------------------------------//
void Init_Port(void)
{
       
        TRISA = 0x00;
        TRISB = 0x00;                       
        TRISC = 0x00;                               
        TRISD = 0x00;                                       
        TRISE = 0x00;       
        //////////////
        PORTA = 0x00;
        PORTB = 0x00;
        PORTC = 0x00;
        PORTD = 0x00;
        PORTE = 0x00;
}

//-------------------------------------------------------------------------------//
//函数名:lcd_init                                                                    //
//功能:lcd初始化                                                                    //
//------------------------------------------------------------------------------//
void lcd_init(void)
{
LCDCON=0b10011111;//
//|||||||+---LMUX0
//||||||+----LMUX1 11--1/4
//|||||+-----CS0 00=FOSC/8192,01 = T1OSC (Timer1) /32,
//||||+-----CS1 1x=LFINTOSC(31 kHz) /32
//|||+------VLCDEN
//||+-------WERR
//|+--------#SLPEN
//+---------LCDEN
LCDPS=0b00110000;//
//|||||||+---LP0 1111 = 1:16
//||||||+----LP1  
//|||||+-----LP2
//||||+-----LP3 0000=1:1  
//|||+------WA 1 = 允许写入LCDDATAx 寄存器
//||+-------LCDA 1 = 使能LCD 驱动模块
//|+--------BIASMD当LMUX<1:0>=11时:0=1/3偏置模式(不要将该位置1)
//+---------WFT 1在每一帧边界改变相位0在每一公共端类型内改变相位
//LCDREF=0B11101110;
//
LCDSE0=0b11111111;
LCDSE1=0b00000011;//LCD引脚使能寄存器,SEG0~SEG9
}

//-------------------------------------------------------------------------------//
//函数名:main                                                                                                                            //
//功能:主程序入口函数                                                                                            //
//------------------------------------------------------------------------------//
void main(void)
{
unsigned char i;
INTCON=0;//关闭总中断,禁止外设,timer0,外部,电平中断,清除timer0,外部,电平中断标志
ANSELA =0x00;
ANSELB =0x00;
//ANSELC =0x00;
ANSELD =0x00;
ANSELE =0x00;

Init_Port();
lcd_init();

LCDDATA0=0xfc;
LCDDATA3=0xfc;
LCDDATA6=0xfc;
LCDDATA9=0xfc;

while(1)
        {
        LCDDATA0 = 0XFF;
        DelayMs(500);       
        LCDDATA0 = 0X00;
        DelayMs(500);
        }

}

出0入0汤圆

发表于 2011-8-24 17:03:58 | 显示全部楼层
做个显示表出来啊,SEGxCOMx

出0入0汤圆

发表于 2011-8-24 21:32:06 | 显示全部楼层
动辄就说程序什么的,其实最常见的还是硬件接法有问题。4个COM连接对了吗?3个VLCD电压对了吗?segx连接了几个?lcd的电压是5v?是不是把lcd的引脚顺序弄反了?

最好找成熟的程序实例,边改边试。

出0入0汤圆

发表于 2011-8-24 22:02:19 | 显示全部楼层
不接LCD,直接用示波器测一下com的波形看看对不对

出0入0汤圆

 楼主| 发表于 2011-8-24 22:18:31 | 显示全部楼层
谁有这方面的例子,我现在找不到这样的例子,能不能共享一个给我,谢谢!

出0入0汤圆

发表于 2011-8-25 13:10:52 | 显示全部楼层
pic16f914的,借鉴吧。这是我买的一个段式LCD开发板的测试程序。焊接好后一运行就全点燃了。

#include <pic.h>
#include <htc.h>
//#include <pic16f914.h>

__CONFIG(XT&WDTEN);


void init(void)
{
         

    CMCON0 = 0b00000111;   //COMPARATOR OFF
    ADCON0 = 0b00000000;   //ADC off

   // TRISA = 0b00000000;               
   // TRISB = 0b00000000;
   // TRISC = 0b00000000;
   // TRISD = 0b00000000;
   // TRISE = 0b00000000;    //数据方向寄存器
  
          OSCCON = 0b00001010;   //系统时钟由CONFIG决定
    /*         |||||||+---1 = 内部振荡器用作系统时钟 0 = 时钟源由配置字寄存器中的FOSC<2:0> 定义
               ||||||+----LTS = LFINTOSC稳定 0 = LFINTOSC不稳定
               |||||+-----HTS  1 = HFINTOSC稳定,0 = HFINTOSC不稳定,
               ||||+----- OSTS 1 = 器件使用由配置字寄存器中的FOSC<2:0> 定义的外部时钟源
               |||+------ IRCF
               ||+------- IRCF
               |+-------- IRCF
               +--------- IRCF 内部振荡器频率选择位
    */
          ANSEL=0;              //引脚被分配为数字IO,非模拟输入

           PORTA=0x00;
          PORTB=0x00;
          PORTC=0x00;  
          PORTD=0x00;
          PORTE=0x00;                  
          //RBIE=0;                    
}

void lcd_init(void)
{
          LCDCON = 0b10011111; //
    /*         |||||||+---LMUX0
               ||||||+----LMUX1 11--1/4
               |||||+-----CS0 00 = FOSC/8192,01 = T1OSC (Timer1) /32,
               ||||+----- CS1 1x = LFINTOSC (31 kHz) /32
               |||+------ VLCDEN
               ||+------- WERR
               |+-------- #SLPEN
               +--------- LCDEN
    */
    LCDPS = 0b00110000; //
    /*        |||||||+---LP0    1111 = 1:16
              ||||||+----LP1
              |||||+-----LP2
              ||||+----- LP3    0000 = 1:1
              |||+------ WA     1 = 允许写入LCDDATAx 寄存器
              ||+------- LCDA   1 = 使能LCD 驱动模块
              |+-------- BIASMD 当LMUX<1:0> = 11 时:0 = 1/3 偏置模式(不要将该位置1)
              +--------- WFT    1 在每一帧边界改变相位0在每一公共端类型内改变相位
    */

    LCDSE0  = 0b11111111;
    LCDSE1  = 0b00111111; //LCD 引脚使能寄存器  
}


void main(void)
{       
          init();
    lcd_init();
   
    LCDDATA0=0xff;
    LCDDATA1=0xff;
    LCDDATA2=0xff;
    LCDDATA3=0xff;
    LCDDATA4=0xff;
    LCDDATA5=0xff;
    LCDDATA6=0xff;
    LCDDATA7=0xff;
    LCDDATA8=0xff;
    LCDDATA9=0xff;
    LCDDATA10=0xff;
    LCDDATA11=0xff;
}

出0入0汤圆

 楼主| 发表于 2011-8-25 16:19:39 | 显示全部楼层
还是不行啊,编译过程中提示:
__CONFIG(XT&WDTEN);
&#160;CMCON0&#160;=&#160;0b00000111;&#160;&#160;&#160;//COMPARATOR&#160;OFF
ANSEL=0;&#160;&#160;        &#160;&#160;&#160;&#160;//引脚被分配为数字IO,非模拟输入

这几条语句是错误的,将其屏蔽就没有错误提示,编译通过,可以下载程序,还是点不亮lcd,郁闷。。。。

出0入0汤圆

发表于 2011-8-25 23:29:33 | 显示全部楼层
回复【6楼】Nemo_stm32  
-----------------------------------------------------------------------

lz,我贴的是我的914平台上的程序,换了你的平台,有些设置当然要改,比如你那里可能就没有ANSEL这个寄存器。
你怎么能期待象出锅的馒头一样,拿来就啃?单片机开发若都这样啃馒头,恐怕现在什么都做不出来吧?

出0入0汤圆

发表于 2011-8-25 23:35:46 | 显示全部楼层
"你怎么能期待象出锅的馒头一样,拿来就啃?"

well said.

sometimes, people are too stupid to help themselves.

出0入0汤圆

发表于 2011-8-26 15:29:43 | 显示全部楼层
"为什么我写了段这样的程序都不能实现我的功能: "

because you fail to read the datasheet and understand it before writing your code.

if that's what you are capable of, you are months away from being able to run the lcd.

出0入0汤圆

 楼主| 发表于 2011-8-26 21:42:58 | 显示全部楼层
哎,人笨没办法,手册都看了好几遍了,还是不能解决实际问题啊

出0入0汤圆

发表于 2011-8-26 22:57:15 | 显示全部楼层
回复【11楼】Nemo_stm32  
-----------------------------------------------------------------------
还是先检查硬件吧。请看我的硬件连接图。要仔细检查每个点的连通情形。



(原文件名:lcd drive110825.jpg)

出0入0汤圆

 楼主| 发表于 2011-8-27 19:14:27 | 显示全部楼层
回复【12楼】surf_131  
-----------------------------------------------------------------------

谢谢“surf_131”,问题终于找到了,原来工程师将pcb板的VLCD1~3没有用电阻分压,而用作按键端口输入,刚开始接触就遇到这样的问题,真够折磨人的,总算解决了,谢谢各位解答和提醒,谢谢!

出0入0汤圆

 楼主| 发表于 2011-8-27 19:18:33 | 显示全部楼层
将调试好的程序奉上,为以后遇到这样的问题人,可以提供一些帮助。

代码如下:
#include&#160;<pic16f1937.h>
//-------------------------------------------------------------------------------//
//函数名:Init_Port         &#160;&#160;&#160;&#160;         //
//功能:初始化I/O口         &#160;&#160;&#160;&#160;         //
//------------------------------------------------------------------------------//
void&#160;Init_Port(void)
{

TRISA&#160;=&#160;0x00;
TRISB&#160;=&#160;0x00;       
TRISC&#160;=&#160;0x00;       
TRISD&#160;=&#160;0x00;       
TRISE&#160;=&#160;0x00;       
//////////////
PORTA&#160;=&#160;0x00;&#160;
PORTB&#160;=&#160;0x00;
PORTC&#160;=&#160;0x00;
PORTD&#160;=&#160;0x00;&#160;
PORTE&#160;=&#160;0x00;&#160;
}

//-------------------------------------------------------------------------------//
//函数名:lcd_init         &#160;&#160;&#160;&#160;//
//功能:lcd初始化         &#160;&#160;&#160;&#160;//
//------------------------------------------------------------------------------//
void&#160;lcd_init(void)&#160;
{&#160;
LCDCON=0b10011111;//&#160;
//|||||||+---LMUX0&#160;
//||||||+----LMUX1&#160;11--1/4
//|||||+-----CS0&#160;00=FOSC/8192,01&#160;=&#160;T1OSC&#160;(Timer1)&#160;/32,&#160;
//||||+-----CS1&#160;1x=LFINTOSC(31&#160;kHz)&#160;/32&#160;
//|||+------VLCDEN&#160;
//||+-------WERR&#160;
//|+--------#SLPEN&#160;
//+---------LCDEN&#160;
LCDPS=0b00110000;//&#160;
//|||||||+---LP0&#160;1111&#160;=&#160;1:16&#160;
//||||||+----LP1&#160;&#160;
//|||||+-----LP2&#160;
//||||+-----LP3&#160;0000=1:1&#160;&#160;
//|||+------WA&#160;1&#160;=&#160;允许写入LCDDATAx&#160;寄存器&#160;
//||+-------LCDA&#160;1&#160;=&#160;使能LCD&#160;驱动模块&#160;
//|+--------BIASMD当LMUX<1:0>=11时:0=1/3偏置模式(不要将该位置1)&#160;
//+---------WFT&#160;1在每一帧边界改变相位0在每一公共端类型内改变相位
LCDREF=0B10101110;
//
LCDSE0=0b11111111;&#160;
LCDSE1=0b00000011;//LCD引脚使能寄存器,SEG0~SEG9
}

//-------------------------------------------------------------------------------//
//函数名:main         &#160;&#160;&#160;&#160;         //
//功能:主程序入口函数         &#160;&#160;&#160;&#160;         //
//------------------------------------------------------------------------------//
void&#160;main(void)
{
unsigned&#160;char&#160;i;

Init_Port();
lcd_init();

LCDDATA0=0xfc;&#160;
LCDDATA3=0xfc;&#160;
LCDDATA6=0xfc;&#160;
LCDDATA9=0xfc;&#160;

while(1)&#160;
{
LCDDATA0&#160;=&#160;0XFF;
DelayMs(500);       
LCDDATA0&#160;=&#160;0X00;
DelayMs(500);
}

}

出0入0汤圆

发表于 2011-8-28 04:54:27 | 显示全部楼层
my code, following the same line:

=======lcd_hw.c================

#include <htc.h>                                                //we use picc
#include "lcd_hw.h"                                                //we use onboard hardware lcd

//global variable
       
//initialize the lcd
void lcd_init(void) {
        //set up lcdcon
        LCDEN = 0;                                                        //turn off the lcd
        SLPEN = 1;                                                        //no lcd drive in sleep mode
        VLCDEN = 1;                                                        //enable lcd bias voltage
        CS1=0, CS0=0;                                                //0b00 -> Fosc / 8192. 0b01 = Timer1/32, 0b1x = LFINTOSC(31khz)/32
        LMUX1=(LCD_COM & LCD_COM2) >> 1;
        LMUX0=(LCD_COM & LCD_COM1);                        //0b00 -> static(COM0); 0b01 -> 1/2 (COM0..1); 0b10 -> 1/3 (COM0..2); 0b11 -> 1/4 (COM0..3)
       
        //set up lcdps
        WFT = 0;                                                        //1=wave form change on the boundary, 0=in between
        switch (LCD_COM) {
                case LCD_COM0:                BIASMD = 0;        break;        //has to be set to 0
                case LCD_COM1:                BIASMD = 1; break;        //1=1/2 bias. 0=1/3 bias
                case LCD_COM2:                BIASMD = 0;        break;        //1=1/3 bias. 0=1/2 bias
                case LCD_COM3:                BIASMD = 0;        break;        //has to be set to 0
        }
        //LCDA=1, WA=1;                                                //set the status bits
       
        //set up the prescaler
        LP3=(LCD_PS & 0x08) >> 3;
        LP2=(LCD_PS & 0x04) >> 2;
        LP1=(LCD_PS & 0x02) >> 1;
        LP0=(LCD_PS & 0x01) >> 0;                                //lcd prescaler. 1:1(0b0000) -> 16:1 (0b1111)
       
        //enable the segments - need customization
        LCDSE0 = 0xff;                                                //enable lcd0..7
        LCDSE1 = 0xff;                                                //enable lcd8..15
        LCDSE2 = 0xff;                                                //enable lcd16..23
        //LCDSE3 = 0xff;                                                //enable lcd24..31
        //LCDSE4 = 0xff;                                                //enable lcd32..39
        //LCDSE5 = 0xff;                                                //enable lcd40..47
       
        //enable the output - set by lcdsex automatically
        //TRISA = 0x00;                                                //porta as output
        //TRISB = 0x00;                                                //portb as output
        //TRISC = 0x00;                                                //portc as output
        //TRISD = 0x00;                                                //portd as output
        //TRISE = 0x00;                                                //porte as output
       
        LCDEN = 1;                                                        //enable the lcd
}

//display data on lcd
void lcd_display(unsigned char * vRAM) {
        unsigned char index;
        const unsigned char _7seg_font[]={
                0x3f,                                                                        //'0'
                0x06,                                                                        //'1'
                0x5b,                                                                        //'2'
                0x4f,                                                                        //'3'
                0x66,                                                                        //'4'
                0x6d,                                                                        //'5'
                0x7d,                                                                        //'6'
                0x07,                                                                        //'7'
                0x7f,                                                                        //'8'
                0x6f,                                                                        //'9'
                0x77,                                                                        //'A'
                0x7c,                                                                        //'b'
                0x39,                                                                        //'C'
                0x5e,                                                                        //'d'
                0x79,                                                                        //'E'
                0x71,                                                                        //'F'
                0x40};                                                                        //' '
       

        //set up the data - will need triming
        //vRAM[] is numerical
        LCDDATA0 = _7seg_font[vRAM[0]];
        LCDDATA1 = _7seg_font[vRAM[1]];
        LCDDATA2 = _7seg_font[vRAM[2]];
        LCDDATA3 = _7seg_font[vRAM[3]];
        LCDDATA4 = _7seg_font[vRAM[4]];
        LCDDATA5 = _7seg_font[vRAM[5]];
        LCDDATA6 = _7seg_font[vRAM[6]];
        LCDDATA7 = _7seg_font[vRAM[7]];
        LCDDATA8 = _7seg_font[vRAM[8]];
        LCDDATA9 = _7seg_font[vRAM[9]];
        LCDDATA10 = _7seg_font[vRAM[10]];
        LCDDATA11 = _7seg_font[vRAM[11]];
}

出0入0汤圆

发表于 2011-8-28 04:55:05 | 显示全部楼层
here is the corresponding header file


============lcd_hw.h=================

//header file for on-board lcd hardware

//hardware configuration
#define LCD_PS                        LCD_PS1x                //lcd prescaler
#define LCD_COM                        LCD_COM1                //lcd com
//#define LCD_DIGs                8                                //number of lcd digits
//end hardware configuration

#define LCD_COM0                0x00                        //com0 - static
#define LCD_COM1                0x01                        //com0..1 -> 1/2
#define LCD_COM2                0x02                        //com0..2 -> 1/3
#define LCD_COM3                0x03                        //com0..3 -> 1/4

//prescaler settings
#define LCD_PS1x                0x00
#define LCD_PS2x                0x01
#define LCD_PS3x                0x02
#define LCD_PS4x                0x03
#define LCD_PS5x                0x04
#define LCD_PS6x                0x05
#define LCD_PS7x                0x06
#define LCD_PS8x                0x07
#define LCD_PS9x                0x08
#define LCD_PS10x                0x09
#define LCD_PS11x                0x0a
#define LCD_PS12x                0x0b
#define LCD_PS13x                0x0c
#define LCD_PS14x                0x0d
#define LCD_PS15x                0x0e
#define LCD_PS16x                0x0f

//global variable

//initialize the lcd
void lcd_init(void);

//display data on lcd
//vRAM is an array containing the numerical digits
void lcd_display(unsigned char * vRAM);

出0入0汤圆

发表于 2011-9-6 11:51:39 | 显示全部楼层
楼主用的16F1937是比较新些的芯片呢,比那些16F914,,917性价比好多了;--孙工 QQ:1198209352

出0入0汤圆

发表于 2013-7-18 10:18:50 | 显示全部楼层
学习了,,谢谢大家

出0入0汤圆

发表于 2013-7-18 10:52:33 | 显示全部楼层
mark!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2014-5-18 22:13:16 | 显示全部楼层
请问有基于AT80S52的程序吗?

出0入0汤圆

发表于 2014-10-28 13:21:40 | 显示全部楼层
不错,哈
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 05:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表