您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页液晶计算器

液晶计算器

来源:筏尚旅游网
/***************************计算器程序***********************************/ #include #include #include #include #include

#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;iwrite_com(0x80+adders-1); }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务