- 积分
- 341
- 在线时间
- 1314 小时
- 最后登录
- 2022-10-23
- 阅读权限
- 50
- 精华
- 0
- UID
- 30960
- 帖子
- 240
- 精华
- 0
- 经验
- 341 点
- 金钱
- 267 ¥
- 注册时间
- 2007-11-23
|
写了一个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;
} |
|