大有所学 发表于 2012-10-23 20:41:50

求救。。。用AT89S52写的单片机计算器程序总调试不成功


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar l,h,i,k=0,Q=0,a=0,b=0,c,k,num;
void delay(uint x);
void lcd_init();;//初始化
void write_com(uchar com); //写指令
void write_data(uchar data);        //写数据
//void read_data(uchar data); //读数据
void keyscan();                                  //矩阵键盘扫描
void lcd_dispay();                                  //LCD1602显示
uchar code table={
1,2,3,4,5,6,7,8,9,0,
0x2b,0x2d,0x2a,0x2f,0x11,0x3d};
uchar code table1[   ]={
'e','r','r','o'};
uchar code table2[   ]={
'e','r','r','o','i','s','b'                          };

sbit E =P2^7;                //1602使能
sbit RW=P2^6;                //1602读写       
sbit RS=P2^5;                //1602数据/命令
void lcd_init()//初始化
{
   delay(15);
   write_com(0x38);
   delay(5);
   write_com(0x38);
   delay(5);
   write_com(0x38);
   write_com(0x38);
   write_com(0x0f); //开显示,显示闪烁光标
   write_com(0x06); //读写后光标移动
   write_com(0x01); //清屏
   
}   
void write_com(uchar com) //写指令
{
RS=0;
RW=0;
P0=com;
E=1;
delay(5);
E=0;
}
void write_data(uchar data)        //写数据
{
RS=1;
RW=0;
P0=data;
E=1;
delay(5);
E=0;
}
/*void read_data(uchar data) //读数据
{
RS=1;
RW=1;
E=1;
P0=data;
dalay(5);
E=0;
}       */


void keyscan()
{


if(k=0)             {a=a+table;}           //没输入符号时输入为a
if(k=1|K=2|K=3|K=4) {b=b+table;}           //输入符号后输入赋为b
if(Q=1)             {Q=0;write_data(0x01);} //        清屏键


P1=0x0f;                                        //给P1赋值00001111
l=P1&0x0f;
if(l!=0x0f)
{
delay(100);
   if(l!=0x0f)
          l=P1&0x0f;                        //若有键按下,得出低四位的值
}
P1=0xf0;                                        //给P1赋值11110000
h=P1&0xf0;
if(h!=0xf0)
{
delay(100);
   if(h!=0xf0)
          h=P1&0xf0;                        //若有键按下,得出高4位的值
}

switch(h+l)
{
   case 0xee:write_data(table);break;                                       
   case 0xde:write_data(table);break;
   case 0xbe:write_data(table);break;
   case 0x7e:write_data(table);break;
   case 0xed:write_data(table);break;
   case 0xdd:write_data(table);break;
   case 0xbd:write_data(table);break;
   case 0x7d:write_data(table);break;
   case 0xeb:write_data(table);break;
   case 0xdb:write_data(table);break;
   case 0xbb:write_data(table);k=1;break;       //输入+的符号,并使前面输入数为a
   case 0x7b:write_data(table);k=2;break;       //输入-的符号,并使前面输入数为a
   case 0xe7:write_data(table);k=3;break;       //输入*的符号,并使前面输入数为a
   case 0xd7:write_data(table);k=4;break;       //输入/的符号,并使前面输入数为a
   case 0xb7:write_data(table);Q=1;break;       //清屏键
   case 0x77:write_data(table);K=5;break;       //输入=的符号
}

}
void lcd_dispay()                  //当输入=键时在下一行显示输出结果
{
keyscan();
while(K=5)
   switch(k)
   {
          case 1: c=a+b;write_data(c);break;                、// +运算时输出结果
       case 2: if(a>b){c=a-b;write_data(c);};break;
                 else { for(i=6;i>0;i--) write_data(table1)};break;        // -运算时输出结果
       case 3: c=a*b;write_data(c);break;               //*运算时输出结果
       case 4: if(b!=0){c=a/b;write_data(c);}; break;
                 else { for(i=9;i>0;i--)write_data(table2)};break; // /运算时输出结果
   }

}
void main()
{
while(1)
{
   lcd_init();
   delay(5);
   lcd_display();
}
}
void delay(uint x)//延时xms
{
uint p,j;
   for(p=x;i>0;i--)
   for(p=110;j>0;j--);
}       
明天就要交了,望各位大侠高手们解救。。。

zjk 发表于 2012-10-24 08:59:54

LZ贴出错误提示来比较好,那样能节省些时间,免得大家慢慢找

renwocai 发表于 2012-10-24 12:45:36

明天就要交了,望各位大侠高手们解救。。。

是亮点

大有所学 发表于 2012-10-24 15:49:05

renwocai 发表于 2012-10-24 12:45 static/image/common/back.gif
明天就要交了,望各位大侠高手们解救。。。

是亮点

哈哈,无论怎样还是谢谢你们,,,调试通过了

大有所学 发表于 2012-10-24 15:49:34

zjk 发表于 2012-10-24 08:59 static/image/common/back.gif
LZ贴出错误提示来比较好,那样能节省些时间,免得大家慢慢找

谢谢哈,已经调试好了
页: [1]
查看完整版本: 求救。。。用AT89S52写的单片机计算器程序总调试不成功