首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

keil c 程序有关问题

2012-04-26 
keil c 程序问题下面是程序:#includereg52.h#include intrins.h#includestring.h#include math.h#

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的有哪位知道我错在哪里?)



[解决办法]

C/C++ code
#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可尝试着改发到‘硬件/嵌入开发’--‘单片机/工控’论坛试试看看

热点排行