#define uchar unsigned char #define uint unsigned int
uchar key,sym,sumsz[13],adders=0; // 定义变量 float sum,number1=0,number2=0; // 定义变量
bit flag=0; // 定义位变量标志位 sbit lcdrs=P2^0; // 定义液晶的读IO口 sbit lcdwr=P2^1; // 定义液晶的写IO口 sbit lcden=P2^2; // 定义液晶的使能IO口 uchar
lcd_s[]={'0','1','2','3','4','5','6','7','8','9','+','-','*',0xfd,'.','='};//
void keyscan(); //函数声明 void delayms(uchar z); void write_com(uchar com); void write_data(uchar dat); void init(); void delay(int z); bit buzz(); void yuans(); void clear();
/***********************主函数*****************************/ void main()
{
init(); //液晶初始化 while(1) //循环函数 {
keyscan(); //调用键盘扫描函数 } }
/**********************键盘扫面*************************/ void keyscan() {
uchar temp=0;
P1=0xfe; //第1次判断函数 temp=P1;
temp=temp&0xf0; if(temp!=0xf0) {
delayms(15); temp=P1;
temp=temp&0xf0;
if(temp!=0xf0) { temp=P1;
adders++; //确定按键按下,执行if函数 switch(temp) {
case 0xee:
key=1;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break;//显示字符1,并记入相加的变量 case 0xde:
key=2;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break;//显示字符2,并记入相加的变量 case 0xbe:
key=3;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break;//显示字符3,并记入相加的变量
case 0x7e: key=10;write_data(lcd_s[key]);sym='+';flag=1; break;//显示'+'号,并将sym付'+' }
while((P1&0xf0)!=0xf0); //等待按键释放 }
}
P1=0xfd; //第2次判断 temp=P1;
temp=temp&0xf0; if(temp!=0xf0) {
delayms(15); temp=P1;
temp=temp&0xf0; if(temp!=0xf0)
{ temp=P1;adders++; //确定按键按下,执行if函数 switch(temp) {
case 0xed:
key=4;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;//显示字符4,并记入相加的变量 case 0xdd:
key=5;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;//显示字符5,并记入相加的变量 case 0xbd:
key=6;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break; //显示字符6,并记入相加的变量
case 0x7d: key=11;write_data(lcd_s[key]);sym='-';flag=1; break;//显示'-'号,并将sym付'-' }
while((P1&0xf0)!=0xf0); }
}
P1=0xfb; //第3次判断 temp=P1;
temp=temp&0xf0; if(temp!=0xf0) {
delayms(15); temp=P1;
temp=temp&0xf0; if(temp!=0xf0)
{ temp=P1;adders++; //确定按键按下,执行if函数 switch(temp) {
case 0xeb:
key=7;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;//显示字符7,并记入相加的变量 case 0xdb:
key=8;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;//显示字符8,并记入相加的变量 case 0xbb:
key=9;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else
number2=number2*10+key;break; //显示字符9,并记入相加的变量
case 0x7b: key=12;write_data(lcd_s[key]);sym='*';flag=1; break;//显示'*'号,并将sym付'*' }
while((P1&0xf0)!=0xf0); //等待按键释放 }
}
P1=0xf7; // 第4次判断 temp=P1;
temp=temp&0xf0; if(temp!=0xf0) {
delayms(15); temp=P1;
temp=temp&0xf0; if(temp!=0xf0)
{ temp=P1;adders++; //确定按键按下,执行if函数 switch(temp) {
case 0xe7: key=0;
write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;//显示字符0,并记入相加的变量
case 0xd7: key=14;clear(); break;//调用清零函数
case 0xb7: key=15;yuans();flag=1;adders--;break;//调用运算函数
case 0x77: key=13;write_data(lcd_s[key]);sym='/';flag=1; break;//显示'/'号,并将sym付'/' }
while((P1&0xf0)!=0xf0); //等待按键释放 }
} }
/*********************液晶****************************/ void write_com(uchar com) //液晶写指令程序 {while(buzz()) ;
lcdrs=0; // lcdwr=0; // lcden=0;
P0=com; // _nop_(); _nop_(); _nop_(); _nop_();
lcden=1; // _nop_(); _nop_(); _nop_(); _nop_();
lcden=0; // }
void write_data(uchar dat) //{ while(buzz()); lcdrs = 1; lcdwr = 0; lcden = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); lcden = 1; _nop_(); _nop_(); _nop_(); _nop_();
lcden = 0; }
void init() // {
lcden=0; //
write_com(0x38); // write_com(0x0c); // write_com(0x06); //
液晶写数据程序 液晶初始化程序 write_com(0x01); // }
bit buzz() //液晶测忙程序 {
bit b;
lcdwr=1; //
lcdrs=0; // lcden=1; _nop_(); _nop_(); _nop_(); _nop_();
b=(bit)(P&0x80); lcden=0; return b; }
void delay(int z) // 延时子程序 { int i;
while(z--) {
for(i = 0; i< 250; i++) {
_nop_(); _nop_(); _nop_(); _nop_(); } } }
/*********************延时函数**********************************/ void delayms(uchar z) //延时毫秒程序 {
uchar i,j;
for(i=z;i>0;i--) for(j=110;j>0;j--); }
/***********************运算*********************************/
/********************清零函数
********************************************/ void clear() //清零程序 { uchar i;
for(i=0;i<16;i++) //对液晶写入空格 { write_com(0x80+i); write_data(' '); }
for(i=0;i<15;i++) {
write_com(0x80+0x40+i); write_data(' '); }
write_data('0'); write_com(0x80); flag=0;
number1=0;number2=0;adders=0; //将数据变量清零 }
/**********************运算程序******************************/ void yuans() //运算函数 {
uchar i,j,temp1; switch(sym) {
case '+':number1+=number2;break; //两数相加 case '-':number1-=number2;break; //两数相减 case '*':number1*=number2;break; //两数相乘 case '/':number1/=number2;break; //两数相除 }
sprintf(sumsz,\"%10.2f\ j=strlen(sumsz);
write_com(0x80+0x40+16-j);
for(i=0;i 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务