找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 967|回复: 10
收起左侧

51单片机定时器扫描4x4键盘的程序问题

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:879924 发表于 2022-5-13 09:10 | 显示全部楼层 |阅读模式
我有2个问题,第一个问题:stc15w4k58s4单片机芯片定时器扫描4x4键盘的问题,代码如下:

但是为什么我只能扫描到 a,b,c,d 四个按键? 按其他按键都被识别为a,b,c,d!
第二个问题:晶振我都设置为11.0592MHZ了,和stc89c52使用一样的晶振,但是stc-isp生成两款芯片的软件延时和定时器初值不一样。这两个不是根据晶振频率来设置的吗?既然都是11.0592MHZ了,为什么不一样呢?

谢谢大佬指点!初学菜鸡感激不尽。
  1. #include <stc15.h>
  2. #include "key.h"

  3. unsigned char Key_Flag='x';

  4. void Key_Init(void)
  5. {
  6.         P1=0xFF;
  7. }

  8. unsigned char Key_GetState(void)
  9. {
  10.         unsigned char Key_State='x';
  11.         
  12.         P3=0xFF;
  13.         Row_1=0;
  14.         if(Column_1==0)
  15.                 Key_State='1';
  16.         if(Column_2==0)
  17.                 Key_State='4';
  18.         if(Column_3==0)
  19.                 Key_State='7';
  20.         if(Column_4==0)
  21.                 Key_State='*';
  22.         
  23.         P3=0xFF;
  24.         Row_2=0;
  25.         if(Column_1==0)
  26.                 Key_State='2';
  27.         if(Column_2==0)
  28.                 Key_State='5';
  29.         if(Column_3==0)
  30.                 Key_State='8';
  31.         if(Column_4==0)
  32.                 Key_State='0';
  33.         
  34.         P3=0xFF;
  35.         Row_3=0;
  36.         if(Column_1==0)
  37.                 Key_State='3';
  38.         if(Column_2==0)
  39.                 Key_State='6';
  40.         if(Column_3==0)
  41.                 Key_State='9';
  42.         if(Column_4==0)
  43.                 Key_State='#';
  44.         
  45.         P3=0xFF;
  46.         Row_4=0;
  47.         if(Column_1==0)
  48.                 Key_State='a';
  49.         if(Column_2==0)
  50.                 Key_State='b';
  51.         if(Column_3==0)
  52.                 Key_State='c';
  53.         if(Column_4==0)
  54.                 Key_State='d';
  55.         
  56.         return Key_State;
  57. }


  58. void Key_Scan(void)
  59. {
  60.         static unsigned char Key_LastState='x',Key_NowState='x';
  61.         
  62.         Key_LastState=Key_NowState;
  63.         Key_NowState=Key_GetState();
  64.         if(Key_LastState=='x'&&Key_NowState=='0')
  65.                 Key_Flag='0';
  66.         if(Key_LastState=='x'&&Key_NowState=='1')
  67.                 Key_Flag='1';
  68.         if(Key_LastState=='x'&&Key_NowState=='2')
  69.                 Key_Flag='2';
  70.         if(Key_LastState=='x'&&Key_NowState=='3')
  71.                 Key_Flag='3';
  72.         if(Key_LastState=='x'&&Key_NowState=='4')
  73.                 Key_Flag='4';
  74.         if(Key_LastState=='x'&&Key_NowState=='5')
  75.                 Key_Flag='5';
  76.         if(Key_LastState=='x'&&Key_NowState=='6')
  77.                 Key_Flag='6';
  78.         if(Key_LastState=='x'&&Key_NowState=='7')
  79.                 Key_Flag='7';
  80.         if(Key_LastState=='x'&&Key_NowState=='8')
  81.                 Key_Flag='8';
  82.         if(Key_LastState=='x'&&Key_NowState=='9')
  83.                 Key_Flag='9';
  84.         if(Key_LastState=='x'&&Key_NowState=='a')
  85.                 Key_Flag='a';
  86.         if(Key_LastState=='x'&&Key_NowState=='b')
  87.                 Key_Flag='b';
  88.         if(Key_LastState=='x'&&Key_NowState=='c')
  89.                 Key_Flag='c';
  90.         if(Key_LastState=='x'&&Key_NowState=='d')
  91.                 Key_Flag='d';
  92.         if(Key_LastState=='x'&&Key_NowState=='*')
  93.                 Key_Flag='*';
  94.         if(Key_LastState=='x'&&Key_NowState=='#')
  95.                 Key_Flag='#';
  96. }
复制代码
  1. #ifndef __KEY_H__
  2. #define __KEY_H__

  3. #include <stc15.h>

  4. sbit Row_1=P1^7;
  5. sbit Row_2=P1^6;
  6. sbit Row_3=P1^5;
  7. sbit Row_4=P1^4;
  8. sbit Column_1=P1^3;
  9. sbit Column_2=P1^2;
  10. sbit Column_3=P1^1;
  11. sbit Column_4=P1^0;


  12. void Key_Init(void);
  13. unsigned char Key_GetState(void);
  14. void Key_Scan(void);

  15. #endif
复制代码
  1. #include <stc15.h>
  2. #include "key.h"

  3. void Timer0_Init(void)                //1毫秒@11.0592MHz
  4. {
  5.         AUXR &= 0x7F;                //定时器时钟12T模式
  6.         TMOD &= 0xF0;                //设置定时器模式
  7.         TMOD |= 0x01;                //设置定时器模式
  8.         TL0 = 0x66;                //设置定时初始值
  9.         TH0 = 0xFC;                //设置定时初始值
  10.         TF0 = 0;                //清除TF0标志
  11.         TR0 = 1;                //定时器0开始计时
  12.         PT0 = 0;                //中断优先级
  13.         ET0 = 1;                //定时器0中断允许
  14.         EA = 1;                        //总中断允许
  15. }

  16. void Timer0_ISR(void) interrupt 1
  17. {
  18.         static unsigned int T0_Count=0;
  19.         TL0=0x66;
  20.         TH0=0xFC;
  21.         T0_Count++;
  22.         if(T0_Count>=20)
  23.         {
  24.                 T0_Count=0;
  25.                 Key_Scan();
  26.         }
  27. }
复制代码
  1. #ifndef __TIMER_H__
  2. #define __TIMER_H__

  3. void Timer0_Init(void);

  4. #endif
复制代码
  1. #include <stc15.h>
  2. #include "timer0.h"
  3. #include "key.h"

  4. void main(void)
  5. {
  6.         extern unsigned char Key_Flag;        
  7.         P0M0=0X00;
  8.         P0M1=0X00;
  9.         P1M0=0X00;
  10.         P1M1=0X00;
  11.         P2M0=0X00;
  12.         P2M1=0X00;
  13.         P3M0=0X00;
  14.         P3M1=0X00;
  15.         Timer0_Init();
  16.         while(1)
  17.         {
  18.             if(Key_Flag=='0')
  19.                 .....
  20.             if(Key_Flag=='1')
  21.                 .....
  22.         }
复制代码

回复

使用道具 举报

ID:61261 发表于 2022-5-13 11:07 | 显示全部楼层
端口信号读取有问题可能
回复

使用道具 举报

ID:844772 发表于 2022-5-13 11:39 | 显示全部楼层
1.芯片不同,1T的啊;2.  你键盘接的是P1 , P3=0xFF;都改成P1 =0xFF;
回复

使用道具 举报

ID:879924 发表于 2022-5-13 12:29 | 显示全部楼层
glinfei 发表于 2022-5-13 11:39
1.芯片不同,1T的啊;2.  你键盘接的是P1 , P3=0xFF;都改成P1 =0xFF;

还真是嘞。。。大神!!!  关于定时器和延时的那个,我已经设置为12T了,还是不一样呢?
回复

使用道具 举报

ID:390416 发表于 2022-5-13 12:34 | 显示全部楼层
这代码 太繁琐了。20多行就可以搞定的事情 代码 矩阵键盘.jpg
回复

使用道具 举报

ID:230742 发表于 2022-5-13 13:08 | 显示全部楼层
纠结延时干嘛。用什么单片机就用什么定时器计算方法。纠结半天,计算只需要2秒。
回复

使用道具 举报

ID:795404 发表于 2022-5-13 15:50 | 显示全部楼层
unsigned char Key_GetState(void)
{
        unsigned char Key_State='x';
      
        P3=0xFF;
        Row_1=0;
        if(Column_1==0)
                Key_State='1';

sbit Row_1=P1^7;
sbit Row_2=P1^6;
sbit Row_3=P1^5;
sbit Row_4=P1^4;
sbit Column_1=P1^3;
sbit Column_2=P1^2;
sbit Column_3=P1^1;
sbit Column_4=P1^0;
键盘定义是P1口,扫描的时候用的 P3=0xFF
回复

使用道具 举报

ID:123289 发表于 2022-5-13 17:37 | 显示全部楼层
第一个问题,自己走单步调试,就会发现问题之所在了。
第二个问题,查手册,重是看CPU时钟部分:CLK_DIV……
回复

使用道具 举报

ID:879924 发表于 2022-5-14 18:04 | 显示全部楼层
人人学会单片机 发表于 2022-5-13 12:34
这代码 太繁琐了。20多行就可以搞定的事情

牛皮!!!!!!!!!!!!!!!!
回复

使用道具 举报

ID:1026496 发表于 2022-5-14 21:50 | 显示全部楼层
static unsigned int T0_Count=0; 这个建议加个volatile   static volatile unsigned int T0_Count=0;代码层次很混乱,建议少用全局变量,可以使用静态局部然后在需要跨文件使用的时候使用函数调用的方式
回复

使用道具 举报

ID:1026496 发表于 2022-5-14 21:51 | 显示全部楼层
P3=0xFF; 这个全部改成P1 = 0XFF;
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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