登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 按键5(加法计算器)

[复制链接]
发表于 2022-1-12 16:54:34 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 按键
开始时间: 2022-01-12
结束时间: 2022-01-12
本帖最后由 房一鹏 于 2022-1-22 09:12 编辑

经实践证明此程序可用,可以实现加法计算,但每一个数码管都有波动,且其亮度不高,凑合着用吧。

数码管亮度不高的原因:在每一次对按键状态进行检测是重新赋值了P20、P21、P22的值,令其为1、1、1,根据原理图,此时数码管和led小灯都不会亮,导致了单个数码管亮的时间只有数码管刷新程序运行的那一瞬间(时间非常短),而不是1毫秒内一直亮,所以数码管亮度不高。
(这只是我的个人见解,若有其余见解可以回复)

另外可以对程序进行修改,提高数码管的亮度,只需在中断的按键状态检测程序后对P20,P21,P22重新赋值,便可让数码管亮度变得很亮。之后我会再发一遍程序。
注:在此程序中有很多的地方【i】都没有显示,复制粘贴后要加上[i ]注意!!!!!!!

#include<reg52.h>

sbit ENLED=P1^1;

sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit kout1=P2^4;
sbit kout2=P2^5;
sbit kout3=P2^6;
sbit kout4=P2^7;

unsigned char ledchar[]={
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};
unsigned char keysta[4][4]={
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
unsigned char ledbuff[6]={
        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char keycodeMap[4][4]={
  {0x31,0x32,0x33,0x26},             //êy×&#214;&#188;ü1£&#187;êy×&#214;&#188;ü2£&#187;êy×&#214;&#188;ü3£&#187;&#207;òé&#207; &#188;ó
        {0x34,0x35,0x36,0x25},             //êy×&#214;&#188;ü4£&#187;êy×&#214;&#188;ü5£&#187;êy×&#214;&#188;ü6£&#187;&#207;ò×ó &#188;&#245;
        {0x37,0x38,0x39,0x28},             //êy×&#214;&#188;ü7£&#187;êy×&#214;&#188;ü8£&#187;êy×&#214;&#188;ü9£&#187;&#207;ò&#207;&#194; 3&#203;
        {0x30,0x1B,0x0D,0x27}              //êy×&#214;&#188;ü0£&#187;ESC&#188;ü£&#187;&#187;&#216;3μ&#188;ü£&#187;   &#207;òóò 3y
};

void keydrive();
void keyaction(unsigned char keycode);
void shownumber(unsigned long num);

void main ()
{
        
        ENLED=0;
  EA=1;
  TMOD=0x01;
  TH0=0xFE;
  TL0=0xEF;
  TR0=1;               //′ò&#191;a&#182;¨ê±&#198;÷
  ET0=1;               //′ò&#191;a&#214;D&#182;&#207;
        ledbuff[0]=ledchar[0];
        
        while(1)
        {
                keydrive();
        }
}
void shownumber(unsigned long num)
{
        unsigned char buf[6];
        signed int i;
        for(i=0;i<6;i++)
        {
                buf=num%10;
                num=num/10;
        }
        for(i=5;i>=1;i--)
        {
                if(buf==0)
                {
                        ledbuff=0xFF;
                }
                else
                        break;
        }
        for(;i>=0;i--)
        {
                ledbuff=ledchar[buf];
        }
}

void keyaction(unsigned char keycode)
{
        static unsigned long result=0;
        static unsigned long addend=0;
        
        if((keycode>=0x30)&&(keycode<=0x39))
        {
                addend=(addend*10)+(keycode-0x30);
                shownumber(addend);
        }
        else if(keycode==0x26)
        {
                result+=addend;
                addend=0;
                shownumber(result);
        }
        else if(keycode==0x0D)
        {
                result+=addend;
                addend=0;
                shownumber(result);
        }
        else if(keycode==0x1B)
        {
                addend=0;
                result=0;
                shownumber(result);
        }
}

void keydrive()
{
        unsigned int i,j;                           //iê&#199;DD£&#172;jê&#199;áD
        static unsigned char backup[4][4]={               
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}     
  };
        
        for(i=0;i<4;i++)
                {
                        for(j=0;j<4;j++)
                        {
                                if(keysta[j]!=backup[j])
                                {
                                        if(backup[j]==0)
                                        {
                                                keyaction(keycodeMap[j]);
                                        }
                                        backup[j]=keysta[j];
                                }
                        }
                }
}

void ledscan()
{
        static unsigned int i=0;
        P0=0xFF;
        if(i==0)
        {P20=121=022=1;i++0=ledbuff[0];}
        else if(i==1)
        {P20=021=022=1;i++0=ledbuff[1];}
        else if(i==2)
        {P20=121=122=0;i++0=ledbuff[2];}
        else if(i==3)
        {P20=021=1;P22=0;i++;P0=ledbuff[3];}
        else if(i==4)
        {P20=1;P21=0;P22=0;i++;P0=ledbuff[4];}
        else if(i==5)
        {P20=0;P21=0;P22=0;i=0;P0=ledbuff[5];}
}

void keyscan()
{
        static unsigned char keyout=0;
        unsigned char i=0;
        static unsigned char keybuf[4][4]={
                0xFF,0xFF,0xFF,0xFF,
          0xFF,0xFF,0xFF,0xFF,
          0xFF,0xFF,0xFF,0xFF,
          0xFF,0xFF,0xFF,0xFF
        };
        P20=1;P21=1;P22=1;P23=1;
        
        keybuf[keyout][0]=(keybuf[keyout][0]<<1)|P20;
        keybuf[keyout][1]=(keybuf[keyout][1]<<1)|P21;
        keybuf[keyout][2]=(keybuf[keyout][2]<<1)|P22;
        keybuf[keyout][3]=(keybuf[keyout][3]<<1)|P23;
        
        for(i=0;i<4;i++)
        {
                if((keybuf[keyout]&0x0F)==0x00)
                {
                        keysta[keyout]=0;
                }
                else if((keybuf[keyout]&0x0F)==0x0F)
                {
                        keysta[keyout]=1;
                }
                else{}
        }
        
        keyout++;
        if(keyout>=4)
        {
                keyout=0;
        }
//        keyout=keyout&0x03;
        switch(keyout)
        {
                case 0:kout1=1;kout2=1;kout3=1;kout4=0;break;
                case 1:kout1=1;kout2=1;kout3=0;kout4=1;break;
                case 2:kout1=1;kout2=0;kout3=1;kout4=1;break;
                case 3:kout1=0;kout2=1;kout3=1;kout4=1;break;
    default :break;
        }
        //P20=0;P21=0;P22=0;  
}

void interruptTime() interrupt 1
{
        TH0=0xFE;
  TL0=0xEF;
        ledscan();
        keyscan();
}




好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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