最近在做一些小东西,一个通过矩阵键盘实现直接输入数据进行调整时间的电子时钟,要求用51完成,现在卡在的地方是矩阵键盘可以输入但是只可以修改第一位,后面的数字都不能修改。下面附上代码以及仿真图。
#include<reg52.h>
#include<stdlib.h>
#include<stdio.h>
#include<intrins.h>
#define KEY_PORT P1
#define time_str P0
#define weixuansmg P2
sbit stop=P3^0;
sbit exit=P3^3;
sbit move_bit=P3^4;
typedef unsigned char uchar;
typedef unsigned int uint;
// uchar code num[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 0~9
uchar chars[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar code weixuan[8]={0x80,0x40,~0x20,~0x10,~0x08,~0x04,~0x02,~0x01};
uchar time[8]={1,2,10,5,9,10,5,0};
uchar model_choice=0,mdl=0;
uchar time_key=0,time_key1=0;
uchar change_time=0;
uchar input_bit0=0,input_bit1=0,input_bit2=0,input_bit3=0,input_bit4=0,input_bit5=0,input_bit6=0,input_bit7=0;
uchar last_input_bit=0;
uchar kp=0;
uint counter = 0;
sbit change = P3^0;
sbit naozhong = P3^1;
void delay(uint x){
uchar i=0;
while(--x!=0)
{
for(i=0;i<125;i++);
}
}
uchar KeyScan(void)
{
uchar val = 0;
KEY_PORT = 0x0f;
if(KEY_PORT!=0x0f){
delay(10);
if(KEY_PORT != 0x0f)
{
switch(KEY_PORT)
{
case 0x07:val = 1;break;
case 0x0b:val = 2;break;
case 0x0d:val = 3;break;
case 0x0e:val = 4;break;
default: break;
}
KEY_PORT = 0xf0;
switch(KEY_PORT)
{
case 0x70:val = val+0;break;
case 0xb0:val = val+4 ;break;
case 0xd0:val = val+8;break;
case 0xe0:val = val+12;break;
default:break;
}
return val;
}
}
}
void display()
{
uchar tick=0x01;
uchar index;
for(index=0;index<=7;index++)
{
weixuansmg = ~tick;
time_str = chars[time[index]];
tick = tick<<1;
delay(2);
}
}
void ALL_zero()
{
time[0]=0;
delay(50);
time[1]=0;
delay(50);
time[3]=0;
delay(50);
time[4]=0;
delay(50);
time[6]=0;
delay(50);
time[7]=0;
delay(50);
}
void S_zero()
{
time[6]=0;
time[7]=0;
}
void M_zero()
{
time[3]=0;
time[4]=0;
}
void H_zero()
{
time[0]=0;
time[1]=0;
}
void change_all()
{
uchar tick=0x01;
uint times=0;
uchar c_key=0,c_key1=0;
c_key=KeyScan();
if (c_key!=0)
{
c_key1=c_key;
while (c_key!=0)
{
time[times]=c_key1;
times++;
}
}
}
void stop_time()
{
if(stop==0)
{
delay(10);
if(stop==0)
{
TR0=0;
}
}
}
void out(){
TMOD = 0x01;
TH0 = 15536/256;
TL0 = 15536%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
out();
while (1)
{
display();
stop_time();
model_choice=KeyScan();
if (model_choice!=0)
{
switch (model_choice)
{
case 13:ALL_zero();
mdl=1;
break;
case 14:S_zero();
mdl=2;
break;
case 15:M_zero();
mdl=3;
break;
case 16:H_zero();
mdl=4;
break;
default:
break;
}
}
switch (mdl)
{
case 1:
input_bit0=KeyScan();
if (input_bit0!=0&kp==0)
{
time[change_time]=input_bit0;
change_time++;
input_bit0=0;
kp==1;
if (change_time==2)
{
time[change_time]=10;
change_time++;
}
if (change_time==5)
{
time[change_time]=10;
change_time++;
}
if (change_time==8)
{
change_time=0;
}
}
break;
default:
break;
}
}
}
void timer0_Init() interrupt 1
{
counter++;
if(counter == 20)
{
time[7]++;
if (time[7]>9)
{
time[7]=0;
time[6]++;
if (time[6]>5)
{
time[7]=0;
time[6]=0;
time[4]++;
if (time[4]>9)
{
time[7]=0;
time[6]=0;
time[4]=0;
time[3]++;
if (time[3]>5)
{
time[7]=0;
time[6]=0;
time[4]=0;
time[3]=0;
time[1]++;
if (time[1]>9)
{
time[7]=0;
time[6]=0;
time[4]=0;
time[3]=0;
time[1]=0;
time[0]++;
}
if (time[0]>1)
{
if (time[1]>3)
{
time[7]=0;
time[6]=0;
time[4]=0;
time[3]=0;
time[1]=0;
time[0]=0;
}
}
}
}
}
}
counter=0;
}
}