38

主题

0

好友

341

积分

业余侠客 当前离线

Rank: 4

UID
30960
帖子
240
精华
0
经验
341 点
金钱
267 ¥
注册时间
2007-11-23
发表于 2012-11-28 21:03 | 显示全部楼层
写了一个1602显示可调电压程序,功能都可以,但是光标像走马灯一样停不下来,请高人指点一下错误,谢谢!!


#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint t);        //延时子函数声明
void write_com(uchar com); //命令函数声明
void write_dat(uchar dat); //数据函数声明
void init_lcd();               //初始化声明
void xianshi(uchar x,uchar y);
void xianshi1(uchar x1,uchary1);
void anjiansaomiao();   
sbit s2=P2^1;   //定义4.2v电压键
sbit s3=P2^2;   //定义12.6v电压键
sbit s4=P2^3;   //定义24电压键
sbit en=P2^5;           //位定义使能信号输入端
sbit rs=P2^7;           //位定义数据、命令选择端
sbit dyj=P3^2;      //定义电压减小键
sbit dyz=P3^3;   //定义电压增加键
sbit shezhi=P3^4;  //定义设置键

uchar cishu=0;
uchar x,y;
uchar x1,y1;

void main()
{
  init_lcd();
     x=0;
     y=0;
     x1=0;
     y1=0;

     while(1)
  {
      anjiansaomiao();
   xianshi( x, y);
      xianshi1(x1,y1);
  }
}
void anjiansaomiao()                  //按键扫描
{
if(shezhi==0)                     //设置键按下
{
  delay(5);            //等待5毫秒
  if(shezhi==0)         //确定设置键按下
  {
   cishu++;                  
   while(shezhi==0);        
  }
   if(cishu!=0)
   {
   
    write_com(0x87);
    write_com(0x0f);//程序到这里就开始发作,不可控!!
   
   }
   if(cishu==5)            
   {   
    cishu=0;
    write_com(0x0c);              
   }
   
}
   if(cishu!=0)                            //如果设置键计数不等于零
   {
  
    if(dyz==0)                          //电压增大按键按下
    {
     delay(5);                       //等待5毫秒
     if(dyz==0)                      //确定电压增大键按下
     {
      while(dyz==0);              //等待电压增大键松手
      if(cishu==1)                //如果设置键计数是一
      {
       y++;                    //电压的小数值加一
       if(y==100)              //如果小数加到100
       y=0;                      //小数清零
                               //地址指针指到第一行第十三位   
      }  
         if(cishu==2)       //如果设置键计数是二
                        {
      
          if(x<=29)            //如果整数电压值小于等于30
          x++;          //整数电压值加一
      }
                        if(cishu==3)
                        {
       y1++;
       if(y1==100)
       y1=0;
      }
                        if(cishu==4)
      {
       if(x1<=9)
       x1++;
      }                 
     }                  
             }
      
                   if(dyj==0)                          
       {
     delay(5);                     
        if(dyj==0)                     
     {
      while(dyj==0);              
      if(cishu==1)         
      {
       if(y>0)         
       y--;              
                           
      }
      if(cishu==2)              
      {
       if(x>0)         
                            x--;            
                 
      }
      if(cishu==3)
      {
       if(y1>0)
       y1--;
      }
      if(cishu==4)
      {
       if(x1>0)
       x1--;
      }
      }   
           }   
            }
if(s2==0){while(s2==0);x=4;y=20;}
if(s3==0){while(s3==0);x=12;y=60;}
if(s4==0){while(s4==0);x=24;y=0;}
}
                    
void xianshi(uchar x,uchar y) //显示函数
{
uchar qian,bai;uchar shi,ge;
qian=x/10;
bai=x%10;
shi=y/10;
ge=y%10;

    write_com(0x83);
write_dat(0x30+qian);
write_com(0x84);
write_dat(0x30+bai);
write_com(0x85);
write_dat('.');
write_com(0x86);
write_dat(0x30+shi);
write_com(0x87);
write_dat(0x30+ge);
write_com(0x88);
write_dat('v');
}
void xianshi1(uchar x1,uchar y1) //显示函数
{
uchar qian1,bai1;uchar shi1,ge1;
qian1=x1/10;
bai1=x1%10;
shi1=y1/10;
ge1=y1%10;

    write_com(0x83+0x40);
write_dat(0x30+qian1);
write_com(0x84+0x40);
write_dat(0x30+bai1);
write_com(0x85+0x40);
write_dat('.');
write_com(0x86+0x40);
write_dat(0x30+shi1);
write_com(0x87+0x40);
write_dat(0x30+ge1);
write_com(0x88+0x40);
write_dat('A');
}

void init_lcd()             //初始化函数
{
    en=0;
rs=0;
write_com(0x38);   //将液晶设置为8位数据线格式,2行字符显示
write_com(0x0c);   //将液晶设置为显示功能开,无光标,不闪烁
write_com(0x06);   //将液晶设置为写入新数据后光标右移
write_com(0x01);   //清除液晶显示屏幕信息,将光标撤回液晶显示屏的左上方并且将地址计数器(AC)的值设为0
delay(5);
}
void delay(uint t)        //延时子函数
{
uint x,y;
for(x=t;x>0;x--)
  for(y=120;y>0;y--);
}
void write_com(uchar com)  //命令函数
{
rs=0;
P0=com;
delay(2);
en=1;
delay(2);
en=0;
}
void write_dat(uchar dat)   //数据函数
{
  rs=1;
P0=dat;
delay(2);
en=1;
delay(2);
en=0;
}
1602.PNG

1602.rar

13.68 KB, 下载次数: 108

88

主题

2

好友

1358

积分

侠之大者 当前离线

Rank: 6Rank: 6

UID
1290
帖子
1302
精华
0
经验
1358 点
金钱
1275 ¥
注册时间
2004-8-23
发表于 2012-11-28 21:33 | 显示全部楼层
看看

0

主题

0

好友

67

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
545921
帖子
64
精华
0
经验
67 点
金钱
67 ¥
注册时间
2012-11-22
发表于 2012-11-28 21:35 | 显示全部楼层
这个缩进看的人头晕,protues吧?哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部