单片机c语言按键闪烁位设定,单片机1602液晶怎样移屏?怎么设置光标闪烁?谁有没有这样的C程序?...

#include

#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);

}

}

取消

评论

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值