打印

跪求牛人解决二个问题!!!

[复制链接]
2653|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjucsd|  楼主 | 2009-11-20 10:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一:#include <reg52.h>
unsigned char tcount2s;
unsigned char tcount02s;
unsigned char ID;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
void main(void)
{

TMOD=0x01;



TH0=0x3c;



TL0=0xb0;



TR0=1;



ET0=1;



EA=1;



while(1);*************
调试的时候死循环在这里,不进入下面的子程序

}
void t0(void) interrupt 1 using 0
{

tcount2s++;



if(tcount2s==40)



{



tcount2s=0;




ID++;




if(ID==4)




{




ID=0;




}



}



tcount02s++;



if(tcount02s==4)



{



tcount02s=0;




switch(ID)




{




case 0:





key1=~key1;






break;





case 1:





key2=~key2;






break;





case 2:





key3=~key3;






break;





case 3:





key4=~key4;






break;




}



}

}
***********为何实验结果是四个灯互相交替闪烁,但是P1.0控制的L1却一直亮着?
***********当我在key1=~key1;语句后加上key2=key3=key4=1;语句之后,后面三句类同也加上相应的句子。虽然这解决了L1灯一直亮着的问题,但是在L2灯闪烁时,进行复位的时候,L1L2灯会同时亮上一会,这是为什么呢?
第三:

1602液晶显示上第一排是一行16个由5*7小黑格组成的大黑格,不知是什么原因?原程序如下:
#include<reg52.h> //包含头文件
#include<intrins.h>
//
包含_nop_();库函数文件
sbit dataport=P0;
//P0
端口为数据端口
sbit RS=P2^0;
//
数据、命令引脚选择
sbit RW=P2^1;
//
读写信号选择
sbit E=P2^2;
//
使能信号
void rd_bf(void)
//
检测LCD是否忙碌
{

dataport=0xff;
//
数据端口先赋予高电平

RS=0;
//
选择指令寄存器

RW=1;
//
读操作

E=1;
//E
为高电平

//
BF(忙碌标志)和AC的值

_nop_(); //
适当延时

_nop_();


while(dataport&0x80);
//
判断数据端口的D7是否为1,假如为1则等待

E=0;

}
wr_dictate(unsigned char dictate)
//
写指令函数,dictate为要写入的指令
{


rd_bf();
//
每次写数据之前,检测LCD是否忙碌

RW=0;
//
写操作

RS=0;
//
选择指令寄存器

E=1;
//E
为高电平

_nop_();
//
适当的延时,目的是为了等待电平的稳定

_nop_();


dataport=dictate;
//
把指令写入到IR

E=0;
//
E从高电平下降到低电平的时候,指令被写入到寄存器
}
wr_data(unsigned char dat)
//
写数据函数,dat为要写入的数据
{


rd_bf();


RW=0;


RS=1;
//
选择数据寄存器

E=1;


_nop_();


_nop_();


dataport=dat;


E=0;

}
void init_lcd(void)
//lcd
初始化函数
{

wr_dictate(0x38);
//
设置数据总线为8位,两行,字符字体为5*7

wr_dictate(0x01);
//
清屏

wr_dictate(0x0c);
//
开显示
}
void display_lcd(unsigned char address,unsigned char ch_data)
//
形式参数address为要显示数据所在的地址,ch_data为要显示的数据
{

wr_dictate(address);
//
写地址

wr_data(ch_data);
//
写数据
}
void main()
{

init_lcd();
//
初始化

display_lcd(0x80,0x41);
//0x80
为第一行第一位置的地址,0x41"A"的代码

while(1);

}

小弟是新人,对于大哥大姐来说,这些可能都是一些小问题,但对于目前的小弟而言,确实大问题。因此再次跪求那位好心的大哥大姐帮帮忙!!!

相关帖子

沙发
jackxn| | 2009-11-20 10:58 | 只看该作者
字小的让我头疼啊,没太看明白

使用特权

评论回复
板凳
xwj| | 2009-11-20 11:07 | 只看该作者
不是我一个人说字小了

使用特权

评论回复
地板
lxyppc| | 2009-11-20 11:27 | 只看该作者
//第一:
#include <reg52.h>
unsigned char tcount2s;
unsigned char tcount02s;
unsigned char ID;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
void main(void)
{
    TMOD=0x01;
    TH0=0x3c;
    TL0=0xb0;
    TR0=1;
    ET0=1;
    EA=1;
    while(1);//*************调试的时候死循环在这里,不进入下面的子程序
}

void t0(void) interrupt 1 using 0
{
    tcount2s++;
    if(tcount2s==40)
    {
        tcount2s=0;
        ID++;
        if(ID==4)
        {
            ID=0;
        }
    }
    tcount02s++;
    if(tcount02s==4)
    {
        tcount02s=0;
        switch(ID)
        {
        case 0:
            key1=~key1;
            break;
        case 1:
            key2=~key2;
            break;
        case 2:
            key3=~key3;
            break;
        case 3:
            key4=~key4;
            break;
        }
    }
}

//***********为何实验结果是四个灯互相交替闪烁,但是P1.0控制的L1却一直亮着?
//***********当我在key1=~key1;语句后加上key2=key3=key4=1;语句之后,后面三句类同也加上相应的句子。虽然这解决了L1灯一直亮着的问题,但是在L2灯闪烁时,进行复位的时候,L1和L2灯会同时亮上一会,这是为什么呢?
//第三:
//1602液晶显示上第一排是一行16个由5*7小黑格组成的大黑格,不知是什么原因?原程序如下:
#include<reg52.h> //包含头文件
#include<intrins.h>
//包含_nop_();库函数文件
sbit dataport=P0;
//P0端口为数据端口
sbit RS=P2^0;
//数据、命令引脚选择
sbit RW=P2^1;
//读写信号选择
sbit E=P2^2;
//使能信号
void rd_bf(void)
//检测LCD是否忙碌
{
    //数据端口先赋予高电平
    dataport=0xff;
    //选择指令寄存器
    RS=0;
    //读操作
    RW=1;
    //E为高电平
    E=1;
    //读BF(忙碌标志)和AC的值
    _nop_(); //适当延时
    _nop_();
    //判断数据端口的D7是否为1,假如为1则等待
    while(dataport&0x80);
    E=0;
}
wr_dictate(unsigned char dictate)
//写指令函数,dictate为要写入的指令
{
    rd_bf();
    //每次写数据之前,检测LCD是否忙碌
    RW=0;
    //写操作
    RS=0;
    //选择指令寄存器
    E=1;
    //E为高电平
    _nop_();
    //适当的延时,目的是为了等待电平的稳定
    _nop_();
    dataport=dictate;
    //把指令写入到IR
    E=0;
    //当E从高电平下降到低电平的时候,指令被写入到寄存器
}

wr_data(unsigned char dat)
//写数据函数,dat为要写入的数据
{
    rd_bf();
    RW=0;
    RS=1;
    //选择数据寄存器
    E=1;
    _nop_();
    _nop_();
    dataport=dat;
    E=0;
}

//lcd初始化函数
void init_lcd(void)
{
    wr_dictate(0x38);
    //设置数据总线为8位,两行,字符字体为5*7
    wr_dictate(0x01);
    //清屏
    wr_dictate(0x0c);
    //开显示
}

//形式参数address为要显示数据所在的地址,ch_data为要显示的数据
void display_lcd(unsigned char address,unsigned char ch_data)
{
    wr_dictate(address);
    //写地址
    wr_data(ch_data);
    //写数据
}

void main()
{
    init_lcd();
    //初始化
    display_lcd(0x80,0x41);
    //0x80为第一行第一位置的地址,0x41为"A"的代码
    while(1);
}

使用特权

评论回复
5
xlsbz| | 2009-11-20 11:29 | 只看该作者
using 0?cut it!!

使用特权

评论回复
6
ejack| | 2009-11-20 12:12 | 只看该作者
本帖最后由 ejack 于 2009-11-20 12:14 编辑

看错了……

使用特权

评论回复
7
ejack| | 2009-11-20 12:21 | 只看该作者
因为你的试验程序少了个初始条件。
初始化应将L1点亮,否则你的循环对于4个灯的初始条件不同。
提问题之前请自己拿纸和笔推算一下,就会明白的。

使用特权

评论回复
8
ejack| | 2009-11-20 12:24 | 只看该作者
更简单的方法是把这段挪到前面。
tcount02s++;
    if(tcount02s==4)
    {
        tcount02s=0;
        switch(ID)
        {
        case 0:
            key1=~key1;
            break;
        case 1:
            key2=~key2;
            break;
        case 2:
            key3=~key3;
            break;
        case 3:
            key4=~key4;
            break;
        }
    }

使用特权

评论回复
9
zjucsd|  楼主 | 2009-11-20 15:48 | 只看该作者
各位大哥,谢谢你们的帮助哦,小弟在此感谢!!

使用特权

评论回复
10
YEZI930| | 2009-11-20 18:07 | 只看该作者
WHILE(1);停止命令,停在那了,出来的条件呢?除了中断~!建议看看郭天翔的视频~!

使用特权

评论回复
11
chen3bing| | 2009-11-20 19:28 | 只看该作者
LCD程序时序有问题。

使用特权

评论回复
12
zhenxing2000| | 2009-11-21 14:09 | 只看该作者
while(1)后边没有分号。
楼主的程序有点杂乱。

使用特权

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

本版积分规则

100

主题

351

帖子

3

粉丝