C51单片机实现液晶秒表以及简单计算器C51单片机制作.docx
《C51单片机实现液晶秒表以及简单计算器C51单片机制作.docx》由会员分享,可在线阅读,更多相关《C51单片机实现液晶秒表以及简单计算器C51单片机制作.docx(13页珍藏版)》请在冰豆网上搜索。
![C51单片机实现液晶秒表以及简单计算器C51单片机制作.docx](https://file1.bdocx.com/fileroot1/2023-1/8/dc90708f-89ec-46cf-85fe-d389745e299e/dc90708f-89ec-46cf-85fe-d389745e299e1.gif)
C51单片机实现液晶秒表以及简单计算器C51单片机制作
[转]C51单片机实现液晶秒表以及简单计算器-----C51单片机制作2011.3.15阅读(0)下一篇:
51单片机C语言编...|返回日志列表赞赞赞赞转载(22)分享评论复制地址编辑
电路图比较简单,是一个51最小系统,没有采用总线方式,而简单的连线方式,上有4*4矩阵键盘,一数码管,89S51单片机,串口下载线,数码管显示锁存芯片\蜂鸣器\1602液晶.
因为最近考试太多,刚刚考试完又课程设计,桌子上太混乱,原理图没有找到.所以就先贴上代码.
此代码已经调试成功过,可以实现时间的调整.4*4矩阵键盘,第一排前三列是实现小时\分钟\秒的加.第二排前三列是实现小时\分钟\秒的减.当然还可以通过设置矩阵键盘的键值,来实现加\减\乘\除四则运算,由数码管显示参与运算的数字以及最终的运算结果.其他的不多说了,等下次我把图贴上,大家勉强可以拿去研究下.其实硬件很简单,不详细说问题也不大的.
#include
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
uchartemp1;
voiddisplayListChar(unsignedcharX,unsignedcharY,ucharDData);
uchardispbuf[]={'0','1','2','3','4','5','6','7','8','9',':
'};
ucharsecond;
ucharminute;
ucharhour;
uinttcnt,g;
ucharflag;
voiddlms(void);
ucharkbscan(void);
voidShow_Time(void);
voiddelay5ms(void);
voiddlms(void);
voidSettime(ucharverify);//verify在这里为调整的意思
voiddelay400ms(void);
///#definebusy0x80file:
//用/于检测LCD状态字中的Busy标识
///#defineRSaddr0x1000
///#defineRWaddr0x2000
///#defineCSaddr0x0400
#definewc0x8fff
#definewd0xdfff
#definerc0xbfff
voidwaitLcd()//justwaituntil液晶不忙为止
{
chartemp;
bitflag=1;
while(flag==1)
{
temp=XBYTE[rc];
if(temp>>7==0)flag=0;
P1=temp;
}
P1=0xff;
}
//justwaituntil液晶不忙为止
voidWriteCommand_Lcd(bitisCheck,charc)
{
if(isCheck==1)waitLcd();
XBYTE[wc]=c;
}
voidwritedata(charc)
{
waitLcd();
XBYTE[wd]=c;
}
voidLcdInit()
{
delay5ms();
delay5ms();
delay5ms();
WriteCommand_Lcd(0,0x38);//三次显示模式设置,不检测忙信号
delay5ms();
WriteCommand_Lcd(0,0x38);
delay5ms();
WriteCommand_Lcd(0,0x38);
delay5ms();
WriteCommand_Lcd(1,0x38);//显示模式设置,开始要求每次检测忙信号,8位2行5*7
WriteCommand_Lcd(1,0x08);//关闭显示
WriteCommand_Lcd(1,0x01);//清显示
WriteCommand_Lcd(1,0x06);//文字不动,光标右移
WriteCommand_Lcd(1,0x0C);//显示开及光标设置
}
voiddisplayListChar(unsignedcharX,unsignedcharY,ucharDData)
{
Y&=0x1;
X&=0xF;
if(X<=0xF)
{
Y&=0x1;
X&=0xF;
if(Y)X|=0x40;
X|=0x80;
WriteCommand_Lcd(0,X);
writedata(dispbuf[DData]);
}
}
voidShow_Time(unitk)
{
displayListChar(0,0,hour/10);
displayListChar(1,0,hour%10);
displayListChar(2,0,10);
displayListChar(3,0,minute/10);
displayListChar(4,0,minute%10);
displayListChar(5,0,10);
displayListChar(6,0,second/10);
displayListChar(7,0,second%10);
switch(k)
{
case1:
displayListChar(0,1,1);
case2:
displayListChar(0,1,2);
case3:
displayListChar(0,1,3);
case4:
displayListChar(0,1,4);
case5:
displayListChar(0,1,5);
case6:
displayListChar(0,1,6);
case7:
displayListChar(0,1,7);
case8:
displayListChar(0,1,8);
case9:
displayListChar(0,1,9);
case10:
displayListChar(0,1,10);
case11:
displayListChar(0,1,11);
case12:
displayListChar(0,1,12);
case13:
displayListChar(0,1,13);
case14:
displayListChar(0,1,14);
case15:
displayListChar(0,1,15);
case16:
displayListChar(0,1,16);
}
voidSettime(ucharverify)
{
//键盘设置
//1/hour+(0xee)2/minute+0xde3/second+0xbe+
//4/hour-0xed5/minute-0xdd6/second-0xbd-
//789*
//0CLR=/
////hour+的代码
if(flag)
{
if(verify==0xee)
{
dlms();
if(verify==0xee)
{
hour++;
if(hour==24)
{
hour=0;
}
//while(verify==0xee);
verify=0x00;
}
//1/hour+(0xee)2/minute+0xde3/second+0xbe
}
///minute+的代码
elseif(verify==0xde)
{
dlms();
if(verify==0xde)
{
minute++;
if(minute==60)
{
minute=0;
}
//while(verify==0xde);
verify=0x00;
}
//1/hour+(0xee)2/minute+0xde3/second+0xbe
}
//////second++的代码
elseif(verify==0xbe)
{
dlms();
if(verify==0xbe)
{
second++;
if(second==60)
{
sec;
}
//while(verify==0xbe);
verify=0x00;
}
//1/hour+(0xee)2/minute+0xde3/second+0xbe
}
//////hour-(0xed)的代码
elseif(verify==0xed)
{
dlms();
if(verify==0xed)
{
if(hour==0)
{hour=24;
}
hour--;
//if(hour==0)
//{
//hour=23;
//}
//while(verify==0xed);
verify=0x00;
}
}
//4/hour-0xed5/minute-0xdd6/second-0xbd
///下面为minute-的代码
elseif(verify==0xdd)
{
dlms();
if(verify==0xdd)
{if(minute==0)
{minute=60;}
minute--;
//if(minute==0)
//{
//minute=59;
//}
//while(verify==0xdd);
verify=0x00;
}
}
//4/hour-0xed5/minute-0xdd6/second-0xbd
///下面为second-的代码
elseif(verify==0xbd)
{
dlms();
if(verify==0xbd)
{if(second==0)
{sec;}
second--;
//if(second==0)
//{
//sec;
//}
//while(verify==0xbd);
verify=0x00;
}
//4/hour-0xed5/minute-0xdd6/second-0xbd
}
}
}
voidmain(void)
{
TMOD=0x02;//置自动重装载模式
TH0=0x06;//设初值
TL0=0x06;//设初值
TR0=1;//开始计数
ET0=1;//开定时器/计数器
EA=1;//中断开
delay400ms();//启动等待,等LCM讲入工作状态
LcdInit();//LCM初始化
while
(1)
{
ucharkey;
key=kbscan();
dlms();
Show_Time();
//if((key==0xee)||(key==0xbe)||(key==0xde)||(key==0xed)||(key==0xdd)||(key==0xbd))
if(key!
=0)
{
if(key==0x7e)
{
dlms();
if(key==0x7e)
{
EA=0;
flag=1;
}
//while(verify==0xee);
key=0x00;
}
if(key==0x7d)
{
dlms();
if(key==0x7d)
{
EA=1;
flag=0;
}
//while(verify==0xee);
key=0x00;
}
Settime(key);
delay400ms();
}
}
}
voiddelay5ms(void)
{
unsignedintTempCya=277;
while(--TempCya);
}
//延时400ms
voiddelay400ms(void)
{
unsignedintTempCya=22160;
while(--TempCya);
}
//延时400ms
voidtimer0(void)interrupt1using1
{
tcnt++;
if(tcnt==2000)
{
tcnt=0;
second++;
if(second==60)
{
sec;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
//键盘扫描
ucharkbscan(void)
{
ucharsccode;
P1=0xf0;
if((P1&0xf0)!
=0xf0)
{
dlms();
if((P1&0xf0)!
=0xf0)
{
sccode=0xfe;
while((sccode&0x10)!
=0)
{
P1=sccode;
if((P1&0xf0)!
=0xf0)
{
temp1=P1;
returntemp1;
}
else
{
sccode=(sccode<<1)|0x01;
}
}
}
}
return(0);
}
voiddlms(void)
{
g=554;
while(g--);//延时10mS钟