打印
[51单片机]

求助,程序有问题,关于液晶显示与独立按键的

[复制链接]
1966|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
有三个按键,首先按k0键,产生中断;如果再有k1键按下,十位加1,如果大于等于10,为0;如果再有k2键按下,个位加1,大于等于10,为0。在1602上显示,现在的问题是按按键没反应,求问题出在哪里了??
#include<reg51.h>
#define LCD_DB P1
#define uchar unsigned char
#define uint unsigned int
uchar aa[2];
uchar hh=0,ll=0;
uchar ah,al;
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_E=P2^2;
sbit k0=P3^2;
sbit k1=P2^4;
sbit k2=P2^5;


void LCD_init(void);//LCD初始化函数
void LCD_write_command(unsigned char command);
void LCD_write_data(uchar dat);
void LCD_disp(uchar x,uchar y,uchar *p,uchar count);
void delay_n40us(uint n);
void LCD_init(void)
{
LCD_write_command(0x38);
LCD_write_command(0x0c);
LCD_write_command(0x06);
LCD_write_command(0x01);
delay_n40us(100);
}
void LCD_write_command(uchar command)
{
LCD_DB=command;
LCD_RS=0;
LCD_RW=0;
LCD_E=1;
LCD_E=0;
delay_n40us(1);
}
void LCD_write_data(uchar dat)
{
LCD_DB=dat;
LCD_RS=1;
LCD_RW=0;
LCD_E=1;
LCD_E=0;
delay_n40us(1);
}
void LCD_disp(uchar x,uchar y,uchar *p,uchar count)
{
uchar i;
for(i=0;i<count;i++)
{
  if(y==1)
   x|=0x80;
  else
   x|=0xc0;
  LCD_write_command(x);
  LCD_write_data(*p);
  x++;
  p++;
}
}

void delay_n40us(uint n)
{
uint i;
uchar j;
for(i=n;i>0;i--)
{
  for(j=0;j<2;j++);
}
}
void delayms(uint m)
{
uchar i,j;
for(i=0;i<m;i++)
{
for(j=0;j<140;j++);
}
}
void key() interrupt 0 using 0
{
   EA=0;
  if(k1==0)
{
  delayms(10);
  if(k1==0)
  {
   hh++;
   while(!k1);
   if(hh>=10)
   {
    hh=0;
   }
   ah=0x30+hh;
   aa[0]=ah;
  }
}
if(k2==0)
{
  delayms(10);
  if(k2==0)
  {
   ll++;
   while(!k2);
   if(ll>=10)
   {
    ll=0;
   }
   al=0x30+ll;
   aa[1]=al;
  }
}
EA=1;
}

void main()
{   
P3=0x0f;
k1=1;
k2=1;
EX0=1;
IT0=0;
EA=1;

LCD_init();


LCD_disp(0,0," set temp",9);
LCD_disp(0,1,"true temp",9);
LCD_disp(10,0,"25",2);
while(1)
{
uchar i;
for(i=0;i<2;i++)
{
LCD_write_command(i|0xc9);
LCD_write_data(aa);
}
}
}




相关帖子

沙发
创隆电子| | 2013-8-19 11:35 | 只看该作者
这种问题用软件调试单步执行,横容易查找,你软仿了吗?按键与液晶单独调试了吗?是自己写的程序吗?(调试程序小诀窍,例如你的按键程序在外部中断里,可以放一个蜂鸣,进入后鸣响。来判断是否进入)。你这程序按下K0不松手,再按3-4下K1,在一起松手看看啥情况

使用特权

评论回复
板凳
joyme| | 2013-8-19 17:20 | 只看该作者
这么问按键处理的帖子,随便找个状态机的模式写按键处理吧
这样子的程序惨不忍睹啊,即使调出来了也不实用
中断里处理的东西多不算,还有延时,还有死循环处理......

使用特权

评论回复
地板
创隆电子| | 2013-8-19 18:25 | 只看该作者
编程主要讲思路。先不要着急编程,先列几个方案,最后再对比,有时很简单的程序反而写的很复杂,

使用特权

评论回复
5
wdaq19900216|  楼主 | 2013-8-21 09:36 | 只看该作者
创隆电子 发表于 2013-8-19 11:35
这种问题用软件调试单步执行,横容易查找,你软仿了吗?按键与液晶单独调试了吗?是自己写的程序吗?(调试 ...

谢谢你的回复,这个差不多是都是我写的,仿真过了

使用特权

评论回复
6
wdaq19900216|  楼主 | 2013-8-21 09:44 | 只看该作者
joyme 发表于 2013-8-19 17:20
这么问按键处理的帖子,随便找个状态机的模式写按键处理吧
这样子的程序惨不忍睹啊,即使调出来了也不实用
...

目测是大牛啊,你可不可以还说说写这个程序当中应该注意的问题,就我的这个程序,例如中断处理的太多了,有延时,死循环处理,能不能细说一下啊,谢谢啊

使用特权

评论回复
7
wdaq19900216|  楼主 | 2013-8-21 09:52 | 只看该作者
创隆电子 发表于 2013-8-19 18:25
编程主要讲思路。先不要着急编程,先列几个方案,最后再对比,有时很简单的程序反而写的很复杂, ...

谢谢啊,这个我是要做一个温度控制仪,用AD转换获取实际温度,用按键设置需要的温度,经过PID算法控制,输出占空比可调的PWM;我想用一个定时中断来进行AD转换,一个定时中断输出PWM,外部中断就是按键,你就还给点建议我把

使用特权

评论回复
8
林志财| | 2013-8-21 12:13 | 只看该作者
叙述都错了,能大于十吗,大于十不就十一了。

使用特权

评论回复
9
林志财| | 2013-8-21 12:21 | 只看该作者
外部中断是太多东西了,加个FLAG就好了,然后出来键盘处理函数,还有你进了外部中断只是一下子而已,要不低电平触发,按键换为带自锁
void key() interrupt 0 using 0
{
NUM++;
if(num%2==1)
FLAG=1;
else
FLAG=0;

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

2

粉丝