apcfy 发表于 2008-1-21 09:46:40

一直都是以菜鸟身份出现,从来不敢发贴.今天发个595控制4进8出的程序,希望大侠拍砖!

希望大侠能多多拍砖,我这是第一次在这人论坛发贴.一直都很喜欢这个论坛,只是一直都没有勇气(因为实在很菜)..今天我终于鼓起勇气来,向你表达:

/******************32个按键扫描控制4进8出信号**************************
************************编译器: Keil**********************************
************************作者: Action**********************************
************************开始日期: 2008-01-08**************************
************************完成日期: 2008-01-21**************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit SH = P3^0;
sbit DS = P3^1;
sbit ST = P3^2;

sbit one_h = P3^4;
sbit two_h = P3^5;
sbit three_h = P3^6;
sbit four_h = P3^7;

void key (void);//按键识别
uchar key_out (void);
void driver(uchar out_data,add);//595发送数据
void delay(uchar H);

void key (void)
   {
    uchar out_add;
    one_h = 0;
        if(P1 != 0xff)
          {
           delay(10);
           if(P1 != 0xff)//当确定有第一列有键按下时,查询为哪个按键按下。并发送给595 driver程序.
             {
             out_add=key_out();       
               driver(0,out_add);
               }
          }
        one_h = 1;
    two_h = 0;
        if(P1 != 0xff)
          {
           delay(10);
           if(P1 != 0xff)
             {
             out_add=key_out();
               driver(1,out_add);
               }
          }
        two_h = 1;
        three_h = 0;
        if(P1 != 0xff)
          {
           delay(10);
           if(P1 != 0xff)
             {
             out_add=key_out();
               driver(2,out_add);
               }
          }
        three_h = 1;
    four_h = 0;
        if(P1 != 0xff)
          {
           delay(10);
           if(P1 !=0xff)
             {
             out_add=key_out();
         driver(3,out_add);
               }
          }
    four_h = 1;
   }

uchar key_out (void)    //判断哪一行有键按下
   {
    uchar out;
    switch(P1)
             {
              case 0xFE: out=0;break;
              case 0xFD: out=2;break;
              case 0xFB: out=4;break;
              case 0xF7: out=6;break;
              case 0xEF: out=8;break;
              case 0xDF: out=10;break;
              case 0xBF: out=12;break;
              case 0x7F: out=14;break;
          break;
               }
         return out;
        }

void driver(uchar out_data,add)
   {
   uint data_16,tmep,aaa;
       uchar i;
       data_16 = 0xFFFF;
   data_16 &= (out_data<<add);
   switch (add)
           {
          case 0: data_16|= 0xFFFC;aaa |=0x3; aaa &= data_16;break;
                case 2: data_16|= 0xFFF3;aaa |=0xC; aaa &= data_16;break;
                case 4: data_16|= 0xFFCF;aaa |=0x30; aaa &= data_16;break;
                case 6: data_16|= 0xFF3F;aaa |=0xC0; aaa &= data_16;break;
                case 8: data_16|= 0xFCFF;aaa |=0x300; aaa &= data_16;break;
                case 10:data_16|= 0xF3FF;aaa |=0xC00; aaa &= data_16;break;
                case 12:data_16|= 0xCFFF;aaa |=0x3000; aaa &= data_16;break;
                case 14:data_16|= 0x3FFF;aaa |=0xC000; aaa &= data_16;break;
           }
       ST = 0;
   for(i=0;i<16;i++)
          {
               SH = 0;
             tmep = (aaa<<i);
               if(tmep < 0x8000)
                   DS = 0;
               else
                   DS = 1;
               SH = 1;
               }
       ST = 1;
   }

void main (void)
    {
        P3 |= 0xf0;
        P1 = 0xff;
        while(1)
        key();
        }

void delay(uchar H)
   {
    uchar i;
          for(; H>0; H--)
             for(i=0; i<200; i++);
   }

以下电路图可能看不清楚,请向下看贴,我会将清楚的图贴在后面的回复里。

1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_203997.JPG

aleyn 发表于 2008-1-21 10:25:55

对新手要大力支持!

apcfy 发表于 2008-1-21 10:35:40

先谢谢啦!在支持的同时,希望能对我们这些菜鸟提些意见,拍下砖头.那我们在若干年之后就不会再是新手了..

armok 发表于 2008-1-21 10:37:04

电路图太小看不清楚。谢谢上传能看得清楚的,推荐使用PDF格式或更大的GIF/JPG格式。谢谢。

apcfy 发表于 2008-1-21 11:00:46

我现在把我的全部原文件发上来..
   先说明下,因为之前有两个一方案,一个是用373并行驱动,一个是用595驱动串行..正式的电路图只有用373做的..都还没转成PDF,等我整理好资料,再将595的传上来!

以下是我的原始资料:
点击此处下载ourdev_204072.rar(文件大小:132K)

armok 发表于 2008-1-21 11:05:16

谢谢。COOL!

apcfy 发表于 2008-1-21 11:10:51

应该是我谢谢你才对,给我们提供了这么好一个学习的空间!支持阿莫!

apcfy 发表于 2008-1-21 11:52:07

点击此处打开ourdev_204194.pdf(文件大小:36K)
上传一张刚刚画好的原理图.PDF的.如果图中有错,请别见怪!

abcdezh 发表于 2008-1-21 12:01:05

菜鸟向你致敬

apcfy 发表于 2008-1-21 13:34:36

void driver(uchar out_data,add)
   {
   uint data_16,tmep,aaa;
         uchar i;
         data_16 = 0xFFFF;
   data_16 &= (out_data<<add);
   switch (add)
         {
            case 0: data_16|= 0xFFFC;aaa |=0x3; aaa &= data_16;break;
                case 2: data_16|= 0xFFF3;aaa |=0xC; aaa &= data_16;break;
                case 4: data_16|= 0xFFCF;aaa |=0x30; aaa &= data_16;break;
                case 6: data_16|= 0xFF3F;aaa |=0xC0; aaa &= data_16;break;
                case 8: data_16|= 0xFCFF;aaa |=0x300; aaa &= data_16;break;
                case 10:data_16|= 0xF3FF;aaa |=0xC00; aaa &= data_16;break;
                case 12:data_16|= 0xCFFF;aaa |=0x3000; aaa &= data_16;break;
                case 14:data_16|= 0x3FFF;aaa |=0xC000; aaa &= data_16;break;
         }
         ST = 0;
   for(i=0;i<16;i++)
            {
               SH = 0;
             tmep = (aaa<<i);
               if(tmep < 0x8000)
                   DS = 0;
               else
                   DS = 1;
               SH = 1;
               }
         ST = 1;
   }
其实我有个问题想请教大家的,上面这段有aaa这个变量不是全局变量,为什么退出这个函数,再进来时,aaa的值会保持原来的值呢?不过这也正是我想要的.

yulutong 发表于 2008-3-19 10:15:16

好像是编译器的原因,一开始随便aaa给它赋个值(不要用位操作赋值),试试看。

apcfy 发表于 2008-3-19 10:17:48

点击此处下载ourdev_233596.rar(文件大小:3.25M)

spy2008 发表于 2008-3-19 10:24:10

mark

masterman 发表于 2008-3-20 15:37:12

ding向你致敬!

apcfy 发表于 2008-3-20 15:43:53

我都不好意思了,看了马老师的书,觉得这个程序有很多BLG.如果有空,我会重写的.

liuchang3721 发表于 2008-3-20 21:06:26

作为更菜的菜鸟我先顶一个。。。
要向大家好好学习~~

xrlong 发表于 2008-5-3 17:09:29

同样的
作为更菜的我向你看齐

paulmaldini 发表于 2008-6-20 09:33:02

不错啊!~

lzxhong 发表于 2008-7-2 13:26:31

支持!敬队礼!!

158611069 发表于 2009-11-10 23:47:03

MARK

catwill 发表于 2009-11-11 09:11:12

楼主::

void driver(uchar out_data,add)
   {
   uint data_16,tmep,aaa;
         uchar i;
         data_16 = 0xFFFF;
   data_16 &= (out_data<<add);
   switch (add)
         {
            case 0: data_16|= 0xFFFC;aaa |=0x3; aaa &= data_16;break;
                case 2: data_16|= 0xFFF3;aaa |=0xC; aaa &= data_16;break;
                case 4: data_16|= 0xFFCF;aaa |=0x30; aaa &= data_16;break;
                case 6: data_16|= 0xFF3F;aaa |=0xC0; aaa &= data_16;break;
                case 8: data_16|= 0xFCFF;aaa |=0x300; aaa &= data_16;break;
                case 10:data_16|= 0xF3FF;aaa |=0xC00; aaa &= data_16;break;
                case 12:data_16|= 0xCFFF;aaa |=0x3000; aaa &= data_16;break;
                case 14:data_16|= 0x3FFF;aaa |=0xC000; aaa &= data_16;break;
         }
         ST = 0;
   for(i=0;i<16;i++)
            {
               SH = 0;
             tmep = (aaa<<i);
               if(tmep < 0x8000)
                   DS = 0;
               else
                   DS = 1;   
               SH = 1;
               }
         ST = 1;
   }
其实我有个问题想请教大家的,上面这段有aaa这个变量不是全局变量,为什么退出这个函数,再进来时,aaa的值会保持原来的值呢?不过这也正是我想要的.


这个问题可以这么理解:
aaa变量虽然是局部变量,但是在这个函数退出后并没有其他局部变量来使用aaa的内存空间,造成再次进入本函数时aaa的值保存了上次退出前的值;
“不过这也正是我想要的. ”----不应该利用这种特性,因为您不能在编译前分析它的内存分配,或者说不方便分析,而且这种特性和编译器相关,也就是说,这么写是不可移植的,有可能换个编译器就不能运行,甚至您再添加一些其他代码就会覆盖掉aaa的空间造成aaa的值不是上次退出的值,而变成垃圾。
如果需要在退出的时候还保存aaa的值,可以把它声明为static 类型的变量。

catwill 发表于 2009-11-11 09:13:42

晕死,没看日期……

tom030704 发表于 2009-11-11 14:34:33

记号!~

apcfy 发表于 2009-11-11 15:44:53

【20楼】 catwill

谢谢,您的提示并不过时,好像自那起,我就没怎么动过C语这玩艺了!

master5888 发表于 2009-11-11 17:01:33

MARK

Helloeveryon 发表于 2011-7-5 15:37:16

回复【楼主位】apcfyAction
-----------------------------------------------------------------------

楼主,这东西有什么实际的用途吗?IO扩展

apcfy 发表于 2011-7-6 10:58:17

回复【25楼】Helloeveryon
-----------------------------------------------------------------------

这坟挖得够厉害,这么多年了。当然是扩展IO,其实这个就是4进8出控制,只是每路都要可以单独控制,故要那么多按键,那么多灯。本人用单片机做的第一项目,也是在本坛发的第一个帖子。。

感叹下,时间过得真快!!!周围环境变化真TM大。。自己的变化呢?

beijinggood2008 发表于 2012-11-21 22:52:38

apcfy 发表于 2011-7-6 10:58 static/image/common/back.gif
回复【25楼】Helloeveryon
-----------------------------------------------------------------------



LZ现在应该成长成为大牛啦把!

lxy004 发表于 2012-11-22 17:36:41

呵呵,野菊花也有春天,加油

lxy004 发表于 2012-11-22 17:40:19

刚下载下来,仿真过了,挺不错的,菜鸟对你的奉献精神致敬,谢谢

apcfy 发表于 2012-12-6 17:20:04

beijinggood2008 发表于 2012-11-21 22:52 static/image/common/back.gif
LZ现在应该成长成为大牛啦把!

哈哈,不长进呀!N年了,仍是菜鸟。。。
不思进取

liangjiatian 发表于 2012-12-6 17:39:34

{:titter:}都过这么多年了,不知道楼主怎样啦?
页: [1]
查看完整版本: 一直都是以菜鸟身份出现,从来不敢发贴.今天发个595控制4进8出的程序,希望大侠拍砖!