单片机1602液晶怎样移屏?怎样设置光标闪烁?谁有没有这样的C程序?
3个回答
展开全部
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar data a[ ]="xian zai shi ";
sbit key0= P2^0;//功能键,对位进行选择
sbit key1=P2^1;// 加位
sbit key2= P2^2;// 减位
sbit EN= P3^4; //读写段
sbit RS= P3^5; //使能端
uchar miao,fen,shi;
uchar gongleng;//功能键中间变量
uchar g,key0sum;
void xunhuan (uint x)
{
int y,z;
for (y=x;y>0;y--)
for (z=120;z>0;z--);
}
void write_e(uchar e ) //写密命
{
RS=0;
P1=e;
xunhuan(5);
EN=1;//给使能端一个高脉冲, 因为上升源完成指令
xunhuan(5);
EN=0; //芯片停止工作
}
void write_f(uchar f) //写操作
{
RS=1;
P1=f;
xunhuan(5);
EN=1;
xunhuan(5);
EN=0;
}
void write_wei(uchar wei, uchar shu ) //一个显示时间,一个现实在液晶屏那个位置
{
uchar shi,ge;
shi=shu/10; //显示两位数的高位
ge=shu%10; // 显示两位数的高低
write_e(0x80+0x40+wei);
write_f(0x30+shi);
write_f(0x30+ge);
}
void init ()
{
EN=0;//使能端
miao=0;
fen=0;
shi=0;
write_e(0x38);
write_e(0x0c);
write_e(0x06);
write_e(0x01);
//write_e(0x80+0x40);
for (g=0;g<16;g++) //显示现在时间
{
write_f(a[g]);
xunhuan(10);
}
write_e(0x80+0x40+6 ); //将要显示的位置
write_f(':');
xunhuan(5);
write_wei(4,shi);// 时的位置
write_e(0x80+0x40+9 );//将要显示的位置
write_f(':');
xunhuan(5);
write_wei(7,fen);//分的位置
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void keysan() //按键功能端
{
if(key0==0) //判断功能键的按下
{
xunhuan(20);
if(key0==0)
{
(key0sum)++;
while(!key0) ;
if(key0sum==1)
{
TR0=0 ;//关闭定时器终段位
write_e(0x80+0x40+10 );//移动到秒
write_e(0x0f);//光标闪烁,
}
if(key0sum==2)
{
TR0=0 ;//关闭定时器终段位
write_e(0x80+0x40+7 );//移动到分
write_e(0x0f);//光标闪烁,
}
if(key0sum==3)
{
TR0=0 ;//关闭定时器终段位
write_e(0x80+0x40+4 );//移动到时
write_e(0x0f);//光标闪烁,
}
if(key0sum==4)
{
TR0=1 ;//关闭定时器终段位
key0=0 ;//移动到秒
write_e(0x0c);//取消光标闪烁,
}
}
}
/**************/
if (key0!=0 )//判断功能键是否按下去
{
if(key1==0)
{
xunhuan(20);
if(key1==0) //按键的加位
{
while(!key1);
/*********************///秒
if(key0sum==1) //若功能键按下时一次,说明 光标移到秒
{
miao++;
if(miao==60)
miao=0;
write_wei(10,miao);// 将位和数送到秒
write_e(0x80+0x40+10);
}
/***************************/ //分
if(key0sum==2) //若功能键按下时一次,说明移到分
{
fen++;
if(fen==60)
fen=0;
write_wei(7,fen);// 将位和数送到fen
write_e(0x80+0x40+7);
}
/****************/ //时
if(key0sum==3) //若功能键按下时一次,说明移到分
{
shi++;
if(shi==60)
shi=0;
write_wei(4,shi);// 将位和数送到fen
write_e(0x80+0x40+4);
}
}
}
}
}
void main()
{
uint m;
init();
write_e(0x80);
for(m=0;m<16;m++)
{
write_f(a[m]);
xunhuan(5);
}
while(1)
{
keysan();
}
}
void T0_timer () interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
g++;
if(g==20)
{
g=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_wei(4,shi);
}
write_wei(7,fen);
}
write_wei(10,miao);
}
}
#define uchar unsigned char
#define uint unsigned int
uchar data a[ ]="xian zai shi ";
sbit key0= P2^0;//功能键,对位进行选择
sbit key1=P2^1;// 加位
sbit key2= P2^2;// 减位
sbit EN= P3^4; //读写段
sbit RS= P3^5; //使能端
uchar miao,fen,shi;
uchar gongleng;//功能键中间变量
uchar g,key0sum;
void xunhuan (uint x)
{
int y,z;
for (y=x;y>0;y--)
for (z=120;z>0;z--);
}
void write_e(uchar e ) //写密命
{
RS=0;
P1=e;
xunhuan(5);
EN=1;//给使能端一个高脉冲, 因为上升源完成指令
xunhuan(5);
EN=0; //芯片停止工作
}
void write_f(uchar f) //写操作
{
RS=1;
P1=f;
xunhuan(5);
EN=1;
xunhuan(5);
EN=0;
}
void write_wei(uchar wei, uchar shu ) //一个显示时间,一个现实在液晶屏那个位置
{
uchar shi,ge;
shi=shu/10; //显示两位数的高位
ge=shu%10; // 显示两位数的高低
write_e(0x80+0x40+wei);
write_f(0x30+shi);
write_f(0x30+ge);
}
void init ()
{
EN=0;//使能端
miao=0;
fen=0;
shi=0;
write_e(0x38);
write_e(0x0c);
write_e(0x06);
write_e(0x01);
//write_e(0x80+0x40);
for (g=0;g<16;g++) //显示现在时间
{
write_f(a[g]);
xunhuan(10);
}
write_e(0x80+0x40+6 ); //将要显示的位置
write_f(':');
xunhuan(5);
write_wei(4,shi);// 时的位置
write_e(0x80+0x40+9 );//将要显示的位置
write_f(':');
xunhuan(5);
write_wei(7,fen);//分的位置
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void keysan() //按键功能端
{
if(key0==0) //判断功能键的按下
{
xunhuan(20);
if(key0==0)
{
(key0sum)++;
while(!key0) ;
if(key0sum==1)
{
TR0=0 ;//关闭定时器终段位
write_e(0x80+0x40+10 );//移动到秒
write_e(0x0f);//光标闪烁,
}
if(key0sum==2)
{
TR0=0 ;//关闭定时器终段位
write_e(0x80+0x40+7 );//移动到分
write_e(0x0f);//光标闪烁,
}
if(key0sum==3)
{
TR0=0 ;//关闭定时器终段位
write_e(0x80+0x40+4 );//移动到时
write_e(0x0f);//光标闪烁,
}
if(key0sum==4)
{
TR0=1 ;//关闭定时器终段位
key0=0 ;//移动到秒
write_e(0x0c);//取消光标闪烁,
}
}
}
/**************/
if (key0!=0 )//判断功能键是否按下去
{
if(key1==0)
{
xunhuan(20);
if(key1==0) //按键的加位
{
while(!key1);
/*********************///秒
if(key0sum==1) //若功能键按下时一次,说明 光标移到秒
{
miao++;
if(miao==60)
miao=0;
write_wei(10,miao);// 将位和数送到秒
write_e(0x80+0x40+10);
}
/***************************/ //分
if(key0sum==2) //若功能键按下时一次,说明移到分
{
fen++;
if(fen==60)
fen=0;
write_wei(7,fen);// 将位和数送到fen
write_e(0x80+0x40+7);
}
/****************/ //时
if(key0sum==3) //若功能键按下时一次,说明移到分
{
shi++;
if(shi==60)
shi=0;
write_wei(4,shi);// 将位和数送到fen
write_e(0x80+0x40+4);
}
}
}
}
}
void main()
{
uint m;
init();
write_e(0x80);
for(m=0;m<16;m++)
{
write_f(a[m]);
xunhuan(5);
}
while(1)
{
keysan();
}
}
void T0_timer () interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
g++;
if(g==20)
{
g=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_wei(4,shi);
}
write_wei(7,fen);
}
write_wei(10,miao);
}
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
奥蕾达
2024-11-14 广告
2024-11-14 广告
如果说原理的话,液晶是起到一个开关的作用。好比水龙头控制水量,液晶控制着光的通过量。 1 A:透明的不是液晶,而是整个显示系统。液晶显示器中的液晶显示系统在未浮花第拘郢饺电邪钉矛通电时是透明的(而且是Normaly White模式的)。 2...
点击进入详情页
本回答由奥蕾达提供
展开全部
已发。请接收
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看郭天祥的十天学会单片机视频 里面有介绍
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询