打印

哦,不好意思,wjy1107原来是位**!

[复制链接]
3239|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
starking66|  楼主 | 2009-4-21 08:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问哪位高人知道这个12位键盘串行发送程序应怎样写?!要求每按键盘1次数字自动向左移动1位直到4位满。我试过不用键盘单独显示数字可以,或者单独键盘素描也可以,就是不能同时用?
谁能帮帮小弟,感谢?

相关帖子

沙发
starking66|  楼主 | 2009-4-21 09:12 | 只看该作者

主程序不会写,发个子程序上来!

以下是我写的键盘扫描及串行发送子程序,合在一起就不能用了!请各位指点下哦!

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit cp=P2^5;
sbit ds=P2^4;
sbit a2=P2^3;
uchar code table[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xe3,0x71,0x91,0xfe}; //0~9,L,F,H,.

void delay(uchar z)
{    
    uchar x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void delay50ms(uint time)        //延时大约1ms
{
    uint x,y;
    for(x=time;x>0;x--)
        for(y=5000;y>0;y--);
}

uchar scankey()                //键盘扫描
{
    uchar temp,num;
    P2=0xcf;
    temp=P2;
    temp=temp&0x07;
    while(temp!=0x07)
    {
        delay50ms(1);
        temp=P2;
        temp=temp&0x07;
        while(temp!=0x07)
        {
            temp=P2;
            switch(temp)
            {
                case 0xcb:num=1; break;
                case 0xcd:num=2; break;
                case 0xce:num=3; break;
            }
            while(temp!=0x07)
            {
              temp=P2;
              temp&=0x07;
            }
        }
    }
    
    P2=0xef;
    temp=P2;
    temp=temp&0x07;
    while(temp!=0x07)
    {
        delay50ms(1);
        temp=P2;
        temp=temp&0x07;
        while(temp!=0x07)
        {
            temp=P2;
            switch(temp)
            {
                case 0xeb:num=4;break;
                case 0xed:num=5;break;
                case 0xee:num=6;break;
            }
            while(temp!=0x07)
            {
                temp=P2;
                temp&=0x07;
            }
        }
    }

    P2=0xdf;
    temp=P2;
    temp=temp&0x07;
    while(temp!=0x07)
    {
        delay50ms(1);
        temp=P2;
        temp=temp&0x07;
        while(temp!=0x07)
        {
            temp=P2;
            switch(temp)
            {
                case 0xdb:num=7;break;
                case 0xdd:num=8;break;
                case 0xde:num=9;break;

            }
            while(temp!=0x07)
            {
                temp=P2;
                temp&=0x07;
            }
        }
    }

    P2=0xff;
    temp=P2;
    temp=temp&0x07;
    while(temp!=0x07)
    {
        delay50ms(1);
        temp=P2;
        temp=temp&0x07;
        while(temp!=0x07)
        {
            temp=P2;
            switch(temp)
            {
                case 0xfd:num=0;break;
                case 0xfe:num=11;break;
            }
            while(temp!=0x07)
            {
                temp=P2;
                temp&=0x07;
            }
        }
    }    
    return num;
}    

void display(uchar num)       //串行发送
{
    uchar a,b;
    a=table[num];
    for(b=0;b<8;b++)
        {
            a<<=1;
            cp=0;
            ds=CY;
            cp=1;
        }
     b=0;
}

使用特权

评论回复
板凳
starking66|  楼主 | 2009-4-21 12:29 | 只看该作者

晕了,怎么都没有人回?!

使用特权

评论回复
地板
starking66|  楼主 | 2009-4-21 17:09 | 只看该作者

哎~!还是自己在回!

使用特权

评论回复
5
starking66|  楼主 | 2009-4-22 08:29 | 只看该作者

真够冷的!

看来,来错地方了!
这里只有吹水的人!

使用特权

评论回复
6
xwj| | 2009-4-22 08:33 | 只看该作者

唉...

吹水的路过

使用特权

评论回复
7
呆板书生| | 2009-4-22 08:56 | 只看该作者

打酱油的也路过了

使用特权

评论回复
8
starking66|  楼主 | 2009-4-22 13:38 | 只看该作者

呵呵,感谢两位!

看来以后都不要在这里发技术问题贴了,太冷了!

使用特权

评论回复
9
wjy1107| | 2009-4-22 14:19 | 只看该作者

问题提的不对,让人怎么回答?

从头给你讲?

使用特权

评论回复
10
mohanwei| | 2009-4-22 15:34 | 只看该作者

上大学的时候做过类似的东西,收粮站使用的

屋里的人按键盘,数字在屋外的巨大LED上显示。
按数字则左移;按非数字键则清零。
普通PS/2口小键盘+AT9C51+74HC595+5位LED(单个大小80×150mm)……
得到了两个月伙食费,呵呵

使用特权

评论回复
11
starking66|  楼主 | 2009-4-23 09:04 | 只看该作者

不好意思,可能是不会问题!!

就如10楼的兄弟所说的:12位小键盘+AT9C51+74HC595+4位LED,按数字则左移;按非数字键则用作其他用途!就只是这个功能。
我新手,只能做出不按键直接显示,按键显示就不行了!
我想关键在于怎么处理发按键扫描码时不影响164发码给LED,因为同时发就不能显示正常数字了!

使用特权

评论回复
12
xwj| | 2009-4-23 09:10 | 只看该作者

唉,等你明白缓存、分层设计后就知道要怎么写了

实在是太基础,所以还是建议你自己参悟。


PS:
再次吹水路过

使用特权

评论回复
13
wjy1107| | 2009-4-23 09:21 | 只看该作者

为什么用138 I/O不够吗?


使用特权

评论回复
14
wjy1107| | 2009-4-23 09:31 | 只看该作者

你用138的A控制164的CLK,这种设计就存在问题啊

在你进行键盘扫描的时候,A的状态在改变,那么164的CLK也在改变,并行锁存的内容也就变了,所以你不能显示。

使用特权

评论回复
15
starking66|  楼主 | 2009-4-23 12:07 | 只看该作者

感谢xwj和wjy1107的回复

再次感谢两位!
这个电路没有问题的,别人的程序能通过的,只是我不会写。
我的确不懂缓存、分层设计,请问要在哪里才能找到这方面的资料,谢谢!

使用特权

评论回复
16
wjy1107| | 2009-4-23 14:30 | 只看该作者

这个电路没有问题?开国际玩笑阿!!!

三极管用的是PNP?能点亮?电流什么流向?
我还真佩服能用这个电路图实现你所要的功能的人。
且不说三极管的问题!单从逻辑上就存在矛盾。
从图中分析,进行按键扫描的时候,164根本没办法锁存并行输出。
除非将138的A与C引脚调换还有可能实现。
你是不是照着别人的电路图画的,没抄明白阿?

使用特权

评论回复
17
huangqi412| | 2009-4-23 14:34 | 只看该作者

俺该怎么路过呢?

使用特权

评论回复
18
KBGYZP| | 2009-4-23 21:41 | 只看该作者

轻轻的我走了,就像我轻轻的来!

使用特权

评论回复
19
starking66|  楼主 | 2009-4-24 09:00 | 只看该作者

承蒙wjy1107大哥的提醒!

承蒙wjy1107大哥的提醒,的确发上来的图的PNP是我搞错了,e极和c极应该反过来!这图是我抄别人的成品的,不过138上的A和C是这样的,没有搞错哦!

而且12楼的XXJ都说: 唉,等你明白缓存、分层设计后就知道要怎么写了!
应该是我基础不够吧! 


 
 

使用特权

评论回复
20
wjy1107| | 2009-4-24 09:20 | 只看该作者

我是个女的,不是大哥

   我还是**我的观点,你这个图的逻辑有问题。如果A与C不交换没法实现。
   还有你说的成品是你从哪里看的?实物?如果真有人能用这个逻辑实现需要的功能,我也想知道是怎么做的。
   最后劝你一句,不是拿来的东西都是好用的。

使用特权

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

本版积分规则

1

主题

17

帖子

0

粉丝