keil c 程序问题
下面是程序:
#include<reg52.h>
#include <intrins.h>
#include<string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
//#include <itoa.h>
#define uchar unsigned char
#define uint unsigned int
uchar xdata key,sym,sumsz[30]; // 定义变量
float sum,number1=0,number2=0; // 定义变量
bit flag=0; // 定义位变量标志位
sbit lcdrs=P2^5; // 定义液晶的读IO口
sbit lcdwr=P2^6; // 定义液晶的写IO口
sbit lcden=P2^7; // 定义液晶的使能IO口
uchar xdata lcd_s[]={'0','1','2','3','4','5','6','7','8','9','h','o','b',0x2f,' ','='};//
uchar xdata lcd1[]={"原进制:"};
uchar xdata lcd2[]={"转换后的进制:"};
uchar xdata lcd3[]={"进行转换的数:"};
uchar a1=0; //定义一个标号
uchar b1=0;
uchar c1=0;
uchar d1=0;
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 rzs(int *w,int j)
{
int xdata k=0,b=0,a[16],f[16],i,c,d=10,e=1;
k=*w;
for(c=0;c<16;c++)
{
if(k/e%d==0)
{
a[c]=0;
e=e*10;
}
else
{
a[c]=k/e%d;
e=e*10;
}
}
for(i=0;i<16;i++)
{
f[i]=pow(j,i);
}
c=0,i=0;
while(c<16||i<16)
{
b=b+a[c++]*f[i++];
}
*w=b;
}
void szr( int *w,int d)
{
int xdata a[100],b=0,i,c=0,e=1,j=0;
b=*w;
for(i=0;;i++)
{
a[i]=b%d;
b=b/d;
c++;
if(b==0)
break;
}
i=c;
while(i>0)
{
a[i]=a[i]*pow(10,i);
e=e/10;
i--;
}
for(i=0;i<c;i++)
{
j+=a[i];
}
*w=j;
}
/***********************主函数*****************************/
void main()
{
init(); //液晶初始化
while(1) //循环函数
{
keyscan(); //调用键盘扫描函数
}
}
/**********************键盘扫面*************************/
void keyscan()
{
uchar temp=0;
int i=0;
P3=0xfe; //第1次判断函数
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(15);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3; //确定按键按下,执行if函数
switch(temp)
{
case 0xee: key=1;write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符1,并记入相加的变量
case 0xde: key=2;write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符2,并记入相加的变量
case 0xbe: key=3;write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符3,并记入相加的变量
case 0x7e: {while(lcd1[i]!='\0'){write_data(lcd1[i]);i++;};
while((P3&0xf0)!=0xf0);
keyscan();
if(number1==10||number1==16)
{if(number1==10)
{a1=10;}
else
{a1=16;}number1=0;}};break;//显示‘+’号,并将sym付‘+’
}
while((P3&0xf0)!=0xf0); //等待按键释放
}
}
P3=0xfd; //第2次判断
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(15);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3; //确定按键按下,执行if函数
switch(temp)
{
case 0xed: key=4;write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符4,并记入相加的变量
case 0xdd: key=5;write_data(lcd_s[key]);number1=number1*10+key; break;//显示字符5,并记入相加的变量
case 0xbd: key=6;write_data(lcd_s[key]);number1=number1*10+key; break; //显示字符6,并记入相加的变量
case 0x7d: {write_com(0x90);
while(lcd2[i]!='\0'){write_data(lcd2[i]);i++;};
while((P3&0xf0)!=0xf0);keyscan();
if(number1==16||number1==10){if(number1==16)
{b1=16;}else {b1=10;}number1=0;}}; break;
}
while((P3&0xf0)!=0xf0);
}
}
P3=0xfb; //第3次判断
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(15);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3; //确定按键按下,执行if函数
switch(temp)
{
case 0xeb: key=7;write_data(lcd_s[key]);number1=number1*10+key; break;//显示字符7,并记入相加的变量
case 0xdb: key=8;write_data(lcd_s[key]);number1=number1*10+key; break;//显示字符8,并记入相加的变量
case 0xbb: key=9;write_data(lcd_s[key]);number1=number1*10+key;break; //显示字符9,并记入相加的变量
case 0x7b: write_com(0x88);while(lcd3[i]!='\0'){write_data(lcd3[i]);i++;};break;//显示‘*’号,并将sym付‘*’
}
while((P3&0xf0)!=0xf0); //等待按键释放
}
}
P3=0xf7; // 第4次判断
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(15);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3; //确定按键按下,执行if函数
switch(temp)
{
case 0xe7: key=0; write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符0,并记入相加的变量
case 0xd7: key=14;clear(); break;//调用清零函数
case 0xb7: yuans();break;//调用运算函数
// case 0x77: while(lcd3[i]!='\0'){write_data(lcd3[i]);i++;};write_com(0x90);sym='d';flag=1; break;//显示‘/’号,并将sym付‘/’
}
while((P3&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;
_nop_();
_nop_();
_nop_();
_nop_();
}
void init() // 液晶初始化程序
{
lcden=0; //
delayms(50);
write_com(0x38); //
_nop_();
_nop_();
_nop_();
_nop_();
write_com(0x38); //
_nop_();
_nop_();
_nop_();
_nop_();
write_com(0x0c); //
_nop_();
_nop_();
_nop_();
_nop_();
//write_com(0x0c); //
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//write_com(0x06); //
write_com(0x01); //
delayms(10);
write_com(0x06); //
}
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); */
write_com(0x01);
flag=0;
number1=0;number2=0; //将数据变量清零
}
/**********************运算程序******************************/
void yuans() //运算函数
{
uchar i,j=0,temp1;
uchar ch[3];
uint m;
if(a1==10&&b1==16)
sym='h';
else if(a1==16&&b1==10)
sym='d';
switch(sym)
{
case 'h':sprintf(sumsz,"%x",(int)number1);break;
case 'o':sprintf(sumsz,"%o",(int)number1);break;
case 'b':m=(int)number1;
ch[0]=m/100+48;
ch[1]=(m/10)%10+48;
ch[2]=m%10+48;
sprintf(sumsz,"%s",ch);break;
case 'd':sprintf(sumsz,"%d",(int)number1); //两数相除
}
//
j=strlen(sumsz);
write_com(0x98);
for(i=0;i<j;i++) //显示结果
{
/*if(sumsz[i]=='.')
{
flag1=1;
}
if(flag==1)
{*/
//temp1=sumsz[i];
//write_data(temp1);
//delay(10);
//}
//else
temp1=sumsz[i];
write_data(temp1);
delay(10);
}
}
在12864上显示的结果为:
原进制:10(我输入的是10进制)
转换后的进制:16(16进制)
进行转换的数:22(十进制数22)
3126(显示的结果,本来应该是16的有哪位知道我错在哪里?)
[解决办法]
#include<reg52.h>#include <intrins.h>#include<string.h>#include <math.h>#include <stdio.h>#include <stdlib.h>//#include <itoa.h>#define uchar unsigned char#define uint unsigned intuchar xdata key,sym,sumsz[30]; // 定义变量float sum,number1=0,number2=0; // 定义变量bit flag=0; // 定义位变量标志位sbit lcdrs=P2^5; // 定义液晶的读IO口sbit lcdwr=P2^6; // 定义液晶的写IO口sbit lcden=P2^7; // 定义液晶的使能IO口uchar xdata lcd_s[]={'0','1','2','3','4','5','6','7','8','9','h','o','b',0x2f,' ','='};//uchar xdata lcd1[]={"原进制:"};uchar xdata lcd2[]={"转换后的进制:"};uchar xdata lcd3[]={"进行转换的数:"};uchar a1=0; //定义一个标号 uchar b1=0;uchar c1=0; uchar d1=0; 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 rzs(int *w,int j){ int xdata k=0,b=0,a[16],f[16],i,c,d=10,e=1; k=*w; for(c=0;c<16;c++) { if(k/e%d==0) { a[c]=0; e=e*10; } else { a[c]=k/e%d; e=e*10; } } for(i=0;i<16;i++) { f[i]=pow(j,i); } c=0,i=0; while(c<16||i<16) {b=b+a[c++]*f[i++]; } *w=b;}void szr( int *w,int d){ int xdata a[100],b=0,i,c=0,e=1,j=0; b=*w; for(i=0;;i++) { a[i]=b%d; b=b/d; c++; if(b==0) break; } i=c; while(i>0) { a[i]=a[i]*pow(10,i); e=e/10; i--; } for(i=0;i<c;i++) { j+=a[i]; } *w=j;} /***********************主函数*****************************/void main(){ init(); //液晶初始化 while(1) //循环函数 { keyscan(); //调用键盘扫描函数 } }/**********************键盘扫面*************************/void keyscan() { uchar temp=0; int i=0; P3=0xfe; //第1次判断函数 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(15); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; //确定按键按下,执行if函数 switch(temp) { case 0xee: key=1;write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符1,并记入相加的变量 case 0xde: key=2;write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符2,并记入相加的变量 case 0xbe: key=3;write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符3,并记入相加的变量 case 0x7e: {while(lcd1[i]!='\0'){write_data(lcd1[i]);i++;};while((P3&0xf0)!=0xf0);keyscan();if(number1==10||number1==16){if(number1==10){a1=10;}else {a1=16;} number1=0;}};break;//显示‘+’号,并将sym付‘+’ } while((P3&0xf0)!=0xf0); //等待按键释放 } } P3=0xfd; //第2次判断 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(15); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; //确定按键按下,执行if函数 switch(temp) { case 0xed: key=4;write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符4,并记入相加的变量 case 0xdd: key=5;write_data(lcd_s[key]);number1=number1*10+key; break;//显示字符5,并记入相加的变量 case 0xbd: key=6;write_data(lcd_s[key]);number1=number1*10+key; break; //显示字符6,并记入相加的变量 case 0x7d: {write_com(0x90);while(lcd2[i]!='\0'){write_data(lcd2[i]);i++;};while((P3&0xf0)!=0xf0);keyscan();if(number1==16||number1==10){if(number1==16){b1=16;}else {b1=10;}number1=0;}}; break; } while((P3&0xf0)!=0xf0); } } P3=0xfb; //第3次判断 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(15); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; //确定按键按下,执行if函数 switch(temp) { case 0xeb: key=7;write_data(lcd_s[key]);number1=number1*10+key; break;//显示字符7,并记入相加的变量 case 0xdb: key=8;write_data(lcd_s[key]);number1=number1*10+key; break;//显示字符8,并记入相加的变量 case 0xbb: key=9;write_data(lcd_s[key]);number1=number1*10+key;break; //显示字符9,并记入相加的变量 case 0x7b: write_com(0x88);while(lcd3[i]!='\0'){write_data(lcd3[i]);i++;};break;//显示‘*’号,并将sym付‘*’ } while((P3&0xf0)!=0xf0); //等待按键释放 } } P3=0xf7; // 第4次判断 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(15); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; //确定按键按下,执行if函数 switch(temp) { case 0xe7: key=0; write_data(lcd_s[key]);number1=number1*10+key;break;//显示字符0,并记入相加的变量 case 0xd7: key=14;clear(); break;//调用清零函数 case 0xb7: yuans();break;//调用运算函数 // case 0x77: while(lcd3[i]!='\0'){write_data(lcd3[i]);i++;};write_com(0x90);sym='d';flag=1; break;//显示‘/’号,并将sym付‘/’ } while((P3&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; _nop_(); _nop_(); _nop_(); _nop_(); }void init() // 液晶初始化程序{ lcden=0; //delayms(50); write_com(0x38); //_nop_(); _nop_(); _nop_(); _nop_();write_com(0x38); //_nop_(); _nop_(); _nop_(); _nop_();write_com(0x0c); //_nop_(); _nop_(); _nop_(); _nop_(); //write_com(0x0c); ////_nop_(); //_nop_(); //_nop_(); //_nop_(); //write_com(0x06); // write_com(0x01); //delayms(10);write_com(0x06); //}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); */write_com(0x01); flag=0; number1=0;number2=0; //将数据变量清零}/**********************运算程序******************************/void yuans() //运算函数{ uchar i,j=0,temp1;uchar ch[3];uint m;if(a1==10&&b1==16)sym='h';else if(a1==16&&b1==10)sym='d'; switch(sym) { case 'h':sprintf(sumsz,"%x",(int)number1);break; case 'o':sprintf(sumsz,"%o",(int)number1);break; case 'b':m=(int)number1;ch[0]=m/100+48;ch[1]=(m/10)%10+48;ch[2]=m%10+48;sprintf(sumsz,"%s",ch);break; case 'd':sprintf(sumsz,"%d",(int)number1); //两数相除 } // j=strlen(sumsz);write_com(0x98); for(i=0;i<j;i++) //显示结果 { /* if(sumsz[i]=='.'){flag1=1;}if(flag==1){*///temp1=sumsz[i]; //write_data(temp1); //delay(10); //}//elsetemp1=sumsz[i]; write_data(temp1); delay(10); }}
[解决办法]
液晶屏目前只用过1602,12864的没试过啊,不过功能比1602强太多,lz可尝试着改发到‘硬件/嵌入开发’--‘单片机/工控’论坛试试看看