📄 计算器程序.c
字号:
#include<reg51.h>
#include<stdio.h>
#include<stdlib.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp1;
void displaylistchar(unsigned char x, unsigned char y, uchar ddata);
uchar dispbuf[]={'0','1','2','3','4','5','6','7','8','9',':'};
uchar second;
uchar minute;
uchar hour;
uint tcnt,g;
uchar flag;
void dlms(void);
uchar kbscan(void);
void show_time(void);
void delay5ms(void);
void dlms(void);
void settime(uchar verify);//verify 在这里为调整的意思
void delay400ms(void) ;
///#define busy 0x80 file://用/于检测lcd状态字中的busy标识
///#define rsaddr 0x1000
///#define rwaddr 0x2000
///#define csaddr 0x0400
#define wc 0x8fff
#define wd 0xdfff
#define rc 0xbfff
void waitlcd() //just wait until 液晶不忙为止
{
char temp;
bit flag=1;
while(flag==1)
{
temp=xbyte[rc];
if (temp>>7==0) flag=0;
p1=temp;
}
p1=0xff;
}
//just wait until 液晶不忙为止
void writecommand_lcd(bit ischeck,char c)
{
if (ischeck==1) waitlcd();
xbyte[wc]=c;
}
void writedata(char c)
{
waitlcd();
xbyte[wd]=c;
}
void lcdinit()
{
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); // 显示开及光标设置
}
void displaylistchar(unsigned char x, unsigned char y, uchar ddata)
{
y &= 0x1;
x &= 0xf;
if (x <= 0xf)
{
y &= 0x1;
x &= 0xf;
if (y) x |= 0x40;
x |= 0x80;
writecommand_lcd(0,x);
writedata(dispbuf[ddata]);
}
}
void show_time(unit k)
{
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)
{
case 1: displaylistchar(0,1,1);
case 2: displaylistchar(0,1,2);
case 3: displaylistchar(0,1,3);
case 4: displaylistchar(0,1,4);
case 5: displaylistchar(0,1,5);
case 6: displaylistchar(0,1,6);
case 7: displaylistchar(0,1,7);
case 8: displaylistchar(0,1,8);
case 9: displaylistchar(0,1,9);
case 10:displaylistchar(0,1,10);
case 11:displaylistchar(0,1,11);
case 12:displaylistchar(0,1,12);
case 13:displaylistchar(0,1,13);
case 14:displaylistchar(0,1,14);
case 15:displaylistchar(0,1,15);
case 16:displaylistchar(0,1,16);
}
void settime(uchar verify)
{
//键盘设置
// 1 /hour+ (0xee) 2/minute+ 0xde 3/second+ 0xbe +
// 4/hour- 0xed 5/ minute- 0xdd 6/second- 0xbd -
// 7 8 9 *
// 0 clr = /
////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+ 0xde 3/second+ 0xbe
}
///minute +的代码
else if (verify==0xde)
{
dlms();
if (verify==0xde)
{
minute++;
if(minute==60)
{
minute=0;
}
//while(verify==0xde);
verify=0x00;
}
// 1 /hour+ (0xee) 2/minute+ 0xde 3/second+ 0xbe
}
//////second++的代码
else if (verify==0xbe)
{
dlms();
if (verify==0xbe)
{
second++;
if(second==60)
{
second=0;
}
// while(verify==0xbe);
verify=0x00;
}
// 1 /hour+ (0xee) 2/minute+ 0xde 3/second+ 0xbe
}
//////hour- (0xed) 的代码
else if (verify==0xed)
{
dlms();
if (verify==0xed)
{
if(hour==0)
{hour=24;
}
hour--;
// if(hour==0)
// {
// hour=23;
//}
//while(verify==0xed);
verify=0x00;
}
}
// 4/hour- 0xed 5/ minute- 0xdd 6/second- 0xbd
///下面为minute -的代码
else if (verify==0xdd)
{
dlms();
if (verify==0xdd)
{ if(minute==0)
{minute=60;}
minute--;
//if(minute==0)
//{
// minute=59;
//}
//while(verify==0xdd);
verify=0x00;
}
}
// 4/hour- 0xed 5/ minute- 0xdd 6/second- 0xbd
///下面为second -的代码
else if (verify==0xbd)
{
dlms();
if (verify==0xbd)
{ if(second==0)
{second=60;}
second--;
//if(second==0)
//{
// second=59;
//}
// while(verify==0xbd);
verify=0x00;
}
// 4/hour- 0xed 5/ minute- 0xdd 6/second- 0xbd
}
}
}
void main(void)
{
tmod=0x02; //置自动重装载模式
th0=0x06; //设初值
tl0=0x06; //设初值
tr0=1; //开始计数
et0=1; //开定时器/计数器
ea=1; //中断开
delay400ms();//启动等待,等lcm讲入工作状态
lcdinit(); //lcm初始化
while(1)
{
uchar key;
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();
}
}
}
void delay5ms(void)
{
unsigned int tempcya = 277;
while(--tempcya);
}
//延时400ms
void delay400ms(void)
{
unsigned int tempcya = 22160;
while(--tempcya);
}
//延时400ms
void timer0(void) interrupt 1 using 1
{
tcnt++;
if(tcnt==2000)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
//键盘扫描
uchar kbscan(void)
{
uchar sccode;
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;
return temp1;
}
else
{
sccode=(sccode<<1)|0x01;
}
}
}
}
return (0);
}
void dlms(void)
{
g=554;
while(g--); //延时10ms钟
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -