[mw_shl_code=c,true] int main(void)
{
u8 data[8], i,key;
KEY_Init();
Init_74HC595();
delay_init();
while(1)
{
key=KEY_Scan(1);
KEY_Handle(key);
Display(USART_RX_BUF);
}
}
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;
if(mode)key_up=1;
if(key_up&&(KEY1_FUNC==0||KEY2_UP==0||KEY3_DOWN==0))
{
delay_ms(2);
key_up=0;
if(KEY1_FUNC==0)return FUNC_PRES;
else if(KEY2_UP==0)return UP_PRES;
else if(KEY3_DOWN==0)return DOWN_PRES;
}
else if(KEY1_FUNC==1&&KEY2_UP==1&&KEY3_DOWN==1)key_up=1;
return 0;
}
u8 KEY_Count=0;
void KEY_Handle(u8 key)
{
int bai=0,shi=0,ge=0;
if(USART_RX_BUF[0]==0 || USART_RX_BUF[1]==0 || USART_RX_BUF[2]==0 || USART_RX_BUF[4]==0)
{
USART_RX_BUF[0]=0xFF;
USART_RX_BUF[1]=0x01;
USART_RX_BUF[2]=0x01;
USART_RX_BUF[4]=0xFE;
}
if(key == FUNC_PRES) //按下功能键
{
USART_RX_BUF[2]++;
if(USART_RX_BUF[2] > 4)
{
USART_RX_BUF[2]=1;
}
// USART_RX_BUF[3]=0;
}
if(key == UP_PRES)
{
bai=USART_RX_BUF[3]/100;
shi=USART_RX_BUF[3]%100/10;
ge=USART_RX_BUF[3]%10+1;
if(ge>9)
{
ge=0;
shi=shi+1;
if(shi>9)
{
shi=0;
bai=bai+1;
}
}
if(bai==2&&shi==5&&ge==5)
{
ge=5;
shi=5;
bai=2;
}
USART_RX_BUF[3]=bai*100+shi*10+ge;
}
if(key == DOWN_PRES)
{
bai=USART_RX_BUF[3]/100;
shi=USART_RX_BUF[3]%100/10;
ge=USART_RX_BUF[3]%10-1;
if(ge<0)
{
ge=9;
shi=shi-1;
if(shi<0)
{
shi=9;
bai=bai-1;
if(bai<0)
{
ge=0;
shi=0;
bai=0;
}
}
}
USART_RX_BUF[3]=bai*100+shi*10+ge;
}
}
void HC595_write_byte(u8 byte)
{
u8 i, temp;
temp = byte;
for (i=0; i<8; i++)
{
SCLK=0;
if ((temp&0x80)==0x80)
DIO=1;
else
DIO=0;
delay_us(1);
SCLK=1;
temp = temp<<1;
delay_us(1);
}
}
void write_byte(u16 byte)
{
u16 i, temp;
temp = byte;
for (i=0; i<16; i++)
{
SCLK=0;
if ((temp&0x8000)==0x8000)
DIO=1;
else
DIO=0;
delay_us(1);
SCLK=1;
temp = temp<<1;
delay_us(1);
}
}
void HC595_Latch(void)
{
RCLK=0;
delay_us(1);
RCLK=1;
delay_us(1);
RCLK=0;
}
void HC595_display(u8 data[])
{
HC595_write_byte(seg_table_p[data[3]]); //送数据
HC595_write_byte(0x01); //第一个数码管亮
HC595_Latch();
delay_us(50);
HC595_write_byte(seg_table_p[data[2]]);
HC595_write_byte(0x02); //第二个数码管亮
HC595_Latch();
delay_us(50);
HC595_write_byte(seg_table_p[data[1]]);
HC595_write_byte(0x04); //第三个数码管亮
HC595_Latch();
delay_us(50);
HC595_write_byte(seg_table_p[data[0]]);
HC595_write_byte(0x08); //第四个数码管亮
HC595_Latch();
delay_us(50);
}
/*
数码管选择显示
参数:select数码管选择1,2,3,4
data发送的数据
*/
void shumaguan_Select(u8 select,u8 data)
{
HC595_write_byte(seg_table_p[data]);
HC595_write_byte(select);
HC595_Latch();
delay_ms(250);
}
void shumaguan(u8 duan,u8 wei)
{
u16 temp;
temp=(seg_table_p[wei]<<8)|duan;
write_byte(temp);
HC595_Latch();
}
void Display(u8 data[])
{
shumaguan(0x01,data[3]%10);
shumaguan(0x02,data[3]%100/10);
shumaguan(0x04,data[3]/100);
shumaguan(0x08,data[2]);
}
[/mw_shl_code]
按键按下不松时,数码管只有一个比较亮,其他三个比较暗。
求各位大神指教。 |