⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsq.c

📁 自己设计的基于51单片机的简易电子词典
💻 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 + -