最近有个项目,在keil单步调试的时候,总调试进不了头文件(单步),直接嗖的一下就飞到了函数末尾,于是找了个别人写的,在实物上验证过的程序,发现也一样进不了头文件,源文件如下,
按十六个健 依次显示0——9 a b c d e f
**********************/
#include
#include
#include //a b c d e f
uchar code yejingtable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x66};//0--9
uchar shuzi1=0;
uchar v=0;
void main()
{
EA = 0;
lcdset();
delay(1000);
display(1,1,"键盘测试显示键值");
writecommand(0x90);
while(1)
{
v=keyscan();
if(v==0x11||v==0x21||v==0x41||v==0x81||v==0x12||v==0x22||v==0x42||v==0x82||v==0x14||v==0x24||v==0x44||v==0x84||v==0x18||v==0x28||v==0x48||v==0x88)
{
switch(v)
{
case 0x11: shuzi1=0; // 0
break;
case 0x21: shuzi1=1; //1
break;
case 0x41: shuzi1=2; //2
break;
case 0x81: shuzi1=3; //3
break;
case 0x12: shuzi1=4; //4
break;
case 0x22: shuzi1=5; //5
break;
case 0x42: shuzi1=6; //6
break;
case 0x82: shuzi1=7; //7
break;
case 0x14: shuzi1=8; //8
break;
case 0x24: shuzi1=9; //9
break;
case 0x44: shuzi1=10; //a
break;
case 0x84: shuzi1=11;
break; //b
case 0x18: shuzi1=12;
break; //c
case 0x28: shuzi1=13; //d
break;
case 0x48: shuzi1=14; //e
break;
case 0x88: shuzi1=15; //f
break;
default:break;
}
writedata(yejingtable[shuzi1]);
delay(50000);
}
}
}单步调试时,从lcdset();一步就飞到了case 0x24: 来了,,,难道头文件是不难单步调试的吗????
头文件如下:
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs = P3^0;
sbit rw = P3^1;
sbit en = P3^5;
void checkbusy();
void writecommand(uchar command);
void writedata(uchar date);
void lcdset(void);
void display(uchar y, uchar x, uchar *p);
void displayNumber(uchar y,uchar x,uchar number);
void cursor(uchar y,uchar x);
void convert(uchar yy);
/*==============================================================*/
/* 液晶 */
//=========================判忙=================================
void checkbusy()
{
rs=0;
rw=1;
P0=0xff;
while(1)
{
en = 1;
if(P0 < 0x80)break;//P0的最高位为忙标志为,H:忙,L:空闲
en = 0;
}
en=0;
}
//===========液晶写指令=========================================
void writecommand(uchar command)
{
checkbusy();
rs=0;
rw=0;
en=1;
P0=command; //液晶数据线P0
en=0;
}
//============液晶写数据=========================================
void writedata(uchar date)
{
checkbusy();
rs=1;
rw=0;
en=1;
P0=date;
en=0;
}
//==============液晶设置=========================================
void lcdset(void)
{
writecommand(0x30); //基本指令集
writecommand(0x01); //清屏,DDRAM的地址归零
writecommand(0x02); //地址归位
writecommand(0x0c); //显示开,光标关,反白关
writecommand(0x06); //DDRAM地址加1
}
//===========字符显示============================================
void display(uchar y, uchar x, uchar *p)
{
switch (y)
{
case 1:writecommand(0x7f+x); break; //液晶第一行
case 2:writecommand(0x8f+x); break; //0x90+(x-1)
case 3:writecommand(0x87+x);break;
case 4:writecommand(0x97+x);break;
default:break;
}
while(*p)
writedata(*p++);
}
文件2: #include
uchar keyscan(void);
void delay(uint m);
void delay(uint m)
{
while(--m);
}
//键扫子程序
uchar keyscan(void)
{
uchar scan,tmp;
P1=0xf0; //发全行0扫描码
if((P1&0xf0)!=0xf0) //若有键按下
{delay(1000); // 延时去抖
if((P1&0xf0)!=0xf0) //延时再判键是否还按下
{scan=0xfe;
while((scan&0x10)!=0) //逐行扫描
{
P1=scan; //输出行扫描码
if((P1&0xf0)!=0xf0) //本行有键按下
{tmp=(P1&0xf0)|0x0f;
return ((~scan)|(~tmp));} //还回键值
else scan=(scan<<1)|0x01; //行扫描码左移一位
}
}
}
return (0); //无键按下,还回0
}