- 打卡等级:偶尔看看I
- 打卡总天数:14
- 最近打卡:2025-04-29 15:31:16
已绑定手机
注册会员
- 积分
- 154
|
发表于 2025-4-15 14:43:56
|
显示全部楼层
#include "io.h"
u16 Key_Vol = 0; //按键按下持续时间
u8 SEG_NUM[] = { //数码管段码,数码管显示什么字符
0x3F, /*'0', 0*/
0x06, /*'1', 1*/
0x5B, /*'2', 2*/
0x4F, /*'3', 3*/
0x66, /*'4', 4*/
0x6D, /*'5', 5*/
0x7D, /*'6', 6*/
0x07, /*'7', 7*/
0x7F, /*'8', 8*/
0x6F, /*'9', 9*/
0x77, /*'A', 10*/
0x7C, /*'B', 11*/
0x39, /*'C', 12*/
0x5E, /*'D', 13*/
0x79, /*'E', 14*/
0x71, /*'F', 15*/
0x40, /*'-', 16*/
0x00, /*' ', 17*/
0x80, /*'.', 18*/
};
u8 SEG_ID[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; //数码管位码,哪些数码管会显示字符
void LED0_Blink(void) //点亮LED1
{
P00 = !P00;
}
void LED1_Blink(void) //点亮LED2
{
P01 = !P01;
}
void LED2_Blink(void) //点亮LED3
{
P02 = !P02;
}
void KEY_Task(void) //判断按键次数
{
if(P32 == 0){
Key_Vol++;
if(Key_Vol == 5){
//按键按下后的任务
}
}
else{
Key_Vol = 0;
}
}
// 默认上电后595全部是高电平,初始化为低电平
void Init_595(void)
{
HC595_SER = 0;
HC595_RCK = 0;
HC595_SCK = 0;
}
//发送数据
void Send_595(u8 dat)
{
u8 i;
for(i = 0; i < 8; i++)
{
u8 yichu = 0;
yichu = dat >> 7; // 这两行是为了验证CY就是dat左移1位后溢出的高位值
dat <<= 1; //高位丢弃的位给CY
// HC595_SER = CY; //先把数据写到引脚上
HC595_SER = yichu;
HC595_SCK = 1; //输出上升沿的时钟信号
HC595_SCK = 0; //清零,方便下次给上升沿信号
}
}
//输出显示
void Display_Seg(u8 hc595_1, u8 hc595_2)
{
//数据显示先后顺序
Send_595(hc595_1); //段码 高电平点亮
Send_595(hc595_2); //位码 低电平点亮
HC595_RCK = 1; //数据所存输出
HC595_RCK = 0;
}
u8 hour = 0;
u8 minute = 0;
u8 second = 0;
u8 seg_idx = 0;
void Seg_task(void)
{
u8 num = 0;
if(seg_idx == 0){
num = hour / 10;
Display_Seg(SEG_NUM[num], ~SEG_ID[0]);
}
else if(seg_idx == 1){
num = hour % 10;
Display_Seg(SEG_NUM[num], ~SEG_ID[1]);
}
else if(seg_idx == 2){ //显示连接符"-"
Display_Seg(SEG_NUM[16], ~SEG_ID[2]);
}
else if(seg_idx == 3){
num = minute / 10;
Display_Seg(SEG_NUM[num], ~SEG_ID[3]);
}
else if(seg_idx == 4){
num = minute % 10;
Display_Seg(SEG_NUM[num], ~SEG_ID[4]);
}
else if(seg_idx == 5){ //显示连接符"-"
Display_Seg(SEG_NUM[16], ~SEG_ID[5]);
}
else if(seg_idx == 6){
num = second / 10;
Display_Seg(SEG_NUM[num], ~SEG_ID[6]);
}
else if(seg_idx == 7){
num = second % 10;
Display_Seg(SEG_NUM[num], ~SEG_ID[7]);
}
seg_idx++;
if(seg_idx > 7){
seg_idx = 0;
}
}
void TimeCount_task(void){
second++;
if(second > 59){
minute++;
second = 0;
}
else if(minute > 59){
hour++;
minute = 0;
}
else if(hour > 23){
hour = 0;
}
}
数码管显示“00-00-00”分别代表时分秒 ,每过1秒钟秒+1主代码逻辑 |
|