久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
LCD1602顯示可調時鐘+protues仿真
[打印本頁]
作者:
lzDestiny
時間:
2018-10-6 16:14
標題:
LCD1602顯示可調時鐘+protues仿真
LCD1602顯示可調時鐘+protues仿真,心新學lcd1602的可以借鑒一下,大佬請繞道,歡迎指錯
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(16.42 KB, 下載次數: 90)
下載附件
2018-10-7 00:18 上傳
單片機源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,count,S1num,xqnum;
char yue,ri,shi,fen,miao;
int nian;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
sbit S1=P2^4; //定義鍵——進入設置
sbit S2=P2^5; //定義鍵——增大
sbit S3=P2^6; //定義鍵——減小
sbit S4=P2^7; //定義鍵——退出設置
uchar code table0[]="2018-10-6 FRI";
uchar code table1[]="00:00:00";
uchar code xingqi[][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
void delay(uint z) //延時1ms的程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**************************************************
1602液晶顯示器模塊
sbit lcdrs=P2^5;
sbit lcdrw=P2^4;
sbit lcden=P2^3;
*************************************************/
void write_com(uchar com) //液晶寫指令
{
lcdrw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar dat) //液晶寫數據
{
lcdrw=0;
lcdrs=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/********************************************
年月日寫入1602函數
********************************************/
void write_sfm(uchar add,uchar dat) //寫時分秒函數
{
uchar shi,ge;
shi=dat/10;
ge=dat%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_yr(uchar add,uchar dat) //寫月日函數
{
uchar shi,ge;
shi=dat/10;
ge=dat%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_nian(uchar add,uint dat) //寫年函數
{
uint qian,bai,shi,ge;
qian=dat/1000;
bai=dat%1000/100;
shi=dat%100/10;
ge=dat%10;
write_com(0x80+add);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
/***************************************************
初始化
***************************************************/
void init_lcd() //液晶初始化
{
lcden=0;
nian=2014;
yue=8;
ri=13;
shi=0; //初始shi、fen、miao
fen=0;
miao=0;
write_com(0x38); //設置16x2顯示,5x7點陣,8位數據口
write_com(0x0c); //設置開顯示,不顯示光標
write_com(0x06); //寫一個字符后地址指針加1
write_com(0x01); //顯示清0,數據指針清0
}
void init() //初始化函數
{
init_lcd(); //液晶初始化
write_com(0x80); //設置顯示初始坐標
for(a=0;a<14;a++) //顯示年月日初始值
{
write_data(table0[a]);
delay(5);
}
write_com(0x80+0x40); //設置顯示初始坐標
for(a=0;a<8;a++) //顯示時分秒初始值
{
write_data(table1[a]);
delay(5);
}
write_nian(0,nian);
write_sfm(6,miao); //分別將shi、fen、miao送去液晶顯示
write_sfm(3,fen);
write_sfm(0,shi);
count=0;
xqnum=0;
S1num=0; //初始化全局變量count
TMOD=0x01; //設置定時器0工作模式1
TH0=(65535-50000)/256; //定時器裝初始值
TL0=(65535-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
}
/**************************************************
獨立鍵盤
sbit S1=P3^0; //定義鍵——進入設置
sbit S2=P3^1; //定義鍵——增大
sbit S3=P3^2; //定義鍵——減小
sbit S4=P3^3; //定義鍵——退出設置
獨立鍵盤已接地
*************************************************/
void keyscan()
{
if(S1==0)
{
delay(5); //確認定義鍵被按下
if(S1==0)
{
S1num++; //定義鍵S1按下次數記錄
while(!S1); //釋放按鍵確認
if(S1num==1) //S1按下一次時
{
TR0=0; //關閉定時器
write_com(0xc0+7); //光標定位到秒位置
write_com(0x0f); //光標閃爍
}
if(S1num==2) //S1按下兩次時
{
write_com(0xc0+4); //光標定位到分位置
}
if(S1num==3) //S1按下三次時
{
write_com(0xc0+1); //光標定位到時位置
}
if(S1num==4) //S1按下四次時
{
write_com(0x80+13); //光標定位到星期位置
}
if(S1num==5) //S1按下五次時
{
write_com(0x80+9); //光標定位到日位置
}
if(S1num==6) //S1按下六次時
{
write_com(0x80+6); //光標定位到月位置
}
if(S1num==7) //S1按下七次時
{
write_com(0x80+3); //光標定位到年位置
}
if(S1num==8) //S1按下八次時
{
S1num=0; //S1記錄按鍵次數清零
TR0=1; //開啟定時器
write_com(0x0c); //取消光標閃爍
}
}
}
if(S1num!=0) //只有定義鍵按下后S2、S3、S4才有效
{
if(S2==0)
{
delay(5); //防抖
if(S2==0) //確認按鍵被按下
{
while(!S2); //釋放按鍵確認
if(S1num==1) //S1按下一次時
{
miao++; //調整秒加1
if(miao==60) //滿60清零
miao=0;
write_sfm(6,miao); //每調節一次送液晶顯示一次
write_com(0x80+0x40+6); //顯示位置重新回到調節處
}
if(S1num==2) //S1按下兩次時
{
fen++; //調整分加1
if(fen==60)
fen=0;
write_sfm(3,fen);
write_com(0x80+0x40+3);
}
if(S1num==3) //S1按下三次時
{
shi++; //調整時加1
if(shi==24)
shi=0;
write_com(0x80+0x40);
write_sfm(0,shi);
}
if(S1num==4) //星期加調整
{
xqnum++;
if(xqnum==7)
xqnum=0;
write_com(0x80+0x0b);
for(a=0;a<3;a++)
{
write_data(xingqi[xqnum][a]);
delay(5);
}
}
if(S1num==5) //日加調整
{
ri++;
if(yue==2)
{
if(nian%4==0&&nian%100!=0||nian%400==0)
{
if(ri==30)
{
ri=1;
}
}
if(nian%400!=0)
{
if(ri==29)
{
ri=1;
}
}
}
else if(yue<=7)
{
if(yue%2==0&yue!=2)
{
if(ri==31)
{
ri=1;
}
}
else if(yue%2!=0&yue!=2)
{
if(ri==32)
{
ri=1;
}
}
}
else if(yue>=8)
{
if(yue%2==0)
{
if(ri==32)
{
ri=1;
}
}
else if(yue%2!=0)
{
if(ri==31)
{
ri=1;
}
}
}
write_yr(8,ri);
}
if(S1num==6) //月加調整
{
yue++;
if(yue==13)
yue=1;
write_yr(5,yue);
}
if(S1num==7) //年加調整
{
nian++;
if(nian==2019)
nian=2014;
write_nian(0,nian);
}
}
}
if(S3==0)
{
delay(5);
if(S3==0) //確認按鍵被按下
{
while(!S3);
if(S1num==1)
{
miao--; //調整秒減1
if(miao==-1) //減到00后再減重新設置為59
miao=59;
write_sfm(6,miao);
write_com(0x80+0x40+6);
}
if(S1num==2)
{
fen--; //調整分減1
if(fen==-1)
fen=59;
write_sfm(3,fen);
write_com(0x80+0x40+3);
}
if(S1num==3)
{
shi--; //調整時減1
if(shi==-1)
shi=23;
write_sfm(0,shi);
write_com(0x80+0x40);
}
if(S1num==4)
{
xqnum--; //調整星期減一
if(xqnum==-1)
xqnum=6;
write_com(0x80+0x0b);
for(a=0;a<3;a++)
{
write_data(xingqi[xqnum][a]);
delay(5);
}
}
if(S1num==5) //調整日
{
ri--;
if(yue==2)
{
if(nian%400==0)
{
if(ri==0)
{
ri=29;
}
}
if(nian%400!=0)
{
if(ri==0)
{
ri=28;
}
}
}
else if(yue==4|6|9|11)
{
if(yue%2==0&yue!=2)
{
if(ri==0)
{
ri=30;
}
}
else if(yue%2!=0&yue!=2)
{
if(ri==0)
{
ri=31;
}
}
}
else if(yue>=8)
{
if(yue%2==0)
{
if(ri==0)
{
ri=31;
}
}
else if(yue%2!=0)
{
if(ri==0)
{
ri=30;
}
}
}
write_yr(8,ri);
}
if(S1num==6) //調整月
{
yue--;
if(yue==0)
yue=12;
write_yr(5,yue);
}
if(S1num==7) //調整年
{
nian--;
if(nian==2013)
nian=2018;
write_nian(0,nian);
}
}
}
if(S4==0) //退出設置、開啟中斷
{
delay(5);
if(S4==0)
{
S1num=0;
TR0=1;
write_com(0x0c);
}
}
}
}
/**************************************************
定時器0
*************************************************/
void timer0() interrupt 1 //定時器0中斷服務程序
{
TH0=(65535-50000)/256; //重裝定時器初始值
TL0=(65535-50000)%256;
count++; //中斷次數累加
}
/*************************************************
主函數
*************************************************/
void main()
{
init();
while(1)
{
keyscan();
if(count==20) //20次50毫秒即一秒
{
count=0;
miao++;
if(miao==60) //秒加到60時分進位
{
miao=0;
fen++;
if(fen==60) //分加到60時時進位
{
fen=0;
shi++;
if(shi==24) //時加到24時清0
{
shi=0;
xqnum++;
ri++;
if(yue==2) //如果是二月
{
if(nian%400==0) //閏年判斷
{
if(ri==30)
{
ri=1;
yue++;
write_yr(5,yue);
}
}
if(nian%400!=0) //平年判斷
{
if(ri==29)
{
ri=1;
yue++;
write_yr(5,yue);
}
}
}
else if(yue<=7&yue!=2) //一月到七月
{
if(yue%2==0) //偶數月(除二月)
{
if(ri==31)
{
ri=1;
yue++;
}
}
else if(yue%2!=0) //奇數月
{
if(ri==32)
{
ri=1;
yue++;
}
}
write_yr(5,yue);
}
else if(yue>=8) //八月到12月
{
if(yue%2==0) //偶數月(除二月)
{
if(ri==32)
{
ri=1;
yue++;
if(yue==13) //如果判斷月份為12月,則加一后重新定義月份為1
{
yue=1;
nian++;
write_nian(0,nian);
}
write_yr(5,yue);
}
}
else if(yue%2!=0) //奇數月
{
if(ri==31)
{
ri=1;
yue++;
write_yr(5,yue);
}
}
}
write_yr(8,ri);
if(xqnum==7) //星期寫入
xqnum=0;
write_com(0x80+0x0b);
for(a=0;a<3;a++)
{
write_data(xingqi[xqnum][a]);
delay(5);
}
}
write_sfm(0,shi); //重新寫入數據
}
write_sfm(3,fen); //重新寫入數據
}
write_sfm(6,miao); //重新寫入數據
} //不停的檢測按鍵是否被按下
}
}
復制代碼
所有資料51hei提供下載:
LCD時鐘設計.zip
(29.79 KB, 下載次數: 152)
2018-10-6 16:12 上傳
點擊文件名下載附件
LCD時鐘+protues
下載積分: 黑幣 -5
作者:
zhaozhenrong
時間:
2018-10-15 10:37
z這個可以有,謝謝!
作者:
gzxgzx
時間:
2018-11-15 09:06
zhaozhenrong 發表于 2018-10-15 10:37
z這個可以有,謝謝!
這是對的嗎?
作者:
gzxgzx
時間:
2018-11-15 10:31
感謝大哥
作者:
不二lqh
時間:
2018-11-15 17:08
仿真可以,但在keil里運行會報錯,顯示找不到文件
作者:
zmalqp1331
時間:
2018-12-19 15:34
先下一個試試,謝謝了
作者:
778!
時間:
2020-6-14 11:52
51黑電子論壇
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
中文字幕少妇
|
黑人一级黄色片
|
天天干天天操天天
|
日韩欧美国产高清91
|
国产欧美一区二区精品性色超碰
|
18视频在线观看
|
成人福利视频在线观看
|
香蕉视频免费
|
亚洲精品一区二区在线观看
|
国产91在线看
|
日韩中文字幕视频
|
日韩免费在线视频
|
免费观看全黄做爰视频
|
国模无码大尺度一区二区三区
|
av影院在线
|
国产视频h
|
亚洲少妇一区
|
成人午夜视频在线观看
|
超碰在线视屏
|
国产免费一区二区三区免费视频
|
亚洲三级黄色片
|
黄色在线播放
|
国语对白做受欧美
|
午夜在线
|
日本黄色一级视频
|
性高潮久久久久久久
|
欧美日韩中文字幕在线观看
|
h片免费看
|
国产精品福利在线
|
亚洲日本欧美
|
天堂中文在线视频
|
国产一区二区网站
|
91成人国产
|
69视频在线观看
|
国产黄色一级片
|
中文字幕日韩高清
|
久久一级视频
|
亚洲二区在线
|
久久久免费精品视频
|
国产欧美视频在线观看
|
天天色影院
|