[讨论] 求大神看看小弟写的程序1602怎么显示不出时间

ny760117144   2014-6-11 18:49 楼主
//P3^2和P3^3低电平检测,液晶输出圈数、序号、低电平时间
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar sun;//sun为主函数中1602显示地址所用
uchar ge1,ge2,shi1,shi2,bai1,bai2;
uchar code table[]="   R   N   T    "; //设定开始显示的时间
sbit led=P1^0;//定义led为P0.0
sbit wr=P3^6; //1602液晶的读/写端口
sbit dula=P2^6; // 申请U1锁存器的锁存端
sbit wela=P2^7; //  申请U2锁存器的锁存端
sbit lcden=P3^4; // 1602液晶使能端
sbit lcdrs=P3^5; // 1602液晶命令/数据端
sbit a=P3^2;   
sbit b=P3^3;
int sum;
       
       

void delayms(uint xms)                               
{
        uint i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}
void write_com(uchar com) //1602液晶写指令函数
{
        lcdrs=0;
        wr=0;
        P0=com;
        delayms(5);
        lcden=1;
        delayms(5);
        lcden=0;
}
void write_data(uchar dat) //1602液晶写数据函数
{
        lcdrs=1;
        wr=0;
        P0=dat;
        delayms(5);
        lcden=1;
        delayms(5);
        lcden=0;
}
void lcd_post(int X,int Y)       //0,1表征 第一行 和 第二行
{                                        
        write_com(0x80+X*(0x40)+Y);
}

uint read1(int i)//IO口接入脉冲,用T0定时计数器计数:
{
uint val;
        sum=0;

        TH0 = 0;
        TL0 = 0;
       
        TR0 = 1;
        if (i==0)
                while(a==0);
        else
            while(b==0);
        val = sum * 65536 +TH0* 256 +TL0;
        TR0=0;
}

void T0_time() interrupt 1
{
        TH0=00;
        TL0=00;
        sum ++;
}

void init()
{  
    EA = 1;
        ET0 = 1;
        dula=0;
        wela=0;
    lcden=0;
        write_com(0x38);
        write_com(0x0c);
    write_com(0x06); //写字符后地址指针加一
        write_com(0x01);
}

void main()
{
   uint num1;
        uchar Q1,Q2;
        int iPosition,fhPosition,flPosition,ibPosition,fhbPosition,flbPosition;

        Q1=48;
        Q2=48;
       

       
        init();
        TMOD=0x01; //设置定时器0工作方式1(0000 0001)
        TH0=00;     //将计数器寄存器初值清零
        TL0=00;
        write_com(0x80);//显示第一行 "R" "N" "T"
        for(sun=0;sun<16;sun++)
        {
                write_data(table[sun]);
                delayms(5);
        }   
        lcd_post(1,10);             //显示初始状态0  0  0.00
        write_data('.');
        lcd_post(1,3);//1602数据指针指到第二行第3个字,用于显示圈数
        write_data('0');//Q为圈数
    lcd_post(1,7);//1602数据指针指到第二行第7个字,用于显示低电平端口赋值1
        write_data('0');//
        lcd_post(1,10);//1602数据指针指到第二行第10个字,用于显示整数部分
        write_data('0');//w为时间整数部分
        lcd_post(1,11);//1602数据指针指到第二行第11个字,用于显示小数点
    write_data('.');//
        lcd_post(1,12);//1602数据指针指到第二行第12个字,用于显示小数点十分位
    write_data('0');//
    lcd_post(1,13);//1602数据指针指到第二行第13个字,用于显示小数点百分位
    write_data('0');//


        while(Q1 <= 58&&Q2 <= 58)
        {
                if (a==0)//判断P3.2口出现低电平       
                {       
                        delayms(10);
                        if(a==0)   
                        {
                        num1 = 0;
                                num1=read1(0);
                                lcd_post(1,3);//1602数据指针指到第二行第3个字,用于显示圈数
                                write_data(Q1);//Q为圈数
                                lcd_post(1,7);//1602数据指针指到第二行第7个字,用于显示低电平端口赋值1
                                write_data('1');//
                                 iPosition=num1 / 1000000;
                                lcd_post(1,10);//1602数据指针指到第二行第10个字,用于显示整数部分
                                write_data(iPosition);//
                         fhPosition=(num1% 1000000)/100000;
                                lcd_post(1,12);//1602数据指针指到第二行第12个字,用于显示小数点十分位
                                write_data(fhPosition);//
                                 flPosition=((num1 % 1000000) % 100000)/10000;
                                lcd_post(1,13);//1602数据指针指到第二行第13个字,用于显示小数点百分位
                                write_data(flPosition);//
                                Q1++;               
                        }
                }
                if (b==0)
                {
                        delayms(10);
                        if(b==0)  
                        {
                                num1 = 0;
                                num1=read1(1);
                                lcd_post(1,3);//1602数据指针指到第二行第3个字,用于显示圈数
                                write_data(Q2);//Q为圈数
                                lcd_post(1,7);//1602数据指针指到第二行第7个字,用于显示低电平端口赋值1
                                write_data('2');//
                                 ibPosition=num1 / 1000000;
                                lcd_post(1,10);//1602数据指针指到第二行第10个字,用于显示整数部分
                                write_data(ibPosition);//
                                 fhbPosition=(num1 % 1000000)/100000;
                                lcd_post(1,12);//1602数据指针指到第二行第12个字,用于显示小数点十分位
                                write_data(fhbPosition);//
                        flbPosition=((num1 % 1000000) % 100000)/10000;
                                lcd_post(1,13);//1602数据指针指到第二行第13个字,用于显示小数点百分位
                                write_data(flbPosition);//
                                Q2++;               
                        }
               }

                }
}

回复评论 (2)

对于这种问题我一般的回答都是一样的,一步一步的来,先看看能不能显示数,能不能按自己的意思来显示,能的话下一步就是你取数的问题了,如果时间正确那么就是数据处理的问题了,没有时间帮你看了,提供个思路自己先找找原因
点赞  2014-6-12 11:04
我建议你运用硬件仿真一步步看,设置断点,看问题出现在哪里!!!只能给你一个方法,具体做还的靠自己。
为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人! 更多内容关注微信公众号:单片机精讲吴鉴鹰
点赞  2014-6-19 22:15
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复