OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5855|回复: 6

矩阵扫描

[复制链接]

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-11-24
在线时间
0 小时
发表于 2012-11-29 19:47:24 | 显示全部楼层 |阅读模式
#include"STC12C5A.h"

void keyscan();
void find(unsigned char num);
void process();

unsigned char keynum=0;
unsigned char const seg[10] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //段选

sbit HC595_SCK = P0^4;
sbit HC595_RCK = P0^5;
sbit HC595_RST = P0^6;
sbit HC595_DAT = P0^7;

void sendbyte(unsigned char num);

void show(unsigned char num);

void diaplay(unsigned char num);

void delay_ms(unsigned char time);

void main()
{
    P0 &=~(1<<6);
    while(1)
{
  keyscan();
  process();
       }
}

void delay_ms(unsigned char time)
{
   unsigned char t;
   while(time--)
   {
      t=1500;
 while(t--);
   }
}

void diaplay(unsigned char num)
{    show(num/1000);
    0 = (P0&0xf0)|1;
    delay_ms(2);
    show(num%1000/100);                       
    0 = (P0&0xf0)|2;                                     //数码管位选
    delay_ms(2);   
   show(num%1000/100);
    0 = (P0&0xf0)|4;
    delay_ms(2);
    show(num%1000/100);
    0 = (P0&0xf0)|8;
    delay_ms(2);


}

void show(unsigned char num)
{
   sendbyte(seg[num]);

void sendbyte(unsigned char num)
{
 unsigned char i,temp;
    for(i=0;i<=7;i++)
   {
        temp = num&1<<i;
        if(temp)
        {
            HC595_DAT = 1;         //串行输入1
        }
        else
        {
            HC595_DAT=0;
        }
        HC595_SCK=1; //上升沿,移位
        delay_ms(1);
        HC595_SCK=0;
        delay_ms(1);
    }
    HC595_RCK=0; //上升沿,并行输出
    delay_ms(1);
    HC595_RCK=1; 
 


void find(unsigned char num)
{
   keynum=0;
   2=0X0F;
   switch((~P2)&0X0F)
   {
    case 1: keynum=1+num;break;
case 2: keynum=4+num;break;
case 4: keynum=8+num;break;
case 8: keynum=12+num;break;
default: break;
   }
}

void keyscan()
{
   2=0X80;   //将p2^7置高电平,若p2^7不再为高电平,说明这一列有按键按下
   if(P2&0X80!=0X80)
   {
      delay_ms(15);
 if(P2&0X80!=0X80)
 find(0);
   }
   2=0X40;
   if(P2&0X40!=0X40)
   {
      delay_ms(15);
 if(P2&0X40!=0X40)
 find(4);
   }
   2=0X20;
   if(P2&0X20!=0X20)
   {
      delay_ms(15);
 if(P2&0X20!=0X20)
 find(8);
   }
   2=0X10;
   if(P2&0X10!=0X10)
   {
      delay_ms(15);
 if(P2&0X10!=0X10)
 find(12);
   }
}

void process()
{
   switch(process)
  {
      case 1: show(1);break;
      case 2: show(2);break;      
      case 3: show(3);break;
      case 4: show(4);break;
      case 5: show(5);break;
      case 6: show(6);break;
      case 7: show(7);break;     
      case 8: show(8);break;
      case 9: show(9);break;
      case 10: show(10);break;
      case 11: show(11);break;
      case 12: show(12);break;
      case 13: show(13);break;
      case 14: show(14);break;
      case 15: show(15);break;
      case 16: show(16);break;
  }

}

单片机型号是STC12C5A60S2,4位数码管,就是想扫描矩阵键盘,但数码管显示的不知道什么东西
求解答!!!


  I CAN BE BETTER
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-11-24
在线时间
0 小时
 楼主| 发表于 2012-11-29 19:48:51 | 显示全部楼层
求解答回复【楼主位】徐自清2012:
---------------------------------
 
大家帮帮忙,求解答
  I CAN BE BETTER
回复 支持 反对

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-11-24
在线时间
0 小时
 楼主| 发表于 2012-11-29 19:55:42 | 显示全部楼层
void process()
{
   switch(keynum)
  ....
}
不是这个错误
  I CAN BE BETTER
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-11-29 21:34:20 | 显示全部楼层
先搞定数码管显示,数码管显示正常了,再做按键扫描测试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-11-24
在线时间
0 小时
 楼主| 发表于 2012-11-29 22:09:58 | 显示全部楼层
数码管是正常的啊,我刚写一个动态显示,完全正常,只是扫面不知道出了什么问题
  I CAN BE BETTER
回复 支持 反对

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-11-24
在线时间
0 小时
 楼主| 发表于 2012-11-29 22:10:09 | 显示全部楼层
#include"STC12C5A.h"

unsigned char reg[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};

sbit smg_sck = P0^4;
sbit smg_rck = P0^5;
sbit smg_rst = P0^6;
sbit smg_dat = P0^7;

void delay_ms(unsigned char time)
{
   unsigned char t;
   while(time--)
   {
      t=1500;
 while(t--);
   }
}

void sendbyte(unsigned char byte)
{
    unsigned char i;
for( i=0;i<8;i++)
{
   unsigned char temp;
   temp=byte&(1<<i);
if(temp)
  smg_dat=1;
else smg_dat=0;
smg_sck=0;
delay_ms(3);
smg_sck=1;
delay_ms(3);
}
smg_rck=0;
delay_ms(3);
smg_rck=1;
delay_ms(3);
}

void show(unsigned char num)
{
    sendbyte(reg[num]);
}

void display(unsigned char dat)
{
    
    show(dat/1000);
P0=(P0&0XF0)|1 ;
delay_ms(2);
    show(dat%1000/100);
P0=P0&0XF0|2 ;
delay_ms(2);

    show(dat%100/10);
P0=P0&0XF04|4 ;
delay_ms(2);

    show(dat%10);
P0=P0&0XF0|8 ;
delay_ms(2);
}

void main ()
{
   while(1)
   {
      unsigned char time,num=0;
      P0=0X00;
 smg_rst=0;
      while(1)
    {
num = (num+1)%10000; //动态显示0~9999
time = 2;
while(time--)
display(num) ;
}
   } 
}


最后数码管只显示到250,怎么回事?


  I CAN BE BETTER
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-1-5
在线时间
7 小时
发表于 2013-1-5 15:05:42 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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