音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

大蝦們幫小弟分析一下這個鍵盤掃描程序,不勝感激

作者:bonny95 欄目:單片機
大蝦們幫小弟分析一下這個鍵盤掃描程序,不勝感激
各位大蝦:
   小弟以自己入門級的水平編了一個自制簡易計算器的程序,硬件由Proteus仿真,顯示部分已經(jīng)證明正確無誤,但鍵盤掃描部分卻不正常,不能讀入按鍵的值,還望各位多多指教!拜謝!

//頭文件:hmycal.h
#define ON 0
#define OFF 1
#define DTMIN 30     //最小延遲時間
#define DTMAX 30     //最大延遲時間
#define TURE 1
#define FALSE 0    
#define T 1
#define F 0
#define NUM 4        //最大操作數(shù)位數(shù)

//主程序
#include<reg51.h>
#include<string.h>
#include"HmyCal.h"

//數(shù)碼管共陰極接法,顯示列表:0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,H,P
unsigned CHAR dispTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x73};

//操作數(shù)
unsigned int oprt1,oprt2;
unsigned CHAR pos;

//加、減、乘、除、等于及開關(guān)標(biāo)志位
unsigned CHAR flagPlus;
unsigned CHAR flagSub;
unsigned CHAR flagMul;
unsigned CHAR flagDiv;
unsigned CHAR flagEqu;
unsigned CHAR flagPower;

//函數(shù)聲明
void delay(unsigned int n);            //延時子程序
void dispNum(unsigned int n);        //數(shù)字顯示子程序
void dispLetter(unsigned int n);    //字母顯示子程序
unsigned CHAR isKeyDown();            //檢測是否有鍵按下
unsigned CHAR getKey();                //返回鍵值
void decode(unsigned CHAR key);        //鍵值解碼
void clearFlag();                    //清除標(biāo)志位
unsigned CHAR testFlag();            //檢測標(biāo)志位
unsigned int op(unsigned int op1,unsigned int op2);        //計算結(jié)果
void init();                         //初始化
unsigned int pow(unsigned int base,unsigned int n);        //冪函數(shù)

void main()
{
    unsigned int TEMP;
    TEMP=0;
    init();
    while(1)
    {
        if(isKeyDown())
        {
            decode(getKey());

            if(flagPower)
            {
                if(!testFlag())    TEMP=oprt1;
                else TEMP=oprt2;
                if(flagEqu)
                {
                    TEMP=op(oprt1,oprt2);
                    oprt1=0;
                    oprt2=0;
                }
            }
            else
            {
                init();
                dispLetter(0);
            }
        }
        dispNum(TEMP);
    }
}

//延時子程序
void delay(unsigned int n)
{
    unsigned CHAR i;
    for(;n>0;n--)
        for(i=100;i>0;i--);
}

//數(shù)字顯示子程序
void dispNum(unsigned int n)
{
    unsigned CHAR i,j,seg,TEMP;
    unsigned int m;
    for(j=0;j<DTMAX;j++)
    {
        m=n;        
        for(i=4,seg=0xEF;i>0;i--)
        {
            TEMP=m%10;
            m/=10;                     
            P2=seg;
            P0=dispTab[TEMP];
            delay(DTMIN);
            seg<<=1;         
        }
    }
}

//字母顯示子程序
void dispLetter(unsigned int n)
{
    unsigned CHAR i,j,seg;
    for(j=0;j<DTMAX;j++)
        for(i=4,seg=0xEF;i>0;i--)
        {                 
            P2=seg;
            P0=dispTab[n];
            delay(DTMIN);
            seg<<=1;         
        }
}

//檢測是否有鍵按下
unsigned CHAR isKeyDown()
{
    unsigned CHAR TEMP;
    P1=0xF0;
    TEMP=P1;
    if(TEMP!=0xF0)return(TURE);
    else return(FALSE);
}

//返回鍵值
unsigned CHAR getKey()
{
    unsigned CHAR i,TEMP,nowc,nowr,pre;
    for(i=4,TEMP=0x10;i>0;i--)              //列掃描
    {
        pre=TEMP;
        P1=TEMP;
        nowc=P1;
        if(nowc==pre)
          &nbs
2樓: >>參與討論
bonny95
是我的硬件電路鍵盤部分有問題?還是軟件有錯誤?
是我的硬件電路鍵盤部分有問題?還是軟件有錯誤?

3樓: >>參與討論
bonny95
好心人幫忙啊
拜托各位了!
我實在看不出哪里有問題

4樓: >>參與討論
沈老
請把行掃套在列掃內(nèi)
即:
for 每列
    輸出F0
      for 每行
         讀入X0
      next
next

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
如何用51快速實現(xiàn)下面計算
華虹芯片SHC1704不知是好是壞。支持國產(chǎn)芯片的各位幫幫助吧
千萬別用sprintf
運放能放大1000倍嗎?可不可靠?
定時器做1秒延遲成功了,可是數(shù)碼管顯示不一樣
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號