1602第二行显示不出来,麻烦那位大神帮帮忙看看程序,小弟谢谢啦

2019-03-24 18:18发布

1602第二行显示不出来,麻烦那位大神帮帮忙看看程序,小弟谢谢啦
#include<reg52.h>#include<stdio.h> //标准输入输出 #include<intrins.h> #define Data  P0//数据端口 sbit RS = P2^4; //Pin4 sbit RW = P2^5; //Pin5 sbit E  = P2^6; //Pin6 sbit LED1=P1^3; //脉冲接收指示灯 sbit IR=P1^0;   //霍尔传感器脉冲输入端 unsigned char count,second,minute,hour,hour_shiwei,hour_gewei; fen_shiwei,fen_gewei,miao_shiwei,miao_gewei;//秒表计时参数 unsigned char count1,sssd_shiwei,sssd_gewei; sssd_fenwei,sssd_shifenwei;//瞬时速度参数 unsigned char key,choose,z,sj1,sj2,t1; unsigned char pjsd_shiwei,pjsd_gewei,pjsd_fenwei,pjsd_shifenwei;//平均速度参数 unsigned char L_baiwei,L_shiwei,L_gewei;// 车轮周长参数 unsigned char Lc_qianwei,Lc_baiwei,Lc_shiwei,Lc_gewei;Lc_fenwei;// 秒表计时里程计算参数 unsigned char ZLc_qianwei,ZLc_baiwei,ZLc_shiwei,ZLc_gewei;ZLc_fenwei;//总里程参数 unsigned long t,qs,qs1,qs2,qs3,L,V,Vt,dis,dis1,dis2,dis3; /***************************************************                  微秒函数声明 ****************************************************/ void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1;        /*12MHz频率*/ while(--uscnt); } /****************************************************                   毫秒函数声明 ****************************************************/ void DelayMs(unsigned char ms) { while(--ms)    {      DelayUs(250);      DelayUs(250);    DelayUs(250);    DelayUs(250);    } } /****************************************************                  写入命令函数 ****************************************************/ void WriteCommand(unsigned char c) { DelayMs(2);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; E=1; Data=c; E=0; } /****************************************************                 写入数据函数 ***************************************************/ void WriteData(unsigned char c) { DelayMs(2);  //操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; E=1; Data=c; E=0; RS=0; } /****************************************************                   写入字节函数 ****************************************************/ void ShowChar(unsigned char pos,unsigned char c) { unsigned char p; if (pos>=0x10)     p=pos+0xc0; //是第二行则命令代码高4位为0xc else      p=pos+0x80; //是第一行则命令代码高4位为0x8 WriteCommand (p);//写命令 WriteData (c);   //写数据 } /****************************************************                   初始化函数 ****************************************************/ void InitLcd() { DelayMs(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 }/****************************************************              秒表计时模块 *****************************************************/ void Init_Timer0(void) {    TMOD |=0x01;    TH0=0x3c;    TL0=0xb0;    EA=1;      ET0=1; } void Timer0_isr(void) interrupt 1 using 1 { TH0=0x3c;             //重新赋值 TL0=0xb0; count++;              if (count==20)       //20x50ms=1S,大致延时时间     {     count=0;     second++;         //秒加1 if(second==60)     {              second=0;              minute++;                 if(minute==60)                    {                      minute=0;                      hour++;                      if(hour==60)                        {                         hour=0;                        }                      hour_shiwei=hour/10;                      hour_gewei=hour%10;                     }             fen_shiwei=minute/10;              fen_gewei=minute%10;            }        miao_shiwei=second/10;//十位显示值处理        miao_gewei=second%10; //个位显示处理      } } /****************************************************                    速度模块 *****************************************************/ void Init_Timer1(void) {    TMOD |=0x10;    TH1=0xd8;    TL1=0xf0;    EA=1;      ET1=1;    TR1=1;  } void Timer1_isr(void) interrupt 3 using 1 {   TH1=0xd8;             //重新赋值   TL1=0xf0;   count1++;              if (count1==100)       //100x10ms=1S,大致延时时间     {      count1=0;    dis1=qs1*L;    qs1=0;   Vt=dis1*36/1;   sssd_shiwei=Vt/10000;  sssd_gewei=Vt%10000/1000;   sssd_fenwei=Vt%1000/100;   sssd_shifenwei=Vt%100/10;   if(qs2!=0)     {        t++; t1++;        dis2=qs2*L;        V=dis2*36/t;      if(t1==5)      {       t1=0;    qs2=0;      }        pjsd_shiwei=V/10000;          pjsd_gewei=V%10000/1000;          pjsd_fenwei=V%1000/100;      pjsd_shifenwei=V%100/10;       }    else      {        t=0;        dis2=0;     qs2=0;        V=0;        pjsd_shiwei=0;           pjsd_gewei=0;           pjsd_fenwei=0;     pjsd_shifenwei=0;      } } } /****************************************************                 里程模块 *****************************************************/ void distance(void) {   dis=qs*L;   ZLc_qianwei=dis/100000;   ZLc_baiwei=dis%100000/10000;   ZLc_shiwei=dis%10000/1000;   ZLc_gewei=dis%1000/100;   ZLc_fenwei=dis%100/10;   if(z==1)   {     dis3=qs3*L;     Lc_qianwei=dis3/100000;     Lc_baiwei=dis3%100000/10000;     Lc_shiwei=dis3%10000/1000;     Lc_gewei=dis3%1000/100;     Lc_fenwei=dis3%100/10;   } }    /****************************************************              外部中断0 设置车轮周长 *****************************************************/ void set_L(void) interrupt 0 {   L+=10;   L_baiwei=L/100;   L_shiwei=L%100/10;   L_gewei=L%10; } /****************************************************                脉冲接收模块                        ****************************************************/ void pulse_recieve(void)  {   LED1=IR;         if(IR==0)   {   sj1++;       //接收脉冲判断参数    if(sj1==2)    {    sj1=0;    }   } else   {    sj2++;     //不接收脉冲判断参数    if(sj2==2)    {    sj2=0;    }   } if(sj1&sj2)      {      sj1=0;      sj2=0;      qs++;        qs1++;       if(z==1)      {         qs2++;     qs3++;      }      else      {       qs2=0;      }   }  } /****************************************************                    显示欢迎信息 *****************************************************/ void show_welcome(void) { ShowChar(0,' '); ShowChar(1,0x57);//W ShowChar(2,0x65);//e ShowChar(3,0x6c);//l ShowChar(4,0x63);//c ShowChar(5,0x6f);//o ShowChar(6,0x6d);//m ShowChar(7,0x65);//e ShowChar(8,' '); ShowChar(9,0x74);//t ShowChar(10,0x6f);//o ShowChar(11,' '); ShowChar(12,0x75);//u ShowChar(13,0x73);//s ShowChar(14,0x65);//e ShowChar(15,' '); ShowChar(16,' '); ShowChar(17,' '); ShowChar(18,0x22); ShowChar(19,0x6d);//m ShowChar(20,0x69);//i ShowChar(21,0x6c);//l ShowChar(22,0x65);//e ShowChar(23,0x73);//s ShowChar(24,0x74);//t ShowChar(25,0x6f);//o ShowChar(26,0x6e);//n ShowChar(27,0x65);//e ShowChar(28,0x73);//s ShowChar(29,0x22); ShowChar(30,' '); ShowChar(31,' '); } /****************************************************              显示周长设置 *****************************************************/ void show_lcd_one(void) { ShowChar(0,0x53);//S ShowChar(1,0x65);//e ShowChar(2,0x74);//t ShowChar(3,' '); ShowChar(4,0x42);//B ShowChar(5,0x69);//i ShowChar(6,0x6b);//k ShowChar(7,0x65);//e ShowChar(8,' '); ShowChar(9,0x54);//T ShowChar(10,0x69);//i ShowChar(11,0x72);//r ShowChar(12,0x65);//e ShowChar(13,' '); ShowChar(14,0x4c);//L ShowChar(15,0x3d);//= ShowChar(16,' '); ShowChar(17,' '); ShowChar(18,' '); ShowChar(19,' '); ShowChar(20,' '); ShowChar(21,L_baiwei+0x30); ShowChar(22,L_shiwei+0x30); ShowChar(23,L_gewei+0x30); ShowChar(24,0x63);//c ShowChar(25,0x6d);//m ShowChar(26,' '); ShowChar(27,' '); ShowChar(28,' '); ShowChar(29,' '); ShowChar(30,' '); ShowChar(31,' '); } /****************************************************              显示秒表里程、时间 *****************************************************/ void show_lcd_two(void) { ShowChar(0,' '); ShowChar(1,' '); ShowChar(2,0x53);//S ShowChar(3,0x74);//t ShowChar(4,' '); ShowChar(5,' '); ShowChar(6,' '); ShowChar(7,' '); ShowChar(8,Lc_qianwei+0x30); ShowChar(9,Lc_baiwei+0x30); ShowChar(10,Lc_shiwei+0x30); ShowChar(11,Lc_gewei+0x30); ShowChar(12,0x2e); ShowChar(13,Lc_fenwei+0x30); ShowChar(14,0x6d);//m ShowChar(15,' '); ShowChar(16,' '); ShowChar(17,' '); ShowChar(18,0x54);//T ShowChar(19,0x69);//i ShowChar(20,0x6d);//m ShowChar(21,0x65);//e ShowChar(22,' '); ShowChar(23,hour_shiwei+0x30); ShowChar(24,hour_gewei+0x30); ShowChar(25,0x3a); ShowChar(26,fen_shiwei+0x30); ShowChar(27,fen_gewei+0x30); ShowChar(28,0x3a); ShowChar(29,miao_shiwei+0x30); ShowChar(30,miao_gewei+0x30); ShowChar(31,' '); } /****************************************************              显示平均速度和瞬时速度 *****************************************************/ void show_lcd_three(void) { ShowChar(0,' '); ShowChar(1,' '); ShowChar(2,0x56);//V ShowChar(3,' '); ShowChar(4,' '); ShowChar(5,pjsd_shiwei+0x30); ShowChar(6,pjsd_gewei+0x30); ShowChar(7,0x2e); ShowChar(8,pjsd_fenwei+0x30); ShowChar(9,pjsd_shifenwei+0x30); ShowChar(10,0x6b);//k ShowChar(11,0x6d);//m ShowChar(12,0x2f);// / ShowChar(13,0x68);//h ShowChar(14,' '); ShowChar(15,' '); ShowChar(16,' '); ShowChar(17,' '); ShowChar(18,0x56);//V ShowChar(19,0x74);//t ShowChar(20,' '); ShowChar(21,sssd_shiwei+0x30); ShowChar(22,sssd_gewei+0x30); ShowChar(23,0x2e); ShowChar(24,sssd_fenwei+0x30); ShowChar(25,sssd_shifenwei+0x30); ShowChar(26,0x6b);//k ShowChar(27,0x6d);//m ShowChar(28,0x2f);// / ShowChar(29,0x68);//h ShowChar(30,' '); ShowChar(31,' '); } /****************************************************              显示总里程、秒表里程 *****************************************************/ void show_lcd_four(void) { ShowChar(0,' '); ShowChar(1,' '); ShowChar(2,0x53);//S ShowChar(3,' '); ShowChar(4,' '); ShowChar(5,' '); ShowChar(6,' '); ShowChar(7,' '); ShowChar(8,ZLc_qianwei+0x30); ShowChar(9,ZLc_baiwei+0x30); ShowChar(10,ZLc_shiwei+0x30); ShowChar(11,ZLc_gewei+0x30); ShowChar(12,0x2e); ShowChar(13,ZLc_fenwei+0x30); ShowChar(14,0x6d);//m ShowChar(15,' '); ShowChar(16,' '); ShowChar(17,' '); ShowChar(18,0x53);//S ShowChar(19,0x74);//t ShowChar(20,' '); ShowChar(21,' '); ShowChar(22,' '); ShowChar(23,' '); ShowChar(24,Lc_qianwei+0x30); ShowChar(25,Lc_baiwei+0x30); ShowChar(26,Lc_shiwei+0x30); ShowChar(27,Lc_gewei+0x30); ShowChar(28,0x2e); ShowChar(29,Lc_fenwei+0x30); ShowChar(30,0x6d);//m ShowChar(31,' '); } /****************************************************              显示平均速度和瞬时速度 *****************************************************/ void show_lcd_five(void) { ShowChar(0,' '); ShowChar(1,' '); ShowChar(2,0x56);//V ShowChar(3,' '); ShowChar(4,' '); ShowChar(5,' '); ShowChar(6,pjsd_shiwei+0x30); ShowChar(7,pjsd_gewei+0x30); ShowChar(8,0x2e); ShowChar(9,pjsd_fenwei+0x30); ShowChar(10,pjsd_shifenwei+0x30); ShowChar(11,0x6b);//k ShowChar(12,0x6d);//m ShowChar(13,0x2f);// / ShowChar(14,0x68);//h ShowChar(15,' '); ShowChar(16,' '); ShowChar(17,' '); ShowChar(18,0x54);//T ShowChar(19,0x69);//i ShowChar(20,0x6d);//m ShowChar(21,0x65);//e ShowChar(22,' '); ShowChar(23,hour_shiwei+0x30); ShowChar(24,hour_gewei+0x30); ShowChar(25,0x3a); ShowChar(26,fen_shiwei+0x30); ShowChar(27,fen_gewei+0x30); ShowChar(28,0x3a); ShowChar(29,miao_shiwei+0x30); ShowChar(30,miao_gewei+0x30); ShowChar(31,' '); } /****************************************************              选择显示内容模块 *****************************************************/ void choosed(void) {   if(choose==1)   {   show_lcd_one();//显示设置的车轮周长为多长   } else if(choose==2)   {   show_lcd_two();//显示秒表里程和时间   } else if(choose==3)   {   show_lcd_three();//显示平均速度和瞬时速度   } else if(choose==4)   {   show_lcd_four();//显示总里程和秒表里程   }         else if(choose==5)//显示平局速度和时间   {   show_lcd_five();   }     } /****************************************************                   延时程序  ****************************************************/ void delay(unsigned int cnt) { while(--cnt); } /****************************************************                 键盘扫描函数 ****************************************************/ unsigned char keyscan(void)  //使用行列反转扫描法 { unsigned char cord_h,cord_l;//行列值中间变量 P3=0x0f;            //行线输出全为0 cord_h=P3&0x0f;     //读入列线值 if(cord_h!=0x0f)    //先检测有无按键按下 {   delay(100);        //去抖   if(cord_h!=0x0f)   {     cord_h=P3&0x0f;  //读入列线值     P3=cord_h|0xf0;  //输出当前列线值     cord_l=P3&0xf0;  //读入行线值     return(cord_h+cord_l);//键盘最后组合码值    }   }return(0xff);  } /****************************************************               键盘输入模块  ****************************************************/ void keyinput(void) { switch (key)    {case 0x7e:choose=1;break;  //显示设置的车轮周长为多长       case 0xbe:choose=2;break;  //显示秒表里程和时间       case 0xde:choose=3;break;  //显示平均速度和瞬时速度       case 0xee:choose=4;break;  //显示总里程和秒表里程       case 0x7d:choose=5;break;  //显示平均速度和时间    case 0x77:TR0=1,z=1;break;  //秒表计时开始    case 0xb7:TR0=0,z=0;break;  //秒表计时暂停    case 0xd7:TR0=0;z=0;count=0;second=0;minute=0;hour=0; hour_shiwei=0;hour_gewei=0;fen_shiwei=0;fen_gewei=0;miao_shiwei=0;miao_gewei=0;break;  //秒表清零并且暂停    case 0xdd:qs=0;dis=0;ZLc_qianwei=0;ZLc_baiwei=0;ZLc_shiwei=0; ZLc_gewei=0;ZLc_fenwei=0;break;  //总里程清零    case 0xed:dis3=0;qs3=0;Lc_qianwei=0;Lc_baiwei=0;Lc_shiwei=0; Lc_gewei=0;Lc_fenwei=0;  //秒表里程清零   }  } /******************************************************************                    主函数                                     ******************************************************************/ main() { InitLcd();         //初始化LCD DelayMs(15);       //延时保证信号稳定 Init_Timer0();      Init_Timer1();//定时器初始化 EA=1;   EX0=1; //外部中断0 IT0=1; //外部中断0触发,为边沿触发方式(下降沿有效) show_welcome(); //显示欢迎信息 while(1)   { pulse_recieve(); //脉冲接收 key=keyscan();  //调用键盘扫描, keyinput(); //键盘输入   distance(); //执行里程模块 choosed(); //执行显示选择模块 } }
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
yklstudent
1楼-- · 2019-03-24 20:39
/****************************************************
                  写入字节函数
****************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
    p=pos+0xc0; //是第二行则命令代码高4位为0xc
else  
    p=pos+0x80; //是第一行则命令代码高4位为0x8
WriteCommand (p);//写命令
WriteData (c);   //写数据
}
这个函数用的用问题吧你
感觉你应该改成如下这样,基本应该就可以正常显示了祝楼主好运
/****************************************************
                  写入字节函数
****************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
    p=pos+0xb0; //是第二行则命令代码高4位为0xc
else  
    p=pos+0x80; //是第一行则命令代码高4位为0x8
WriteCommand (p);//写命令
WriteData (c);   //写数据
}


elvike
2楼-- · 2019-03-24 21:11
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //显示光标移动位置
WriteCommand(0x0c); //显示开及光标设置
WriteCommand(0x01); //显示清屏
}

从你这个配置看,是16*2双行显示,你配置成单行显示看看。
leijinju
3楼-- · 2019-03-24 23:03
 精彩回答 2  元偷偷看……
elvike
4楼-- · 2019-03-25 02:44
0x38改成0x30试试吧。
leijinju
5楼-- · 2019-03-25 05:42
elvike 发表于 2014-5-31 12:44
0x38改成0x30试试吧。

虽然不行,但是还是谢谢你哈,谢谢
五加一等于六
6楼-- · 2019-03-25 07:28
 精彩回答 2  元偷偷看……

一周热门 更多>