📄
字号:
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define Send_data_buff_num 50 //发送和接收缓冲区的
#define LCDCOM0 XBYTE[0Xe000] //写状态地址
#define LCDCOM1 XBYTE[0Xe000] //读状态地址
#define LCDDATA XBYTE[0Xe800] //写数据地址
#define LCDDATA_READ XBYTE[0Xe800] //读数据地址
#define control XBYTE[0x8003]
#define counter0 XBYTE[0x8000]
#define counter1 XBYTE[0x8001]
#define counter2 XBYTE[0x8002]
sbit bflag=ACC^7;
void dlms(void);
char kbscan(void);
/****************************************************************
//等待1602忙标志位
**************************************************************/
void wait(void)
{
do{ACC=LCDCOM1;}
while(bflag==1);
}
/****************************************************************
液晶显示初始化
********************************************************/
void init_lcd() {
wait();
LCDCOM0=0x38; /*置功能;2行,5*7字符 */
wait();
LCDCOM0=0x06; /*置输入模式:地址增量,显示屏不移动*/
wait();
LCDCOM0=0x0c; /*显示开0x0d,显示光标,光标闪烁*/
wait();
LCDCOM0=0x01; /*清显示 */
}
/****************************************************************
发送新命令,一般用于给出新的显示地址
***************************************************************/
void init_command(uchar command)
{
wait();
LCDCOM0=command; /*首行地址0x80~0xa7,次行地址0xc0~0xe7*/
}
/************************** 显示字符函数*****************************************/
void d_char(char a)
{ wait();
LCDDATA=a;
} /*输出到数据寄存器*/
/****************************************************************
延时
****************************************************************/
void dlms(void)
{char i;
for(i=200;i>0;i--){}
}
/**********************************************************
键盘扫描
********************************************************************/
char kbscan(void)
{
char sccode,recode;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
dlms();
if((P1&0xf0)!=0xf0)
{
sccode=0xfe;
while((sccode&0x10)!=0) //不到最后一行,循环
{
P1=sccode;
if((P1&0xf0)!=0xf0)
{
recode=(P1&0xf0)|0x0f;
return(sccode&recode);
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return(0);
}
/****************************************************************
8253初始化
****************************************************************/
void init_8253(void)
{ //control=0x34;
//counter0=0x0a;
//counter0=0x00;
control=0x74;
counter1=0x00;
counter1=0x48;
}
/****************************************************************
主函数
****************************************************************/
main()
{ int b,i,j=0,k=0,m=0,aflag=0;
int r[4]=0; //定义变量
uchar key,num;
uchar idata Receive_data[Send_data_buff_num]={0}; //定义接收数组
init_8253();
init_lcd(); //调用液晶初
init_command(0xc4); //在第一行中间显示PLL
d_char(0x50);
d_char(0x4c);
d_char(0x4c);
while(aflag==0)
{
while(kbscan()==0){};
num=kbscan();
switch(num)
{
case 0x7e:key=0x31;r[k++]=1;break; //1
case 0xbe:key=0x32;r[k++]=2;break;
case 0xde:key=0x33;r[k++]=3;break;
case 0x7d:key=0x34;r[k++]=4;break;
case 0xbd:key=0x35;r[k++]=5;break;
case 0xdd:key=0x36;r[k++]=6;break;
case 0x7b:key=0x37;r[k++]=7;break;
case 0xbb:key=0x38;r[k++]=8;break;
case 0xdb:key=0x39;r[k++]=9;break; //9
case 0xb7:key=0x30;r[k++]=0;break; //0
case 0xed:key=0x4d; break; //m
case 0xeb:key=0x4e;break; //n
case 0xe7:key=0x7f; //回车
m=r[3]+10*r[2]+100*r[1]+r[0]*1000;
control=0x34;
counter0=m&255;
counter0=m>>8;
//aflag=0;
break;
case 0xd7:key=0x2e;break; //.
case 0x77:key=0x3d;break; //=
case 0xee:key=0xfe;aflag=1;break; //清零
default:break;
}
Receive_data[j++]=key;
init_command(0x80); //显示器第一行
for(i=0;i<=j;i++)
{
d_char(Receive_data[i]);
}
if(j>=15)
{j=0;i=0;
for(b=0;b<=15;b++)
Receive_data[b]=0;
}
for(i=0;i<=30000;i++){;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -