学习笔记
学习科目: |
单片机 |
学习安排: |
按键进阶 |
开始时间: |
2022-01-11 |
结束时间: |
2022-01-11 |
本帖最后由 房一鹏 于 2022-1-23 18:39 编辑
按下k1数码管显示0;按下k2数码管显示1;以此类推显示0,1,2,3,4,5,6,7,8,9,A , B , C , D , E , F
(注:此程序在让数码管1显示的同时其余数码管也会有波动,是程序问题。但总归是写出来了)
程序中有错误的地方,我编辑改了之后保存又变回了原来的样子,我把注释留在了后面,注意!!!
#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[j]!=backup[j]) //这里是keysta [i ] [j]和backup [i ] [j],下面都是,每次保存后[i ]都不显示
{
if(backup[j]==0)
{
P0=ledchar[i*4+j];
}
backup[j]=keysta[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]&0x0F)==0x00) // 这里是keybuf[keyout][i ],每次保存后[i ]都不显示
{
keysta[keyout]=0; //这里是keysta[keyout][i ],每次保存后[i ]都不显示
}
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=021=022=0;
}
|
|