📄 jsq.c
字号:
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ComDat P2 //命令或数据线
sbit RS=P3^0; //RS为寄存器选择,1=数据寄存器、0=指令寄存器。
sbit RW=P3^1; //RW为读写信号线,1=读操作,0=写操作。
//当RS=RW=0可以写入指令或者显示地址,
//当RS=0,RW=1可以读忙信号,
//当RS=1,RW=0可以写入数据。
sbit EN=P3^2; //当en端由高电平跳变成低电平时,液晶模块执行命令。
sbit led=P0^3; //照明
sbit busy=P2^7; //忙指示
uchar code table[]=
{
'0','1','2','3',
'4','5','6','7',
'8','9',0x20,'=',
'+','-','*','/'
};
uchar temp,num,m,n,x,y,i; //定义变量
uchar a,b,c; //定义运算变量
uchar saomiao(); //定义扫描函数
void delay1(uchar); //定义延时函数
void delay(); //定义液晶忙程序
void WriComm(uchar); //定义写控制函数
void WriData(uchar); //定义写数据函数
void chushihua();
void main()
{
chushihua();
while(1)
{ saomiao(); //扫描键盘
if(x==1)
{ x=0;
m++; //控制第一行显示
n++; //控制第二行显示
delay1(255);
WriData(num);
if(num==10)
{
WriComm(0x01);//清零
a=b=c=0;
}
if(num<10)
{ i++;
if(i==1)
a=num;
else
{
a=a*10+num;
i=0;
}
}
if(num==12)
b=a;
else if(num==13)
b=a;
else if(num==14)
b=a;
else if(num==15)
b=a;
if(num==11)
{ if(y==1)
{ y=0;
c=b+a;
}
else if(y==2)
{ y=0;
c=b-a;
}
else if(y==3)
{ y=0;
c=b*a;
}
else if(y==4)
{ y=0;
c=b/a;
}
delay1(255);
WriData(c/10);
WriData(c%10);
a=b=c=0;
}
if(m==16)
{ m=0;
WriComm(0xc0);
}
if(n==32)
{ n=0;
WriComm(0x80);
}
//-----------------------------------------------
}
}
}
//--------------------初始化-----------------------------
void chushihua()
{
led=0; //开背光
delay1(5);
WriComm(0x01); //清屏并光标复位
WriComm(0x38); //设置显示模式:8位2行5x7点阵
WriComm(0x0c); //显示器开、光标关、光标禁止闪烁
WriComm(0x14); //文字不动,光标自动右移
WriComm(0x80);
}
//-------------延时子程序---------------------------------------
void delay1(uchar z)
{
uchar a,b;
for(a=z;a>0;a--)
for(b=255;b>0;b--);
}
//---判断液晶显示器是否忙------------
void delay()
{
do
{
ComDat=0xff; //判断液晶显示器是否忙的子程序
RS=0;
RW=1;
EN=0;
_nop_();
EN=1;
}
while(busy); //busy为高电平表示忙,循环等待
}
//---写命令--------------------------
void WriComm(uchar Com)
{
ComDat=Com;
RS=0; //写入控制命令的子程序
RW=0;
EN=0;
delay(); //等待
EN=1;
}
//---写数据------------------------------
void WriData(uchar k)
{
ComDat=table[k];
RS=1;
RW=0; //准备写入数据
EN=0; //执行显示命令
delay(); //判断液晶模块是否忙
EN=1;
}
//----------------键盘扫描程序---------------------------
uchar saomiao()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ x=1;
delay1(50);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0: num=0;
break;
case 0xd0: num=1;
break;
case 0xb0: num=2;
break;
case 0x70: num=3;
break;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ x=1;
delay1(50);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0: num=4;
break;
case 0xd0: num=5;
break;
case 0xb0: num=6;
break;
case 0x70: num=7;
break;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ x=1;
delay1(50);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0: num=8;
break;
case 0xd0: num=9;
break;
case 0xb0: num=10; //清零返回值
break;
case 0x70: num=11;//等于返回
break;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ x=1;
delay1(50);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0: num=12;y=1;
break;
case 0xd0: num=13;y=2;
break;
case 0xb0: num=14;y=3;
break;
case 0x70: num=15;y=4;
break;
}
}
}
return num,x,y;
}
//--------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -