智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4355|回复: 8
打印 上一主题 下一主题

XS12单片机4X4键盘

[复制链接]

1

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
威望
180
贡献
22
兑换币
0
注册时间
2009-7-26
在线时间
8 小时
跳转到指定楼层
1#
发表于 2009-7-27 17:14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4X4键盘我用XS12单片机做的出了很大的问题  单独行扫描正确  单独列也正确  但是和在一起就不正确了!求高手指点啊!!
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
/*********************************************************************************************************
* 宏定义
*********************************************************************************************************/
#define delay1us         {_asm nop;}
/*#define  DATA          0xff
#define  LCD_EN        0x04                           //B2
#define  LCD_RS        0x01                           //B0
#define  LCD_RW        0x02                           //B1
#define  LCD_DataPort  PORTA                          // A口作为数据口
#define  LCD_ENPort    PORTB
#define  LCD_RWPort    PORTB  
#define  LCD_RSPort    PORTB                          //B0 B1 B2 */
/*********************************************************************************************************
* 全局变量声明
*********************************************************************************************************/
uchar Scan_Code[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,0xde,0xdd,0xdb,0xd7,
         0xee,0xed,0xeb,0xe7};
uchar Word_Shape[17]={0x80,0xf2,0x48,0x60,0x32,0x24,0x04,0xf0,0x00,0x30,0x10,0x06,
       0x8c,0x42,0x0c,0x1c,0xff};
uchar Pot_Read=0,Code_Fin=0,row=0,column=0;     
void delaynus(byte cnt)
{
    byte i;
    for(i = 0; i < cnt; i++)
    {
        delay1us;
    }
}
void delay1ms(void)
{uint i;
for(i=0;i<1140;i++);
}
void delaynms(uint n)
{   uint i;
    for(i=0;i<n;i++)
    delay1ms();      
}
/*void LCD_WC(uchar cmd,uchar data)
{
if(cmd==0)    LCD_RSPort&=~LCD_RS;                      //cmd=0 write the command 1:write the data
else          LCD_RSPort|=LCD_RS;
              LCD_DataPort=data;
              delaynms(10);
              LCD_ENPort|=LCD_EN;                       //rising and falling
              delaynus(10);
              LCD_ENPort&=~LCD_EN;
              delaynus(10);
  
}
void LCD_init(void)
{   
        DDRA = DATA;
        DDRB|=LCD_EN|LCD_RS|LCD_RW;
        LCD_RWPort &=~ LCD_RW;
        LCD_DataPort=0x30;                                        // 3:5*7   4:16x2   5:8bit
        LCD_ENPort|= LCD_EN;
        delaynus(1);
        LCD_ENPort&=~LCD_EN;
        delaynus(40);
        LCD_WC(0,0x38);                                           //显示模式设置
        LCD_WC(0,0x0c);                                           //显示开及光标设置                                      
        LCD_WC(0,0x01);                                           //显示清屏
        LCD_WC(0,0x06);                                           //显示光标移动位置
}
void LCD_XY(uchar x,uchar y)
{
    uchar addr;
    if(y==0)  addr=0x80+x;                                       // first line 0x80
    else      addr=0xc0+x;                                       //second line 0xc0
    LCD_WC(0,addr);
}
void LCD_Wstr(uchar X,uchar Y,char *str)                         //x : line increase direction  y:column
{
    LCD_XY(X,Y);
    while(*str)
  {
    LCD_WC(1,*str);                                              //cmd=1 write the string
    str++;
  }
} */
void key(void)
{  
    DDRA=0xff;
    PORTA = 0xf7; //低四位输出为零
for(;;)
   {   
        PUCR=1;
           DDRB=0x0f;
           PORTB &= 0xf0;
           //Pot_Read=PORTB;
           if(PORTB!=0xf0)
    {
      
   delaynms(8);
   
         if(PORTB!=0xf0)
   {
     
     PORTB&=0xf0;
     Pot_Read=PORTB;
              switch( PORTB)
              {
                    case 0xe0:column=0;break;
                    case 0xd0:column=1;break;
                    case 0xb0:column=2;break;
                    case 0x70:column=3;break;
                    default:break;
              }
                    PORTB = 0x0e;
                    if(Pot_Read==PORTB) row=0;
                    PORTB = 0x0d;
                    if(Pot_Read==PORTB) row=1;
                    PORTB = 0x0b;
                    if(Pot_Read==PORTB) row=2;
                    PORTB = 0x07;
                    if(Pot_Read==PORTB) row=3;
                    Pot_Read&=0xf0;
                    
              /*switch(Pot_Read)
              {
                    case 0xe0:row=0;break;
                    case 0xd0:row=1;break;
                    case 0xb0:row=2;break;
                    case 0x70:row=3;break;
                    default:break;
               } */
       Code_Fin=(row*4+column);
       delaynms(10);
                      PORTA=Word_Shape[Code_Fin];
                     
                      //LCD_Wstr(0,0,"Code_Fin");
                      //delaynms(1000);  
                     /*switch(Code_Fin) {
                        case 0: LCD_Wstr(8,0,"0");break;
                        case 1: LCD_Wstr(8,0,"1");break;
                        case 2: LCD_Wstr(8,0,"2");break;
                        case 3: LCD_Wstr(8,0,"3");break;
                        case 4: LCD_Wstr(8,0,"4");break;
                        case 5: LCD_Wstr(8,0,"5");break;
                        case 6: LCD_Wstr(8,0,"6");break;
                        case 7: LCD_Wstr(8,0,"7");break;
                        case 8: LCD_Wstr(8,0,"8");break;
                        case 9: LCD_Wstr(8,0,"9");break;
                        case 10 CD_Wstr(8,0,"10");break;
                        case 11: LCD_Wstr(8,0,"11"); break;
                        case 12: LCD_Wstr(8,0,"12"); break;
                        case 13: LCD_Wstr(8,0,"13"); break;
                        case 14: LCD_Wstr(8,0,"14"); break;
                        case 15: LCD_Wstr(8,0,"15"); break;
                        default:break;
                        }*/
           // }
          }         
           }
    }
}
/*void display(void)
{
    uchar state;
    state=key();
    DDRB=0Xff;
    PORTB=0x00;
    delaynms(10);
    PORTB=0xc0;
    PORTB=Word_Shape[Code_Fin];  
}*/
void main(void)
{
  //LCD_init();  
  for(;;)
  key();
   
}

39

主题

593

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1694
威望
989
贡献
401
兑换币
86
注册时间
2008-12-13
在线时间
152 小时
2#
发表于 2009-7-29 22:17:53 | 只看该作者
问问题大忌就是把一堆东西丢上来,  除非你RP爆发,不然基本上没人有时间帮你看你的程序。 有些东西需要自己精炼一下,把问题简单化,这样更有利于别人解答,甚至有些时候,自己在精炼问题的过程中,就能发现问题的所在。。。这就是我对你这个问题的回答
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
威望
180
贡献
22
兑换币
0
注册时间
2009-7-26
在线时间
8 小时
3#
 楼主| 发表于 2009-7-30 16:26:45 | 只看该作者
扫描法解决了!下次注意!呵呵
回复 支持 反对

使用道具 举报

3

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
威望
311
贡献
42
兑换币
0
注册时间
2008-4-6
在线时间
27 小时
4#
发表于 2010-2-5 11:33:04 | 只看该作者
回复 支持 反对

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
5#
发表于 2010-2-5 20:03:44 | 只看该作者
回复 3# cherish0323
怎麼解決的,說出來聽聽給予共勉。
回复 支持 反对

使用道具 举报

2

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
QQ
威望
353
贡献
21
兑换币
0
注册时间
2010-1-5
在线时间
25 小时
6#
发表于 2010-3-15 21:55:54 | 只看该作者
学习啦
回复 支持 反对

使用道具 举报

3

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
QQ
威望
240
贡献
42
兑换币
4
注册时间
2010-4-21
在线时间
2 小时
7#
发表于 2010-4-21 21:01:16 | 只看该作者
恩,有道理
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
QQ
威望
231
贡献
34
兑换币
0
注册时间
2010-10-19
在线时间
2 小时
8#
发表于 2011-1-12 08:36:23 | 只看该作者
.。。。。。。
回复 支持 反对

使用道具 举报

1

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
QQ
威望
295
贡献
28
兑换币
2
注册时间
2010-12-21
在线时间
11 小时
9#
发表于 2011-1-27 09:31:04 | 只看该作者
同意
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-2 12:07 , Processed in 0.058800 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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