登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 模拟C4与分时复用(电开版本)

[复制链接]
发表于 2022-1-29 23:28:09 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 按时学习
开始时间: 2022-01-27
结束时间: 2022-01-27
这个玩意真是当时难的要死的玩意,首先,我们必要要学会分时运用,绕不开了,必须搞会它!代码如下,翻译如图,其实就是分开扫描
#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}
};

void main ()
{
        unsigned int i,j;                           
        unsigned char backup[4][4]={               
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}     
  };
        ENLED=0;
  EA=1;
  TMOD=0x01;
  TH0=0xEA;
  TL0=0xAB;
  TR0=1;               
  ET0=1;            
        P20=1;
        P21=1;
        P22=1;
        P23=1;
        while(1)
        {
                P20=021=022=0;         
                for(i=0;i<4;i++)
                {
                        for(j=0;j<4;j++)
                        {
                                if(keysta[i][j]!=backup[i][j])
                                {
                                        if(backup[i][j]==0)
                                        {
                                                P0=ledchar[i*4+j];
                                        }
                                        backup[i][j]=keysta[i][j];
                                }
                        }
                }
        }
}

void interruptTime() interrupt 1
{
        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=121=122=1;
       
       
        TH0=0xEA;
        TL0=0xAB;
       
        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][i]&0x0F)==0x00)
                {
                        keysta[keyout][i]=0;
                }
                else if((keybuf[keyout][i]&0x0F)==0x0F)
                {
                        keysta[keyout][i]=1;
                }
                else{}
        }
       
        keyout++;
        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;
        }
}


上面的代码必须搞清楚,然后才是模拟C4
这个建议把子程序分开,写在纸上,用铅笔涂涂画画
#include<reg52.h>
sbit BUZZ=P1^3;
sbit ENLED=P1^1;
sbit KEY_IN_1=P2^0;
sbit KEY_IN_2=P2^1;
sbit KEY_IN_3=P2^2;
sbit KEY_IN_4=P2^3;
sbit KEY_OUT_1=P2^4;
sbit KEY_OUT_2=P2^5;
sbit KEY_OUT_3=P2^6;
sbit KEY_OUT_4=P2^7;
unsigned char code LedChar[] = {
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
unsigned char code KeyCodeMap[4][4]={
{0x31,0x32,0x33,0x26},
{0x34,0x35,0x36,0x25},
{0x37,0x38,0x39,0x28},
{0x30,0x1B,0x0D,0x27}
};
unsigned char LedBuff[7]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char KeySta[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
unsigned long pdata KeyDownTime[4][4]={
{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}
};
bit enBUZZ=0;
bit flagls=0;
bit flagStart=0;
unsigned char T0RH=0;
unsigned char T0RL=0;
unsigned int CountDown=0;
void ConfigTimer0(unsigned int ms);
void ShowNumber(unsigned long num);
void KeyDriver();
void main()
{
EA=1;
ENLED=0;
ConfigTimer0(1);
ShowNumber(0);
while(1)
{
KeyDriver();
if(flagStart&&flagls)
{
flagls=0;
if(CountDown>0)
{
CountDown--;
ShowNumber(CountDown);
if(CountDown==0)
{
enBUZZ=1;
LedBuff[6]=0x00;
}
}
}
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp=32768000/12;
tmp=(tmp*ms)/1000;
tmp=65536-tmp;
tmp=tmp+28;
T0RH=(unsigned char)(tmp>>8);
T0RL=(unsigned char)tmp;
TMOD&=0xF0;
TMOD|=0x01;
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
}
void ShowNumber(unsigned long num)
{
signed char i;
unsigned char buf[6];
for(i=0;i<6;i++)
{
buf[i]=num%10;
num=num/10;
}
for(i=5;i>=1;i--)
{
if(buf[i]==0)
LedBuff[i]=0xFF;
else
break;
}
for(;i>=0;i--)
{
LedBuff[i]=LedChar[buf[i]];
}
}
void KeyAction(unsigned char keycode)
{
if(keycode==0x26)
{
if(CountDown<9999)
{
CountDown++;
ShowNumber(CountDown);
}
}
else if (keycode==0x28)
{
if(CountDown>1)
{
CountDown--;
ShowNumber(CountDown);
}
}
else if(keycode==0x0D)
{
flagStart=1;
}
else if(keycode==0x1B)
{
enBUZZ=0;
LedBuff[6]=0xFF;
flagStart=0;
CountDown=0;
ShowNumber(CountDown);
}
}
void KeyDriver()
{
unsigned char i,j;
static unsigned char pdata backup[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
static unsigned long pdata TimeThr[4][4]={
{1000,1000,1000,1000},{1000,1000,1000,1000},{1000,1000,1000,1000},{1000,1000,1000,1000}
};
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(backup[i][j]!=KeySta[i][j])
{
if(backup[i][j]!=0)
{
KeyAction(KeyCodeMap[i][j]);
}
backup[i][j]=KeySta[i][j];
}
if(KeyDownTime[i][j]>0)
{
if(KeyDownTime[i][j]>=TimeThr[i][j])
{
KeyAction(KeyCodeMap[i][j]);
TimeThr[i][j]+=200;
}
}
else
{
TimeThr[i][j]=1000;
}
}
}
}
void KeyScan()
{
static unsigned char a=0;
unsigned char i;
static unsigned char keyout=0;
static unsigned char keybuf[4][4]={
{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
};
KEY_IN_1=1;
KEY_IN_2=1;//注释
KEY_IN_3=1;
KEY_IN_4=1;
keybuf[keyout][0]=(keybuf[keyout][0]<<1)|KEY_IN_1;
keybuf[keyout][1]=(keybuf[keyout][1]<<1)|KEY_IN_2;
keybuf[keyout][2]=(keybuf[keyout][2]<<1)|KEY_IN_3;
keybuf[keyout][3]=(keybuf[keyout][3]<<1)|KEY_IN_4;
for(i=0;i<4;i++)
{
if((keybuf[keyout][i]&0x0F)==0x00)
{
KeySta[keyout][i]=0;
KeyDownTime[keyout][i]+=4;
}
else if((keybuf[keyout][i]&0x0F)==0x0F)
{
KeySta[keyout][i]=1;
KeyDownTime[keyout][i]=0;
}
}
keyout++;
keyout&=0x03;
switch(keyout)
{
case 0:KEY_OUT_1=1;KEY_OUT_4=0;break;
case 1:KEY_OUT_4=1;KEY_OUT_3=0;break;
case 2:KEY_OUT_2=0;KEY_OUT_3=1;break;
case 3:KEY_OUT_1=0;KEY_OUT_2=1;break;
default:break;
}
P0=0xFF;
if(a==0)
{KEY_IN_1=1;KEY_IN_2=0;KEY_IN_3=1;a++0=LedBuff[0];}
else if(a==1)
        {KEY_IN_1=0;KEY_IN_2=0;KEY_IN_3=1;a++0=LedBuff[1];}
        else if(a==2)
        {KEY_IN_1=1;KEY_IN_2=1;KEY_IN_3=0;a++0=LedBuff[2];}
        else if(a==3)
        {KEY_IN_1=0;KEY_IN_2=1;KEY_IN_3=0;a++0=LedBuff[3];}
        else if(a==4)
        {KEY_IN_1=1;KEY_IN_2=0;KEY_IN_3=0;a++0=LedBuff[4];}
        else if(a==5)
        {KEY_IN_1=0;KEY_IN_2=0;KEY_IN_3=0;a++0=LedBuff[5];}
        else if(a==6)
        {KEY_IN_1=0;KEY_IN_2=1;KEY_IN_3=1;a=0;P0=LedBuff[6];}
}
void LedScan()
{
static unsigned char i=0;
P0=0xFF;
if(i==0)
{KEY_IN_1=1;KEY_IN_2=0;KEY_IN_3=1;i++;P0=LedBuff[0];}
        else if(i==1)
        {KEY_IN_1=0;KEY_IN_2=0;KEY_IN_3=1;i++;P0=LedBuff[1];}
        else if(i==2)
        {KEY_IN_1=1;KEY_IN_2=1;KEY_IN_3=0;i++;P0=LedBuff[2];}
        else if(i==3)
        {KEY_IN_1=0;KEY_IN_2=1;KEY_IN_3=0;i++;P0=LedBuff[3];}
        else if(i==4)
        {KEY_IN_1=1;KEY_IN_2=0;KEY_IN_3=0;i++;P0=LedBuff[4];}
        else if(i==5)
        {KEY_IN_1=0;KEY_IN_2=0;KEY_IN_3=0;i++;P0=LedBuff[5];}
        else if(i==6)
        {KEY_IN_1=0;KEY_IN_2=1;KEY_IN_3=1;i=0;P0=LedBuff[6];}
}
void InterruptTimer0() interrupt 1
{
static unsigned int tmrls=0;
TH0=T0RH;
TL0=T0RL;
if(enBUZZ)
BUZZ=~BUZZ;
else
BUZZ=1;
LedScan();
KeyScan();
if(flagStart)
{
tmrls++;
if(tmrls>=1000)
{
tmrls=0;
flagls=1;
}
}
else
{
tmrls=0;
}
}


分时复用

分时复用

分时复用

分时复用

分时复用

分时复用

分时复用

分时复用
1643469903106.jpg
1643469922101.jpg
1643469930082.jpg
1643469937229.jpg
1643469943609.jpg
1643469950033.jpg
1643469956468.jpg
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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