2865|10

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

帮忙给看一下这个单片机c程序出错在哪 [复制链接]

程序的用途是键盘输入然后在lcd显示 单独测试过键盘程序和lcd程序都可以 但是放一起 就出错了 无论我摁下哪个键总是显示字符串的第一个字符 就是说key总是等于0 但是单独用led测试键盘程序很正常
程序如下 麻烦各位帮忙给看一下了
#include
#include                
#define uchar unsigned char
#define uint  unsigned int
uchar table[17]= "0123456789abcdef";//键盘输入码              
uchar dis_buf;            //显示缓存
uchar  temp;
uchar  key;               //键顺序码
uchar row;
uchar line;
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
//--------------------------------------------------
/* 延时子程序*/
void  delay(uchar x)
{    uchar j;
    while((x--)!=0)
    { for(j=0;j<125;j++)
         {;}
    }
}
//--------------------------------------------------
/*键扫描子程序*/
void  keyscan(void)
{
    P0=0xf0;         //低四位输入
delay(1);  
    temp=P0;        //读P1口
    temp=temp&0x0f;
    if(temp==1)
        line=0;
    else if(temp==2)
        line=1;
    else if(temp==4)
        line=2;
    else if(temp==8)
        line=3;
        
    P0=0x0f;        //高四位输入
delay(1);
    temp=P0;          //读P1口
    temp=temp&0xf0;
    if(temp==16)
        row=0;
    else if(temp==32)
        row=1;
    else if(temp==64)
        row=2;
    else if(temp==128)
        row=3;
    key=line*4+row;
     dis_buf=table[key]; //查表得键值
}
//--------------------------------------------------
/*判断键是否按下*/
void  keydown(void)
{  
   P0=0xf0;
   if(P0!=0xf0)
    /*delay(1);
else
keydown();
if(P0!=0xf0)
     keyscan();
  else
  keydown();*/
  keyscan();

}
//--------------------------------------------------
/*读lcd状态指令*/
void recom( )
{
EN=0;
RS=0;
RW=1;
EN=1;
}
//--------------------------------------------------
//////////测试是否忙///////////////
void busytest()
{
   P1=0xff;
   RS=0;
   RW=1;
   EN=1;
   while((P1&0x80)==0x80)
   {
     EN=0;  //这两句protues仿真必须加
     EN=1;  //
   };
   EN=0;
}
/////////////////////////////////
////////////写lcd指令不判断是否忙//////
void wrcom(unsigned char n)
{
RS=0;
RW=0;
EN=1;
P1=n;
EN=0;
}
////////////////////////////////

//////////写lcd指令判断是否忙//////
void wrcomn (unsigned char n)
{     
    busytest();
    wrcom(n);
}
/////////////////////////////
////////清屏//////////////
void clrscr()
{
  wrcomn(0x01);  //清屏
}
/////////////////////////////

///////////初始化lcd///////////
void initlcd()
{
delay(150);
wrcom(0x38);
delay(50);
wrcom(0x38);
delay(50);
wrcom(0x38);
wrcomn(0x38);
wrcomn(0x08);  //关显示 不显示光标
wrcomn(0x01);  //清屏
wrcomn(0x06);  //光标模式
wrcomn(0x0c); //开显示
}
////////////////////////////
//////////设置光标位置/////////
void setpos(unsigned char x,unsigned char y)
{
    busytest();
    x&=0x0f;
    y&=0x03;
    if(y==0x00)
    wrcomn(x|0x80);
    else if(y==0x01)
    wrcomn((x+0x40)|0x80);
}
/////////////////////////////////
////////////写数据//////////////
void wrightdata(uchar n)
{
busytest();
RS=1;
RW=0;
EN=1;
P1=n;
EN=0;
}
///////////////////////


///////////写字符串数据////////
void wrightstrdata(unsigned char *s,unsigned int length)
{
int x,y;
int YMAX,XMAX[2];
if(length>16)
{
  YMAX=2;
  XMAX[0]=16;
  XMAX[1]=length-16;
}
else
{
  YMAX=1;
  XMAX[0]=length;
  XMAX[1]=0;
}
    for(y=0;y       for(x=0;x      {  
        setpos(x,y);
        wrightdata(*s);
        s++;
  }
}
///////////////////////////////
    main()
{
     EN=0;
     initlcd();
while(1)
{   
      keydown();
      clrscr();
      //wrightstrdata(table,16);
   wrightdata(dis_buf);
   delay(3000);
      
      
}
   
   
   
  }   

最新回复

goole 很多!  详情 回复 发表于 2008-9-6 14:09
点赞 关注

回复
举报

58

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
http://blog.eeworld.net/happyflystone/archive/2008/07/27/2721270.aspx
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我把键盘从P0口改到了p3口就可以了  这是为什么啊?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
用的学习板么?
可能就是板上IO安排的问题了。
如:有的板P1口接了个液晶,而键盘则通过键盘扫描芯片与少数几个IO(如P0口的几个)相连。
如果自已扩键盘,不小心又用了P1口,可能就会出现问题。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
程序上太长 ,是否电路问题?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 ronaldinho_k 的回复:
我把键盘从P0口改到了p3口就可以了  这是为什么啊?



一般P0 是个开漏,没内部上拉 ,你有上拉电阻吗

而P3 是个8 位带有内部上拉准双向口
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

7
 
有些道理 我用proteus仿真的 直接连上的 上拉电阻还不太明白 我该去补补了
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
就是你按键触发电平的问题吧,那要根据你电路板的端口来看了,我以前用中断来做过,

遇到的问题也是中断触发的问题,最终还是按键触发沿问题,5楼说的有道理,要看那你

端口的状态是上拉态还是高阻态,因为那样按键会触发的电平不一样~
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

9
 
*键扫描子程序*/
void  keyscan(void)
{
    P0=0xf0;        //低四位输入
delay(1);  
    temp=P0;        //读P1口
    temp=temp&0x0f;
    if(temp==1)
        line=0;
    else if(temp==2)
        line=1;
    else if(temp==4)
        line=2;
    else if(temp==8)
        line=3;
        
    P0=0x0f;        //高四位输入
delay(1);
    temp=P0;          //读P1口
    temp=temp&0xf0;
    if(temp==16)
        row=0;
    else if(temp==32)
        row=1;
    else if(temp==64)
        row=2;
    else if(temp==128)
        row=3;
    key=line*4+row;
    dis_buf=table[key]; //查表得键值
}
//--------------------------------------------------
/*判断键是否按下*/
void  keydown(void)
{  
  P0=0xf0;
  if(P0!=0xf0)
    /*delay(1);
else
keydown();
if(P0!=0xf0)
    keyscan();
  else
  keydown();*/
  keyscan();

}


//////////////////////你的键盘扫描方法太落后了吧。用线反转法就是几行程序。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
回楼上 能不能给提供个先进点的程序让俺学学
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 
goole
很多!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表