一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4148|回复: 10

[其他综合] 民工学单片机:学了几天单片机,自己写的4x4矩阵键盘扫描代码

[复制链接]
发表于 2012-11-17 12:07 | 显示全部楼层 |阅读模式
我看实例是4行扫描用4段重复代码,太浪费,我喜欢精简,改成了4循环,并且用反回值,方便引用键值。


//============
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//uchar code dig[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管0~F 码表
uchar code dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管 0-F的码表
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;

/*--------------------ms延时函数-----------------------*/
void delay_ms(unsigned int ms_number) // ms延时函数 (AT89C51 @ 11.0592MHz)
{
unsigned int i;
unsigned char j;
for(i=0;i<ms_number;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
uchar keyscan()
{
uchar p,k,i,key[]={0xfe,0xfd,0xfb,0xf7};
for(i=0;i<4;i++)
{
  P3=key[i];
  p=P3;
     p&=0xf0;
  if(p!=0xf0)
  {
   delay_ms(20);
   p=P3;
   p&=0xf0;
   if(p!=0xf0)
   {
    switch(p)      
    {
     case(0xe0):
     k=0;  
     break;
     case(0xd0):
     k=1;  
     break;
     case(0xb0):
     k=2;  
     break;
     case(0x70):
     k=3;  
     break;
    }
    //beep=0; //按键声音
    while(p!=0xf0)     //等待释放按键
    {
    p=P3;
    p&=0xf0;
    }
    delay_ms(100);
    //beep=1;
    k+=4*i;
    return k;
   }

  }
}
return 0xff;
}

void main()
{
uchar i,k;
P0=0xff;
wela=1;
wela=0;
  for(i=0;i<16;i++)
  {
  P0=dig[i];
  dula=1;
  dula=0;
  delay_ms(500);
  }
  P0=dig[0];
  dula=1;
  dula=0;

  while(1)
  {
k=keyscan();
while(k==0xff)k=keyscan();
P0=dig[k];  //数码管显示按键值。
dula=1;
dula=0;
}

}
发表于 2012-11-17 12:20 | 显示全部楼层
慢慢去掉delay
回复

使用道具 举报

 楼主| 发表于 2012-11-17 12:25 | 显示全部楼层
回复 2# taishandadi


    您的意思是消抖延时不需要?还是用芯片内置定时器?
回复

使用道具 举报

发表于 2012-11-17 13:12 | 显示全部楼层
我不懂这个,想学没精力
回复

使用道具 举报

发表于 2012-11-17 18:05 | 显示全部楼层
这不是一般的民工啊,超级牛X的民工。。。
回复

使用道具 举报

发表于 2012-11-17 18:21 | 显示全部楼层

佩服 c语言我都接触几年了  还是皮毛....
回复

使用道具 举报

发表于 2012-11-17 19:53 | 显示全部楼层
牛x的民工!我想可惜还接触过
回复

使用道具 举报

 楼主| 发表于 2012-11-17 21:33 | 显示全部楼层
回复 5# dianzichina


    说实话单片机并不难啊。只要有C语言基础,以前代码怎么写现在还是怎么写。我是自学VB的(这点有好处哦,开发上位机软件容易),C语言也是略懂点语法,只是玩网站做网页的时候接触过javascript,玩手机的时候接触过shell脚本。其实都是大同小异的东西。再加上年龄上来了,悟性可能会高点,以前不懂的东西,现在回头一看就明白了。可能编程语言对于没学过的人来说比较难,但学过的人是不容易忘记的,重新上手非常容易,尽管我没编程很多年了。

    说自己是民工,不是哗众取宠,而确确实实是在工地打拼的。只是现在是自己做个小工头带着几个人做,不锈钢、铝窗等装修。在工地搞混凝土也是常有的事,经常一身脏兮兮的。说自己是民工,绝对不是夸张。 至于为什么学单片机,就跟大家为什么玩电子一样。爱好呗!我初中喜欢电子,高中就喜欢电脑和编程,高中毕业后出入社会也玩了一段时间。单片机当初没接触过觉得很高深,但是深深喜欢电子和软件的结合。现在有了家庭老婆和孩子,想想再不多玩几年,老了就没得玩了。以后我这些家当都得给我儿子玩去了。
回复

使用道具 举报

发表于 2012-11-18 19:28 | 显示全部楼层
回复 8# biaosoft


    冠个“民工”的头衔意义何在?大家在这里没有高低贵贱之分。
回复

使用道具 举报

发表于 2012-11-18 21:40 | 显示全部楼层
按键,一般用个定时扫描。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-3 20:01 , Processed in 0.033505 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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