搜索
bottom↓
回复: 31

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

[复制链接]

出0入0汤圆

发表于 2008-1-21 09:46:40 | 显示全部楼层 |阅读模式
希望大侠能多多拍砖,我这是第一次在这人论坛发贴.一直都很喜欢这个论坛,只是一直都没有勇气(因为实在很菜)..今天我终于鼓起勇气来,向你表达:

/******************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++);
   }

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

1

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

发表于 2008-1-21 10:25:55 | 显示全部楼层
对新手要大力支持!

出0入0汤圆

 楼主| 发表于 2008-1-21 10:35:40 | 显示全部楼层
先谢谢啦!在支持的同时,希望能对我们这些菜鸟提些意见,拍下砖头.那我们在若干年之后就不会再是新手了..
头像被屏蔽

出0入0汤圆

发表于 2008-1-21 10:37:04 | 显示全部楼层
电路图太小看不清楚。谢谢上传能看得清楚的,推荐使用PDF格式或更大的GIF/JPG格式。谢谢。

出0入0汤圆

 楼主| 发表于 2008-1-21 11:00:46 | 显示全部楼层
我现在把我的全部原文件发上来..
     先说明下,因为之前有两个一方案,一个是用373并行驱动,一个是用595驱动串行..正式的电路图只有用373做的..都还没转成PDF,等我整理好资料,再将595的传上来!

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

出0入0汤圆

发表于 2008-1-21 11:05:16 | 显示全部楼层
谢谢。COOL!

出0入0汤圆

 楼主| 发表于 2008-1-21 11:10:51 | 显示全部楼层
应该是我谢谢你才对,给我们提供了这么好一个学习的空间!支持阿莫!

出0入0汤圆

 楼主| 发表于 2008-1-21 11:52:07 | 显示全部楼层
点击此处打开ourdev_204194.pdf(文件大小:36K)
上传一张刚刚画好的原理图.PDF的.如果图中有错,请别见怪!

出0入0汤圆

发表于 2008-1-21 12:01:05 | 显示全部楼层
菜鸟向你致敬

出0入0汤圆

 楼主| 发表于 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的值会保持原来的值呢?不过这也正是我想要的.

出0入0汤圆

发表于 2008-3-19 10:15:16 | 显示全部楼层
好像是编译器的原因,一开始随便aaa给它赋个值(不要用位操作赋值),试试看。

出0入0汤圆

 楼主| 发表于 2008-3-19 10:17:48 | 显示全部楼层
点击此处下载ourdev_233596.rar(文件大小:3.25M)

出0入0汤圆

发表于 2008-3-19 10:24:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-3-20 15:37:12 | 显示全部楼层
ding  向你致敬!

出0入0汤圆

 楼主| 发表于 2008-3-20 15:43:53 | 显示全部楼层
我都不好意思了,看了马老师的书,觉得这个程序有很多BLG.如果有空,我会重写的.

出0入0汤圆

发表于 2008-3-20 21:06:26 | 显示全部楼层
作为更菜的菜鸟我先顶一个。。。
要向大家好好学习~~

出0入0汤圆

发表于 2008-5-3 17:09:29 | 显示全部楼层
同样的
作为更菜的我向你看齐

出0入0汤圆

发表于 2008-6-20 09:33:02 | 显示全部楼层
不错啊!~

出0入0汤圆

发表于 2008-7-2 13:26:31 | 显示全部楼层
支持!敬队礼!!

出0入0汤圆

发表于 2009-11-10 23:47:03 | 显示全部楼层
MARK

出0入0汤圆

发表于 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 类型的变量。

出0入0汤圆

发表于 2009-11-11 09:13:42 | 显示全部楼层
晕死,没看日期……

出0入0汤圆

发表于 2009-11-11 14:34:33 | 显示全部楼层
记号!~

出0入0汤圆

 楼主| 发表于 2009-11-11 15:44:53 | 显示全部楼层
【20楼】 catwill

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

出0入0汤圆

发表于 2009-11-11 17:01:33 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-7-5 15:37:16 | 显示全部楼层
回复【楼主位】apcfy  Action
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2011-7-6 10:58:17 | 显示全部楼层
回复【25楼】Helloeveryon
-----------------------------------------------------------------------

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

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

出0入0汤圆

发表于 2012-11-21 22:52:38 | 显示全部楼层
apcfy 发表于 2011-7-6 10:58
回复【25楼】Helloeveryon
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2012-11-22 17:36:41 | 显示全部楼层
呵呵,野菊花也有春天,加油

出0入0汤圆

发表于 2012-11-22 17:40:19 | 显示全部楼层
刚下载下来,仿真过了,挺不错的,菜鸟对你的奉献精神致敬,谢谢

出0入0汤圆

 楼主| 发表于 2012-12-6 17:20:04 | 显示全部楼层
beijinggood2008 发表于 2012-11-21 22:52
LZ现在应该成长成为大牛啦把!

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

出0入0汤圆

发表于 2012-12-6 17:39:34 | 显示全部楼层
  都过这么多年了,不知道楼主怎样啦?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 03:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表