打印
[PIC®/AVR®/dsPIC®产品]

求助大神!关于16f917驱动段式液晶问题

[复制链接]
1540|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
991083158|  楼主 | 2015-1-12 15:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是pic16f917
功能是:利用timer0定是一秒,利用timer1外部引脚计数,段式液晶显示timer1计数结

果;
出现的问题:液晶正常显示数据,但是是隔一秒显示一次(即:一秒显示数据,另一秒

什么都不显示)
求大神指教!!!!!!
马上贴出代码!
沙发
991083158|  楼主 | 2015-1-12 15:33 | 只看该作者

//数据正确显示,但是LCD屏幕闪烁

#include <pic.h>         

#define uchar unsigned char
#define uint unsigned int

#define A1   SEG0COM0
#define B1   SEG1COM0
#define A2   SEG2COM0
#define B2   SEG3COM0
#define A3   SEG4COM0
#define B3   SEG5COM0

#define F1   SEG0COM1
#define G1   SEG1COM1
#define F2   SEG2COM1
#define G2   SEG3COM1
#define F3   SEG4COM1
#define G3   SEG5COM1

#define E1   SEG0COM2
#define C1   SEG1COM2
#define E2   SEG2COM2
#define C2   SEG3COM2
#define E3   SEG4COM2
#define C3   SEG5COM2

#define P1   SEG0COM3
#define D1   SEG1COM3
#define P2   SEG2COM3
#define D2   SEG3COM3
#define P3   SEG4COM3
#define D3   SEG5COM3

uint i=0;
uchar flag=0;
uint count=0;
uint xianshi=0;
uchar bai,shi,ge;
void lcdshowbai(uchar data)
{       
   switch(data)
      {                
                case 0:
                  {A1=B1=C1=D1=E1=F1=1;break;}
                case 1:
                  {C1=B1=1;break;}
                case 2:
                  {A1=B1=G1=D1=E1=1;break;}
                case 3:
                  {A1=B1=C1=D1=G1=1;break;}
                case 4:
                  {        F1=B1=C1=G1=1;break;}
                case 5:
                  {        A1=F1=C1=D1=G1=1;break;}
                case 6:
                  {        A1=F1=C1=D1=G1=E1=1;break;}
                case 7:
                  {        A1=B1=C1=1; break;}
                case 8:
                  {        A1=B1=C1=D1=G1=E1=F1=1;break;}
                case 9:
                  {        A1=B1=C1=D1=G1=F1=1;break;}
            }
}

void lcdshowshi(uchar data)
{       
   switch(data)
         {       
               case 0:
                  {A2=B2=C2=D2=E2=F2=1;break;}
                case 1:
                  {        B2=C2=1;break;}
                case 2:
                  {        A2=B2=G2=D2=E2=1;break;}
                case 3:
                  {        A2=B2=C2=D2=G2=1;break;}
                case 4:
                  {F2=B2=C2=G2=1;break;}
                case 5:
                  {A2=F2=C2=D2=G2=1;break;}
                case 6:
                  {A2=F2=C2=D2=G2=E2=1;break;}
                case 7:
                  {A2=B2=C2=1;break;}
                case 8:
                  {A2=B2=C2=D2=G2=E2=F2=1;break;}
                case 9:
                  {A2=B2=C2=D2=G2=F2=1;break;}
         }
}

void lcdshowge(uchar data)
{       
   switch(data)
      {                
               case 0:
                  {A3=B3=C3=D3=E3=F3=1;break;}
                case 1:
                  {C3=B3=1;break;}
                case 2:
                  {A3=B3=G3=D3=E3=1;break;}
                case 3:
                  {A3=B3=C3=D3=G3=1;break;}
                case 4:
                  {F3=B3=C3=G3=1;break;}
                case 5:
                  {A3=F3=C3=D3=G3=1;break;}
                case 6:
                  {A3=F3=C3=D3=G3=E3=1;break;}
                case 7:
                  {A3=B3=C3=1;break;}
                case 8:
                  {A3=B3=C3=D3=G3=E3=F3=1;break;}
                case 9:
                  {A3=B3=C3=D3=G3=F3=1;break;}
            }
}

void delay100ms(uchar dat)   //误差 -1us
{
    unsigned char a,b,c;
    for(c=dat;c>0;c--)
        for(b=202;b>0;b--)
        for(a=81;a>0;a--);
}




void shownum()
{


        if(count<1200)
                {xianshi=0.1*count;}
        else
                {xianshi=0.5*count/6;}

//        xianshi=count;       


        bai=(uchar)(xianshi%1000/100);
        shi=(uchar)(xianshi%100/10);
        ge=(uchar)(xianshi%10);
    lcdshowbai(bai);
        lcdshowshi(shi);
        lcdshowge(ge);       

}
//将shownum拆分
/*uchar shuju()
{


        if(count<1200)
                {xianshi=0.1*count;}
        else
                {xianshi=0.5*count/6;}
        bai=(uchar)(xianshi%1000/100);
        shi=(uchar)(xianshi%100/10);
        ge=(uchar)(xianshi%10);       

        if(flag==1)
        return 1;
        else return 0;
}

void show()
{

    lcdshowbai(bai);
        lcdshowshi(shi);
        lcdshowge(ge);
}
*/
void cshio()
{
    TRISA=0B11000000;      //初始化RA5-RA0的输入输出方向
    TRISB=0B00000000;      //初始化RB7-RB0的输入输出方向
    TRISC=0B00010000;      //初始化RC7-RC0的输入输出方向
    TRISD=0B00000000;      //初始化RD7-RD0的输入输出方向
    PORTA=0B00000000;      //初始化RA5-RA0数值
    PORTB=0B00000000;      //初始化RB7-RB0的数值
    PORTC=0B00010000;      //初始化RC7-RC0的数值
    PORTD=0B00000000;      //初始化RD7-RD0的数值
}

void cshtimer()
{
          //***定时器TMR0初始化***
    T0CS=0;                //TMRO时钟源选择内部指令周期时钟(Fosc/4)
    PSA=1;                 //预分频器分配给WDT
    TMR0=0x06;             //定时250微秒,置初值为256-250
    T0IF=0;                //清除TMR0的中断标志
    T0IE=1;                //TMR0中断允许
    //计数1初始化
        T1CON=0B00000011;
        TMR1H=TMR1L=0;
//        T1OSCEN=0;
//        TMR1CS=1;
        TMR1IF=0;
        TMR1IE=0;
        TMR1ON=1;
    //***开全局中断设置****
    //定时器T0设置了中断允许,此处要开全局中断
    GIE=1;                 //开全局中断       
}

//初始化LCD
void cshlcd()
{

LCDDATA0=0X00;
LCDDATA3=0X00;
LCDDATA6=0X00;
LCDDATA9=0X00;
LCDPS=0b00110000;
LCDSE0=0xff;
LCDCON=0b10011011;
LCDIF=0;
LCDIE=0;
/* LCDREF=0b10001110;
LCDRL=0xf0;
LCDCST=0;*/
LCDEN=1;
}




void main()            //主函数,单片机开机后就是从这个函数开始运行
{       
        TRISC5=1;
         OSCCON=0b01100111;       
//         cshio();
    cshlcd();
    cshtimer();


        while(flag==0);
    while(1)               //死循环,单片机初始化后,将一直运行这个死循环
    {
                shownum();

        while(flag==0);
                shownum();

       

    }


}




                       
void interrupt ISR(void)   //PIC单片机的所有中断都是这一个入口
{
    if(T0IF==1)          //需要进一步判断是否是T0中断
    {  
       TMR0=0x06;         //定时器中断后,要重置初值,以备下次中断
       T0IF=0;            //清中断标志位,以备下次中断
    //***此处用户自行添加定时器T0中断处理程序***
        TMR1ON=1;
                i++;
//                flag=0;
                if(i==4001)
                {
                        TMR1ON=0;
                        i=0;
                        count=TMR1H*256+TMR1L;
                        flag=1;
                        TMR1H=TMR1L=0;
               
                }
               
    }
}   

使用特权

评论回复
板凳
JY-DX-JY| | 2015-1-12 15:57 | 只看该作者
   shownum();

        while(flag==0);
                shownum();

        
这怎么两个?可以去掉1个吧。

使用特权

评论回复
地板
991083158|  楼主 | 2015-1-12 16:27 | 只看该作者
JY-DX-JY 发表于 2015-1-12 15:57
shownum();

        while(flag==0);

去掉第一个后,结果是第一秒液晶无反应,之后正常;加上第一个结果是上电就显示000,1秒后正常显示数据

使用特权

评论回复
5
JY-DX-JY| | 2015-1-12 16:57 | 只看该作者
还闪不闪?把第二个去掉呢?

使用特权

评论回复
6
991083158|  楼主 | 2015-1-12 17:45 | 只看该作者
JY-DX-JY 发表于 2015-1-12 16:57
还闪不闪?把第二个去掉呢?

去掉第一个还是闪,去掉第二个就干脆只显示000,而且闪

使用特权

评论回复
7
JY-DX-JY| | 2015-1-12 17:53 | 只看该作者
    while(flag==0);
这一句干吗的?加延时试试。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
991083158 + 1 赞一个!
8
991083158|  楼主 | 2015-1-12 21:55 | 只看该作者
JY-DX-JY 发表于 2015-1-12 17:53
while(flag==0);
这一句干吗的?加延时试试。

这一句的作用是:timer0定时满一分钟,timer1计数值赋给count,同时flag置1 。
ps:timer0不分频时,必须要把分频赋给wtd,今天我试着把timer0分频,然后就不闪烁了,可是数据不准,数据无更新,我正在接着调试,谢谢你一直关注我的问题!

使用特权

评论回复
9
991083158|  楼主 | 2015-1-12 21:56 | 只看该作者
991083158 发表于 2015-1-12 21:55
这一句的作用是:timer0定时满一分钟,timer1计数值赋给count,同时flag置1 。
ps:timer0不分频时,必须 ...

是满一秒钟,打错了

使用特权

评论回复
10
991083158|  楼主 | 2015-1-13 21:57 | 只看该作者
问题已解决,谢谢大家!

使用特权

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

本版积分规则

2

主题

17

帖子

0

粉丝