求大神帮看看程序问题,为什么1602显示不出时间?

2019-03-24 18:17发布

本帖最后由 ny760117144 于 2014-6-11 18:46 编辑

//P3^2和P3^3低电平检测,液晶输出圈数、序号、低电平时间
#include<reg52.h>
#include<intrins.h>
#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++;               
                        }
               }

                }
}

主要目的是测量P3.2和P3.3低电平时间,时间大约在1至3秒,但是液晶显示的时间是乱码
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。