打印

新手请教一段简单的PIC程序

[复制链接]
2137|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tracy86|  楼主 | 2010-10-13 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,刚接触PIC的单片机。完成一个简单程序,就让1602液晶显示一组字符。我是用C语言编的,但是奇怪的是这个程序就是不执行Write_LCD_Data()这个函数。我是新手弄了好半天也不知道什么问题。请看出问题的人说一下,谢谢。C编译器用的是PICC的免费版。

#include <pic.h>
#include <htc.h>
__CONFIG(WDTDIS&XT&LVPDIS&DEBUGDIS);
#define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit))
#define DelayNop() {asm("NOP");asm("NOP");asm("NOP");asm("NOP");}

static bit LCD_RS @PORTAIT(PORTC,0);
static bit LCD_RW @PORTAIT(PORTC,1);
static bit LCD_EN @PORTAIT(PORTC,2);

bit LCD_Busy_Check();
void Write_LCD_Command(unsigned char cmd);
void Write_LCD_Data(unsigned char dat);
void LCD_Initialise();

//LCD忙标志检测函数
bit LCD_Busy_Check()
{       
       
        static        bit result;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_EN = 1;
        DelayNop();
        TRISB=0xFF;
        result = (bit)(PORTB&0x80);
        LCD_EN=0;
        return result;
}
//LCD写命令
void Write_LCD_Command(unsigned char cmd)
{
        while(LCD_Busy_Check());
        TRISB=0;
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_EN = 0;
        asm("NOP");
        asm("NOP");
        PORTB = cmd;
        DelayNop();
        LCD_EN = 1;
        DelayNop();
        LCD_EN = 0;
}

//LCD写数据
void Write_LCD_Data(unsigned char dat)
{
        while(LCD_Busy_Check());
        TRISB=0;
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_EN = 0;
        asm("NOP");
        asm("NOP");
        PORTB =dat;
        DelayNop();
        LCD_EN = 1;
        DelayNop();
        LCD_EN = 0;
}

//LCD初始化函数
void LCD_Initialise()
{        Write_LCD_Command(0x01);
        Delay(1000);
        Write_LCD_Command(0x38);
        Delay(1000);
        Write_LCD_Command(0x0c);
        Delay(1000);
        Write_LCD_Command(0x06);
        Delay(1000);       
       
}

//设置LCD显示位置
void Set_LCD_POS(unsigned char pos)
{
        Write_LCD_Command(pos|0x80);       
}


void main(void)
{
        unsigned char i;
        TRISC=0;
        LCD_Initialise();
        Delay(10);
        Set_LCD_POS(0x01);
        i=0;
        while(dis1[i]!='\0')
        {       
                Write_LCD_Data(dis1[i]);               
                i++;       
        }
        Set_LCD_POS(0x42);
        i=0;
        while(dis2[i]!='\0')
        {
                Write_LCD_Data(dis2[i]);
                i++;
        }
}

相关帖子

沙发
SLEET1986| | 2010-10-13 16:45 | 只看该作者
编译的时候编译器选项里面有没有开看门狗,你怎么知道不执行Write_LCD_Data()这个函数;

使用特权

评论回复
板凳
ocon| | 2010-10-13 17:49 | 只看该作者
估计楼主是用软件仿真吧,程序写LCD之前要先读LCD,以执行忙状态检测,如果是仿真没设置好,读出来的状态一直是忙,程序就会死等在while(LCD_Busy_Check());这一步。
由此延伸可见,此程序健壮性欠佳,万一LCD屏当机或者接触不良,读出来的都是忙,整个系统也就完了。

使用特权

评论回复
地板
tracy86|  楼主 | 2010-10-13 18:15 | 只看该作者
看门狗在配置位里关了,我是用断点调试的。在这个函数设了一个断点但是程序却执行不到这个断点

使用特权

评论回复
5
tracy86|  楼主 | 2010-10-13 18:18 | 只看该作者
对的,用的是软件仿真。因为是前期的学习,手上没有什么资料和工具 3# ocon

使用特权

评论回复
6
ocon| | 2010-10-13 21:37 | 只看该作者
把忙判断这一行用固定延时,比如10个毫秒代替,继续调试。

使用特权

评论回复
7
SLEET1986| | 2010-10-14 08:14 | 只看该作者
把忙判断这一行用固定延时,比如10个毫秒代替,继续调试。
ocon 发表于 2010-10-13 21:37
检测忙这里 while(LCD_Busy_Check());
这个函数可以先去掉,试试。。

使用特权

评论回复
8
tracy86|  楼主 | 2010-10-16 11:57 | 只看该作者
我发现问题在哪了?原来是数组的初始化有问题
数组的初始化为:unsigned char dis1[]={"Hello world"};
unsigned char dis2[]={"First example"};
但是我看了一下编译后的程序,这两个数组的值都是为空的。这就是循环执行不到写数据的原因。可是这两个数组的初始化怎么会空的呢,哪位高手知不知道什么原因
7# SLEET1986

使用特权

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

本版积分规则

0

主题

31

帖子

1

粉丝