久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1760|回復: 10
打印 上一主題 下一主題
收起左側(cè)

51單片機定時器掃描4x4鍵盤的程序問題

[復制鏈接]
回帖獎勵 5 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:879924 發(fā)表于 2022-5-13 09:10 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我有2個問題,第一個問題:stc15w4k58s4單片機芯片定時器掃描4x4鍵盤的問題,代碼如下:

但是為什么我只能掃描到 a,b,c,d 四個按鍵? 按其他按鍵都被識別為a,b,c,d!
第二個問題:晶振我都設置為11.0592MHZ了,和stc89c52使用一樣的晶振,但是stc-isp生成兩款芯片的軟件延時和定時器初值不一樣。這兩個不是根據(jù)晶振頻率來設置的嗎?既然都是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;                //中斷優(yōu)先級
  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.         }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:61261 發(fā)表于 2022-5-13 11:07 | 只看該作者
端口信號讀取有問題可能
回復

使用道具 舉報

板凳
ID:844772 發(fā)表于 2022-5-13 11:39 | 只看該作者
1.芯片不同,1T的啊;2.  你鍵盤接的是P1 , P3=0xFF;都改成P1 =0xFF;
回復

使用道具 舉報

地板
ID:879924 發(fā)表于 2022-5-13 12:29 | 只看該作者
glinfei 發(fā)表于 2022-5-13 11:39
1.芯片不同,1T的啊;2.  你鍵盤接的是P1 , P3=0xFF;都改成P1 =0xFF;

還真是嘞。。。大神!!!  關(guān)于定時器和延時的那個,我已經(jīng)設置為12T了,還是不一樣呢?
回復

使用道具 舉報

5#
ID:390416 發(fā)表于 2022-5-13 12:34 | 只看該作者
這代碼 太繁瑣了。20多行就可以搞定的事情
回復

使用道具 舉報

6#
ID:230742 發(fā)表于 2022-5-13 13:08 | 只看該作者
糾結(jié)延時干嘛。用什么單片機就用什么定時器計算方法。糾結(jié)半天,計算只需要2秒。
回復

使用道具 舉報

7#
ID:795404 發(fā)表于 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
回復

使用道具 舉報

8#
ID:123289 發(fā)表于 2022-5-13 17:37 | 只看該作者
第一個問題,自己走單步調(diào)試,就會發(fā)現(xiàn)問題之所在了。
第二個問題,查手冊,重是看CPU時鐘部分:CLK_DIV……
回復

使用道具 舉報

9#
ID:879924 發(fā)表于 2022-5-14 18:04 | 只看該作者
人人學會單片機 發(fā)表于 2022-5-13 12:34
這代碼 太繁瑣了。20多行就可以搞定的事情

牛皮!!!!!!!!!!!!!!!!
回復

使用道具 舉報

10#
ID:1026496 發(fā)表于 2022-5-14 21:50 | 只看該作者
static unsigned int T0_Count=0; 這個建議加個volatile   static volatile unsigned int T0_Count=0;代碼層次很混亂,建議少用全局變量,可以使用靜態(tài)局部然后在需要跨文件使用的時候使用函數(shù)調(diào)用的方式
回復

使用道具 舉報

11#
ID:1026496 發(fā)表于 2022-5-14 21:51 | 只看該作者
P3=0xFF; 這個全部改成P1 = 0XFF;
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精彩视频 | 成人视屏在线观看 | 日产久久 | 日韩毛片播放 | 欧美一区二区 | 成人免费高清 | 亚洲日韩中文字幕一区 | 欧美三区在线观看 | 欧美乱码精品一区二区三区 | 午夜色播| 国产精品一区在线观看 | 亚洲精品久久视频 | 欧美一区二区三区免费在线观看 | 免费看国产a | 性高湖久久久久久久久 | 国产精品国产精品国产专区不卡 | 久久草在线视频 | 毛片网站在线观看 | 91久久久久久久久久久 | 91视频免费在观看 | 久久精品国产久精国产 | 久久国产精品免费一区二区三区 | 欧美成人一区二区三区片免费 | 亚洲图片一区二区三区 | 狠狠干天天干 | 亚洲激情网站 | 亚洲精品一区国产精品 | 二区不卡 | 黄 色 毛片免费 | 国产成人免费在线 | 日本不卡一区二区三区在线观看 | 久久精品免费看 | 最近日韩中文字幕 | 中文字幕av网站 | 激情五月综合 | 午夜免费观看 | 色婷婷一区二区三区四区 | 精品欧美黑人一区二区三区 | 99免费视频| www免费视频 | 国产免费人成xvideos视频 |