完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
18个回答
|
|
额,你这个题目半年了还没弄好么?你这代码太长了,我感觉你是说显示有问题?
最佳答案
|
|
|
|
是12864显示的,不是1602,说错了
|
|
|
|
哪里有问题?
|
|
|
|
没说现象,这问题怎么找
|
|
|
|
无法正常显示?还是显示结果不正确?
|
|
|
|
/**********413暑假作品*********12864液晶显示屏,结合4*4矩阵键盘,简易计算器*,存储地址:STC-hex2 , LCD12864.c *************************************/ /***功能:1、基本整数的加减乘除; 2、有清除功能;3、除法计算,结果保留两位小数;4、分母为0报错********/ /*********5、小数减大数可显示负号;6、只能做两个数的加减乘除;7、可做10位数的有效运算***********************************/ /******注意:计算结果要求余显示,比如正确结果123,求余显示321,所以将321逐个赋给某一数组,倒序向12864输出**/ #include #define uint unsigned int #define uchar unsigned char #define ulong unsigned long ***it rs=P3^5; ***it rw=P3^6; ***it e=P3^4; ***it p***=P3^7; //串并选择,H=串 L=并,此程序让12864并行输出 bit flag1=0; //数字标记位 bit flag11=0; // +标记位 bit flag12=0; // —标记位 bit flag13=0; // *标记位 bit flag14=0; // /标记位 bit flag15=0; // =标记位 bit flag16=0; //清除位 bit flag2=0; // 负号标记 bit flag3=0; // 分子小于分母,结果只有两位有效数字时,扩大100倍有两位有效数字 bit flag4=0; // 分子小于分母,结果只有一位效数字时,扩大100倍有1位有效数字 void init(); //初始化16824子函数 void write_com(uchar); //写命令 void write_dat(uchar); //写数据,即显示内容 void display1(uchar); //显示字符 void delete(); //清除显示 void delay(uint); //延时 void keyscan(); //键盘扫描 void scan(); //扫描运算符,设定两个数计算 void display_value(); // 计算结果显示 void value(); // 计算 void begin(); //开机屏幕显示 void math_error(); //数学错误显示 uchar code table1[]="0123456789.+-*/="; uchar code table3[]="重量: "; uchar code table4[]="单价: "; uchar code table5[]="总价: "; long table2[19]; //存储结果的数组,20就出错? long s,a,b,num1; //s为计算结果,a为第一个数,b为第二个数,num1对应为键对应的值为显12864显示服务 /***********************************主**函**数***********************************************************/ void main() { init(); delay(5); begin(); //开机初始化 delay(5); write_com(0x80); //输入数在第一行显示 while(1) //大循环使其不断的显示 { keyscan(); scan(); value(); display_value(); delete(); } } /***********初始化********************************/ void init() { p***=1; //并口传输方式 delay(50); //先等待50个毫秒 write_com(0x30); //基本操作指令 delay(5); write_com(0x0f); //显示状态开/关,08什么也没有;0c无光标;0e有光标但不闪;0f有光标闪烁 delay(5); write_com(0x01); //清除显示 delay(5); write_com(0x06); //进入点设置 delay(5); } /****************写指令***************************/ void write_com(uchar com) { rs=0; //表示写命令 rw=0; e=0; P0=com; delay(5); e=1; delay(5); e=0; } /*****************写数据***************************/ void write_dat(uchar dat) { rs=1; //表示写数据 rw=0; e=0; P0=dat; delay(5); e=1; delay(5); e=0; } /*****************显示字符函数*************************/ void display1(uchar num1) { write_dat(table4[num1]); delay(2); } /*************************************键**盘**扫**描 P1口*********************************/ void keyscan() { uchar temp; /*第一行*/ P1=0xfe; //将第一行置为低电平,其余行线置为高电平 temp=P1; //读取P3口当前状态 赋给临时变量temp,用于后面计算 temp=temp&0xf0; //判断第一行是否有按键按下 while(temp!=0xf0) //消抖 { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:num1=7;flag1=1; //第一个键 7 break; case 0xde:num1=8;flag1=1;; //第二个键 8 break; case 0xbe:num1=9;flag1=1; //第三个键 9 break; case 0x7e:num1=11;flag11=1; //第四个键 + break; } while(temp!=0xf0) //等待按键释放 { temp=P1; temp=temp&0xf0; } display1(num1); } } /*第二行*/ P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xed:num1=4;flag1=1; //4 break; case 0xdd:num1=5;flag1=1; //5 break; case 0xbd:num1=6;flag1=1; //6 break; case 0x7d:num1=12;flag12=1; //- break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } display1(num1); } } /*第三行*/ P1=0xfb; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xeb:num1=1;flag1=1; // 1 break; case 0xdb:num1=2;flag1=1; //2 break; case 0xbb:num1=3;flag1=1; //3 break; case 0x7b:num1=13;flag13=1; //* break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } display1(num1); } } /*第四行*/ P1=0xf7; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xe7:num1=15;flag15=1; // = break; case 0xd7:num1=0;flag1=1; //0 break; case 0xb7: flag16=1;//清屏,要把所有标识位给清除 break; case 0x77:num1=14;flag14=1; // /除号 break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } display1(num1); } } } /**********************************扫描运算符,设定两个数计算*****************8*********************/ void scan() { if(flag15==0) // 只有没按 等号 才能进入 { if(flag11||flag12||flag13||flag14) { if(flag1==1) //不使 运算符 对应的num1进入 { b=b*10+num1; flag1=0; //b为第二个数,并防止b不断死循环 } } if(flag1==1) //a为第一个数 { a=a*10+num1; flag1=0; } } } /**********************************************计****算******************************************************************/ void value() { if(flag15==0) // 只有没按 等号 才能进入,只要按等号就不会运算,防止死循环 { if(flag11==1) //加法 { s=a+b; } else if(flag12==1) //减法 { if(a>=b) //做减法时,判断两个数大小 { s=a-b; } else { s=b-a; flag2=1; //如果a } } else if(flag13==1) //乘法 { s=a*b; } else if(flag14==1) //除法 { s=(((float)a/b)*100); //s为long,将a/b结果转化为float } } } /****************************************************计算结果显示************************************************/ void display_value() { long n=0,y; if(flag15==1) { flag15=0; write_com(0x98); //结果在第四行显示 if(s==0) //如果两数相减结果s为0,直接输出0 { write_dat('0'); } if(flag2==1) //如果小数减大数,先输出一个‘-’,再输出结果 { write_dat('-'); } if(s!=0) { while(s) //求余,将结果赋给数组table2,运算结果为123,但求余赋给数组为321 { y=s%10; //求余,s必须为整型,将余数逐个放入数组table2中 table2[n]=y; s=s/10; n++; } n--; if(flag14==1) //除法 { if(n==1) // 分子小于分母,扩大100倍有两位有效数字 { flag3=1; } if(n==0) // 分子小于分母,扩大100倍有一位有效数字 { flag4=1; } if(b==0) //分母为零,输出错误,为什么结果多输出一个/?有待解决 { math_error(); } } while(n>=0) //将数组倒序输出***************************** { delay(2); if(flag3==1) //相除的数小于3位数 { flag3=0; write_dat('0'); delay(2); write_dat('.'); } if((flag4==1)&(b!=0)) //相除的数小于2位数,排除分母为0的情况 { flag4=0; write_dat('0'); delay(2); write_dat('.'); write_dat('0'); delay(2); } write_dat(0x30+table2[n]); //倒序显示结果 n--; if(flag14==1) { if(n==2) //如果按/键,结果保留两位小数 { write_dat('.'); } } } } } } /***************清除显示*****************/ void delete() { if(flag16==1) { write_com(0x01); flag1=flag2=flag3=flag4=0; flag11=flag12=flag13=flag14=flag15=flag16=0; s=0; a=0; b=0; } } /*********开机屏幕显示**********/ void begin() { uchar num; write_com(0x90); delay(2); for(num=0;num<11;num++) { write_dat(table3[num]); delay(2); } write_com(0x88); delay(2); for(num=0;num<14;num++) { write_dat(table4[num]); delay(2); } write_com(0x98); delay(2); for(num=0;num<11;num++) { write_dat(table5[num]); delay(2); } } /***********输出数学错误,分母为0******/ void math_error() { uchar num; write_com(0x90); delay(2); for(num=0;num<10;num++) { write_dat(table5[num]); delay(2); } } /**************延时***********************************/ void delay(uint x) //毫秒 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } |
|
|
|
/**********413暑假作品*********12864液晶显示屏,结合4*4矩阵键盘,简易计算器*,存储地址:STC-hex2 , LCD12864.c *************************************/ /***功能:1、基本整数的加减乘除; 2、有清除功能;3、除法计算,结果保留两位小数;4、分母为0报错********/ /*********5、小数减大数可显示负号;6、只能做两个数的加减乘除;7、可做10位数的有效运算***********************************/ /******注意:计算结果要求余显示,比如正确结果123,求余显示321,所以将321逐个赋给某一数组,倒序向12864输出**/ #include #define uint unsigned int #define uchar unsigned char #define ulong unsigned long ***it rs=P3^5; ***it rw=P3^6; ***it e=P3^4; ***it p***=P3^7; //串并选择,H=串 L=并,此程序让12864并行输出 bit flag1=0; //数字标记位 bit flag11=0; // +标记位 bit flag12=0; // —标记位 bit flag13=0; // *标记位 bit flag14=0; // /标记位 bit flag15=0; // =标记位 bit flag16=0; //清除位 bit flag2=0; // 负号标记 bit flag3=0; // 分子小于分母,结果只有两位有效数字时,扩大100倍有两位有效数字 bit flag4=0; // 分子小于分母,结果只有一位效数字时,扩大100倍有1位有效数字 void init(); //初始化16824子函数 void write_com(uchar); //写命令 void write_dat(uchar); //写数据,即显示内容 void display1(uchar); //显示字符 void delete(); //清除显示 void delay(uint); //延时 void keyscan(); //键盘扫描 void scan(); //扫描运算符,设定两个数计算 void display_value(); // 计算结果显示 void value(); // 计算 void begin(); //开机屏幕显示 void math_error(); //数学错误显示 uchar code table1[]="0123456789.+-*/="; uchar code table3[]="重量: "; uchar code table4[]="单价: "; uchar code table5[]="总价: "; long table2[19]; //存储结果的数组,20就出错? long s,a,b,num1; //s为计算结果,a为第一个数,b为第二个数,num1对应为键对应的值为显12864显示服务 /***********************************主**函**数***********************************************************/ void main() { init(); delay(5); begin(); //开机初始化 delay(5); write_com(0x80); //输入数在第一行显示 while(1) //大循环使其不断的显示 { keyscan(); scan(); value(); display_value(); delete(); } } /***********初始化********************************/ void init() { p***=1; //并口传输方式 delay(50); //先等待50个毫秒 write_com(0x30); //基本操作指令 delay(5); write_com(0x0f); //显示状态开/关,08什么也没有;0c无光标;0e有光标但不闪;0f有光标闪烁 delay(5); write_com(0x01); //清除显示 delay(5); write_com(0x06); //进入点设置 delay(5); } /****************写指令***************************/ void write_com(uchar com) { rs=0; //表示写命令 rw=0; e=0; P0=com; delay(5); e=1; delay(5); e=0; } /*****************写数据***************************/ void write_dat(uchar dat) { rs=1; //表示写数据 rw=0; e=0; P0=dat; delay(5); e=1; delay(5); e=0; } /*****************显示字符函数*************************/ void display1(uchar num1) { write_dat(table4[num1]); delay(2); } /*************************************键**盘**扫**描 P1口*********************************/ void keyscan() { uchar temp; /*第一行*/ P1=0xfe; //将第一行置为低电平,其余行线置为高电平 temp=P1; //读取P3口当前状态 赋给临时变量temp,用于后面计算 temp=temp&0xf0; //判断第一行是否有按键按下 while(temp!=0xf0) //消抖 { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:num1=7;flag1=1; //第一个键 7 break; case 0xde:num1=8;flag1=1;; //第二个键 8 break; case 0xbe:num1=9;flag1=1; //第三个键 9 break; case 0x7e:num1=11;flag11=1; //第四个键 + break; } while(temp!=0xf0) //等待按键释放 { temp=P1; temp=temp&0xf0; } display1(num1); } } /*第二行*/ P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xed:num1=4;flag1=1; //4 break; case 0xdd:num1=5;flag1=1; //5 break; case 0xbd:num1=6;flag1=1; //6 break; case 0x7d:num1=12;flag12=1; //- break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } display1(num1); } } /*第三行*/ P1=0xfb; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xeb:num1=1;flag1=1; // 1 break; case 0xdb:num1=2;flag1=1; //2 break; case 0xbb:num1=3;flag1=1; //3 break; case 0x7b:num1=13;flag13=1; //* break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } display1(num1); } } /*第四行*/ P1=0xf7; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xe7:num1=15;flag15=1; // = break; case 0xd7:num1=0;flag1=1; //0 break; case 0xb7: flag16=1;//清屏,要把所有标识位给清除 break; case 0x77:num1=14;flag14=1; // /除号 break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } display1(num1); } } } /**********************************扫描运算符,设定两个数计算*****************8*********************/ void scan() { if(flag15==0) // 只有没按 等号 才能进入 { if(flag11||flag12||flag13||flag14) { if(flag1==1) //不使 运算符 对应的num1进入 { b=b*10+num1; flag1=0; //b为第二个数,并防止b不断死循环 } } if(flag1==1) //a为第一个数 { a=a*10+num1; flag1=0; } } } /**********************************************计****算******************************************************************/ void value() { if(flag15==0) // 只有没按 等号 才能进入,只要按等号就不会运算,防止死循环 { if(flag11==1) //加法 { s=a+b; } else if(flag12==1) //减法 { if(a>=b) //做减法时,判断两个数大小 { s=a-b; } else { s=b-a; flag2=1; //如果a } } else if(flag13==1) //乘法 { s=a*b; } else if(flag14==1) //除法 { s=(((float)a/b)*100); //s为long,将a/b结果转化为float } } } /****************************************************计算结果显示************************************************/ void display_value() { long n=0,y; if(flag15==1) { flag15=0; write_com(0x98); //结果在第四行显示 if(s==0) //如果两数相减结果s为0,直接输出0 { write_dat('0'); } if(flag2==1) //如果小数减大数,先输出一个‘-’,再输出结果 { write_dat('-'); } if(s!=0) { while(s) //求余,将结果赋给数组table2,运算结果为123,但求余赋给数组为321 { y=s%10; //求余,s必须为整型,将余数逐个放入数组table2中 table2[n]=y; s=s/10; n++; } n--; if(flag14==1) //除法 { if(n==1) // 分子小于分母,扩大100倍有两位有效数字 { flag3=1; } if(n==0) // 分子小于分母,扩大100倍有一位有效数字 { flag4=1; } if(b==0) //分母为零,输出错误,为什么结果多输出一个/?有待解决 { math_error(); } } while(n>=0) //将数组倒序输出***************************** { delay(2); if(flag3==1) //相除的数小于3位数 { flag3=0; write_dat('0'); delay(2); write_dat('.'); } if((flag4==1)&(b!=0)) //相除的数小于2位数,排除分母为0的情况 { flag4=0; write_dat('0'); delay(2); write_dat('.'); write_dat('0'); delay(2); } write_dat(0x30+table2[n]); //倒序显示结果 n--; if(flag14==1) { if(n==2) //如果按/键,结果保留两位小数 { write_dat('.'); } } } } } } /***************清除显示*****************/ void delete() { if(flag16==1) { write_com(0x01); flag1=flag2=flag3=flag4=0; flag11=flag12=flag13=flag14=flag15=flag16=0; s=0; a=0; b=0; } } /*********开机屏幕显示**********/ void begin() { uchar num; write_com(0x90); delay(2); for(num=0;num<11;num++) { write_dat(table3[num]); delay(2); } write_com(0x88); delay(2); for(num=0;num<14;num++) { write_dat(table4[num]); delay(2); } write_com(0x98); delay(2); for(num=0;num<11;num++) { write_dat(table5[num]); delay(2); } } /***********输出数学错误,分母为0******/ void math_error() { uchar num; write_com(0x90); delay(2); for(num=0;num<10;num++) { write_dat(table5[num]); delay(2); } } /**************延时***********************************/ void delay(uint x) //毫秒 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } |
|
|
|
/**********413暑假作品*********12864液晶显示屏,结合4*4矩阵键盘,简易计算器*,存储地址:STC-hex2 , LCD12864.c *************************************/ /***功能:1、基本整数的加减乘除; 2、有清除功能;3、除法计算,结果保留两位小数;4、分母为0报错********/ /*********5、小数减大数可显示负号;6、只能做两个数的加减乘除;7、可做10位数的有效运算***********************************/ /******注意:计算结果要求余显示,比如正确结果123,求余显示321,所以将321逐个赋给某一数组,倒序向12864输出**/ #include #define uint unsigned int #define uchar unsigned char #define ulong unsigned long ***it rs=P3^5; ***it rw=P3^6; ***it e=P3^4; ***it p***=P3^7; //串并选择,H=串 L=并,此程序让12864并行输出 bit flag1=0; //数字标记位 bit flag11=0; // +标记位 bit flag12=0; // —标记位 bit flag13=0; // *标记位 bit flag14=0; // /标记位 bit flag15=0; // =标记位 bit flag16=0; //清除位 bit flag2=0; // 负号标记 bit flag3=0; // 分子小于分母,结果只有两位有效数字时,扩大100倍有两位有效数字 bit flag4=0; // 分子小于分母,结果只有一位效数字时,扩大100倍有1位有效数字 void init(); //初始化16824子函数 void write_com(uchar); //写命令 void write_dat(uchar); //写数据,即显示内容 void display1(uchar); //显示字符 void delete(); //清除显示 void delay(uint); //延时 void keyscan(); //键盘扫描 void scan(); //扫描运算符,设定两个数计算 void display_value(); // 计算结果显示 void value(); // 计算 void begin(); //开机屏幕显示 void math_error(); //数学错误显示 uchar code table1[]="0123456789.+-*/="; uchar code table3[]="重量: "; uchar code table4[]="单价: "; uchar code table5[]="总价: "; long table2[19]; //存储结果的数组,20就出错? long s,a,b,num1; //s为计算结果,a为第一个数,b为第二个数,num1对应为键对应的值为显12864显示服务 /***********************************主**函**数***********************************************************/ void main() { init(); delay(5); begin(); //开机初始化 delay(5); write_com(0x80); //输入数在第一行显示 while(1) //大循环使其不断的显示 { keyscan(); scan(); value(); display_value(); delete(); } } /***********初始化********************************/ void init() { p***=1; //并口传输方式 delay(50); //先等待50个毫秒 write_com(0x30); //基本操作指令 delay(5); write_com(0x0f); //显示状态开/关,08什么也没有;0c无光标;0e有光标但不闪;0f有光标闪烁 delay(5); write_com(0x01); //清除显示 delay(5); write_com(0x06); //进入点设置 delay(5); } /****************写指令***************************/ void write_com(uchar com) { rs=0; //表示写命令 rw=0; e=0; P0=com; delay(5); e=1; delay(5); e=0; } /*****************写数据***************************/ void write_dat(uchar dat) { rs=1; //表示写数据 rw=0; e=0; P0=dat; delay(5); e=1; delay(5); e=0; } /*****************显示字符函数*************************/ void display1(uchar num1) { write_dat(table4[num1]); delay(2); } /*************************************键**盘**扫**描 P1口*********************************/ void keyscan() { uchar temp; /*第一行*/ P1=0xfe; //将第一行置为低电平,其余行线置为高电平 temp=P1; //读取P3口当前状态 赋给临时变量temp,用于后面计算 temp=temp&0xf0; //判断第一行是否有按键按下 while(temp!=0xf0) //消抖 { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:num1=7;flag1=1; //第一个键 7 break; case 0xde:num1=8;flag1=1;; //第二个键 8 break; case 0xbe:num1=9;flag1=1; //第三个键 9 break; case 0x7e:num1=11;flag11=1; //第四个键 + break; } while(temp!=0xf0) //等待按键释放 { temp=P1; temp=temp&0xf0; } display1(num1); } } /*第二行*/ P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xed:num1=4;flag1=1; //4 break; case 0xdd:num1=5;flag1=1; //5 break; case 0xbd:num1=6;flag1=1; //6 break; case 0x7d:num1=12;flag12=1; //- break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } display1(num1); } } /*第三行*/ P1=0xfb; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xeb:num1=1;flag1=1; // 1 break; case 0xdb:num1=2;flag1=1; //2 break; case 0xbb:num1=3;flag1=1; //3 break; case 0x7b:num1=13;flag13=1; //* break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } display1(num1); } } /*第四行*/ P1=0xf7; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xe7:num1=15;flag15=1; // = break; case 0xd7:num1=0;flag1=1; //0 break; case 0xb7: flag16=1;//清屏,要把所有标识位给清除 break; case 0x77:num1=14;flag14=1; // /除号 break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } display1(num1); } } } /**********************************扫描运算符,设定两个数计算*****************8*********************/ void scan() { if(flag15==0) // 只有没按 等号 才能进入 { if(flag11||flag12||flag13||flag14) { if(flag1==1) //不使 运算符 对应的num1进入 { b=b*10+num1; flag1=0; //b为第二个数,并防止b不断死循环 } } if(flag1==1) //a为第一个数 { a=a*10+num1; flag1=0; } } } /**********************************************计****算******************************************************************/ void value() { if(flag15==0) // 只有没按 等号 才能进入,只要按等号就不会运算,防止死循环 { if(flag11==1) //加法 { s=a+b; } else if(flag12==1) //减法 { if(a>=b) //做减法时,判断两个数大小 { s=a-b; } else { s=b-a; flag2=1; //如果a } } else if(flag13==1) //乘法 { s=a*b; } else if(flag14==1) //除法 { s=(((float)a/b)*100); //s为long,将a/b结果转化为float } } } /****************************************************计算结果显示************************************************/ void display_value() { long n=0,y; if(flag15==1) { flag15=0; write_com(0x98); //结果在第四行显示 if(s==0) //如果两数相减结果s为0,直接输出0 { write_dat('0'); } if(flag2==1) //如果小数减大数,先输出一个‘-’,再输出结果 { write_dat('-'); } if(s!=0) { while(s) //求余,将结果赋给数组table2,运算结果为123,但求余赋给数组为321 { y=s%10; //求余,s必须为整型,将余数逐个放入数组table2中 table2[n]=y; s=s/10; n++; } n--; if(flag14==1) //除法 { if(n==1) // 分子小于分母,扩大100倍有两位有效数字 { flag3=1; } if(n==0) // 分子小于分母,扩大100倍有一位有效数字 { flag4=1; } if(b==0) //分母为零,输出错误,为什么结果多输出一个/?有待解决 { math_error(); } } while(n>=0) //将数组倒序输出***************************** { delay(2); if(flag3==1) //相除的数小于3位数 { flag3=0; write_dat('0'); delay(2); write_dat('.'); } if((flag4==1)&(b!=0)) //相除的数小于2位数,排除分母为0的情况 { flag4=0; write_dat('0'); delay(2); write_dat('.'); write_dat('0'); delay(2); } write_dat(0x30+table2[n]); //倒序显示结果 n--; if(flag14==1) { if(n==2) //如果按/键,结果保留两位小数 { write_dat('.'); } } } } } } /***************清除显示*****************/ void delete() { if(flag16==1) { write_com(0x01); flag1=flag2=flag3=flag4=0; flag11=flag12=flag13=flag14=flag15=flag16=0; s=0; a=0; b=0; } } /*********开机屏幕显示**********/ void begin() { uchar num; write_com(0x90); delay(2); for(num=0;num<11;num++) { write_dat(table3[num]); delay(2); } write_com(0x88); delay(2); for(num=0;num<14;num++) { write_dat(table4[num]); delay(2); } write_com(0x98); delay(2); for(num=0;num<11;num++) { write_dat(table5[num]); delay(2); } } /***********输出数学错误,分母为0******/ void math_error() { uchar num; write_com(0x90); delay(2); for(num=0;num<10;num++) { write_dat(table5[num]); delay(2); } } /**************延时***********************************/ void delay(uint x) //毫秒 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } |
|
|
|
在这个计算器的基础上改的,希望第一次按键按下,数字显示在重量这一行,第二次按键按下,数字显示在单价这一行,然后两者能相乘,结果显示在总价这一行 |
|
|
|
在这个计算器的基础上改的,希望第一次按键按下,数字显示在重量这一行,第二次按键按下,数字显示在单价这一行,然后两者能相乘,结果显示在总价这一行 |
|
|
|
在这个计算器的基础上改的,希望第一次按键按下,数字显示在重量这一行,第二次按键按下,数字显示在单价这一行,然后两者能相乘,结果显示在总价这一行 |
|
|
|
这是老师给学生留作业的架势吗?
|
|
|
|
这位同学,可以发一下你的原理图来看看嘛?~
|
|
|
|
当年课程设计我也是弄这个东西。
|
|
|
|
@@mingtian 发表于 2015-12-15 14:10 你好,我问一下这个程序的单片机型号是什么 |
|
|
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
stm32f407+ksz8863rlli概率性ping不通
478 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-常见网络服务搭建之NFS服务搭建
320 浏览 0 评论
求助:辉芒微芯片 FDM B11GBMH 的信息及开发环境安装
245 浏览 0 评论
867 浏览 0 评论
嵌入式 学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之输入输出重定向
740 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11303 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-28 23:03 , Processed in 0.968806 second(s), Total 75, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号