找回密码
 立即注册
楼主: fei2568

8051U实验箱学习记录 | 学习打卡典范

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-24 12:50:08 | 显示全部楼层

下面代码是数码管时钟的代码,断断续续学习了好几天

MAIN.C
#include "config.h"
#include "task.h"
#include "io.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
	Sys_init();
	usb_init();                                     //USB CDC 接口配置
	Timer0_Init();									//定时器初始化
	IE2|=0x80;										//使能USB中断
	Init_595();								//595端口的初始化
	EA = 1;											//开总中断吗?
	while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
	P40=0;

	while (1)
	{
		if (bUsbOutReady)							//如果接收到了数据
		{
			//USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

			usb_OUT_done();
		}
		//下面写代码
		Task_Pro_Handler_Callback();
	}
}

void Timer0_Isr(void) interrupt 1				//1m秒中断执行一次
{
	Task_Marks_Handler_Callback();
}
CONFIG.C
#include "config.h"

void Sys_init(void)
{
    WTST = 0;  										//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; 										//扩展寄存器(XFR)访问使能
    CKCON = 0; 										//提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;  					//设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;  					//设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;  					//设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;  					//设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;  					//设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;  					//设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;  					//设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;  					//设置为准双向口 
}

void Timer0_Init(void)		//1毫秒@24.000MHz
{
	TM0PS = 0x00;			//设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
	AUXR &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x30;				//设置定时初始值
	TH0 = 0xF8;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
}
////////TASK.C
#include "task.h"
#include "io.h"

static TASK_COMPONENTS Task_Comps[]=
{
//状态  计数  周期  函数
//    {0, 1,   1,   Sample_Display},      /* task 1 Period: 1ms */
//    {0, 10,  10,  Sample_MatrixKey},    /* task 2 Period: 10ms */
//    {0, 10,  10,  Sample_adcKey},       /* task 3 Period: 10ms */
//    {0, 300, 300, Sample_NTC},          /* task 4 Period: 300ms */
//    {0, 500, 500, Sample_RTC},          /* task 5 Period: 500ms */
//    /* Add new task here */
//	{0,300,300,LED0_Blink},
//	{0,600,600,LED1_Blink},
//	{0,2000,2000,LED2_Blink},
	{0,10,10,Key_Task},
	{0,1,1,Seg_Task},
	{0,1000,1000,run},
};

u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps[0]);

//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)												//循环好几次,几个任务几个循环
    {
        if(Task_Comps[i].TIMCount)      /* If the time is not 0 */			//如果计数不为0
        {
            Task_Comps[i].TIMCount--;   /* Time counter decrement */		//计数减减
            if(Task_Comps[i].TIMCount == 0) /* If time arrives */			//如果计数减到0
            {
                /*Resume the timer value and try again */
                Task_Comps[i].TIMCount = Task_Comps[i].TRITime;  			//重装计数
                Task_Comps[i].Run = 1;      /* The task can be run */		//将run置为1
            }
        }
    }
}

//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)												//循环好几次,几个任务几个循环
    {
        if(Task_Comps[i].Run) /* If task can be run */						//如果哪个任务的run参数为1
        {
            Task_Comps[i].Run = 0;      /* Flag clear 0 */					//那么就将rin标志清0
            Task_Comps[i].TaskHook();   /* Run task */						//并且执行这个任务的任务
        }
    }
}

////////IO.C
#include "io.h"

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 wei[]=
{
	0xfe,		/*'0', 0*/
	0xfd,		/*'1', 1*/
	0xfb,		/*'2', 2*/
	0xf7,		/*'3', 3*/
	0xef,		/*'4', 4*/
	0xdf,		/*'5', 5*/
	0xbf,		/*'6', 6*/
	0x7f,		/*'7', 7*/
};

u8 State0=0;			//LED1的初始状态
u8 State1=0;			//LED2的初始状态
u8 State2=0;			//LED3的初始状态

u16 key_vol=0;

u8 shi=00;
u8 fen=00;
u8 miao=00;

void LED0_Blink(void)
{
	State0=!State0;
	P00=State0;
}

void LED1_Blink(void)
{
	State1=!State1;
	P01=State1;
}

void LED2_Blink(void)
{
	State2=!State2;
	P02=State2;
}

void Key_Task(void)
{
	if(P33==0)
	{
		key_vol++;
		if(key_vol==5)
		{
			//执行按键按下的代码
			printf("按键单击\r\n");
			shi=0;
			fen=0;
			miao=0;
		}
	}
	else
	{
		key_vol=0;
	}
}

u8 shishi[]=
{
	0x00,
	0x00,
	0x00,
	0x00,
	0x00,
	0x00,
	0x00,
	0x00,

};

void run(void)
{
	miao++;
	if(miao>=60)
	{
		miao=0;
		fen++;
		if(fen>=60)
		{
			shi++;
			if(shi>=24)
			{
				shi=0;
			}
		}
	}
	shishi[0]=shi/10;
	shishi[1]=shi%10;
	shishi[2]=16;
	shishi[3]=fen/10;
	shishi[4]=fen%10;
	shishi[5]=16;
	shishi[6]=miao/10;
	shishi[7]=miao%10;
}

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++)
	{
		dat<<=1;								//dat左移一位
		HC595_SER=CY;							//然后给到数据引脚
		HC595_SCK=1;							//输出上升沿的时钟信号
		HC595_SCK=0;							//请0以备下次输出
		//printf("%d\r\n",HC595_SER);
	}
}

void Display_Seg(u8 HC595_1,u8 HC595_2)
{
	Send_595(HC595_1);							//段码输出,高电平点亮
	Send_595(HC595_2);							//位码输出,低电平点亮
	HC595_RCK=1;
	HC595_RCK=0;
}

u8 i=0;
u8 num=0;
void Seg_Task(void)
{
	if(i==0)
	{
		num=shi/10;
	}
	else if(i==1)
	{
		num=shi%10;
	}
	else if(i==2)
	{
		num=18;
	}
	else if(i==3)
	{
		num=fen/10;
	}
	else if(i==4)
	{
		num=fen%10;
	}
	else if(i==5)
	{
		num=18;
	}
	else if(i==6)
	{
		num=miao/10;
	}
	else if(i==7)
	{ 
		num=miao%10;
	}
	Display_Seg(SEG_NUM[num],wei[i]);
	i++;
	if(i>=8)
	{
		i=0;
	}

}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-27 08:02:54 | 显示全部楼层

焊了2块擎天柱板子,第一块主控焊反了,尽然没烧,厉害,

第2块就是一次性点亮

下面是图片视频

微信图片_20241227075634.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2024-12-27 08:03:34 | 显示全部楼层

下面代码是擎天柱所有流水灯的

#include "io.h"


u16 key_vol=0;
u8 i=0;

void Key_Task(void)
{
	if(P33==0)
	{
		key_vol++;
		if(key_vol==5)
		{
			//执行按键按下的代码
			printf("按键单击\r\n");

		}
	}
	else
	{
		key_vol=0;
	}
}



void run(void)
{
	if(i==0)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P20=0;
	}
	if(i==1)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P21=0;
	}
	if(i==2)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P22=0;
	}
	if(i==3)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P23=0;
	}
	if(i==4)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P24=0;
	}
	if(i==5)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P25=0;
	}
	if(i==6)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P26=0;
	}
	if(i==7)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P27=0;
	}
	if(i==8)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P40=0;
	}
	if(i==9)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P45=0;
	}
	if(i==10)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P46=0;
	}
	if(i==11)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P07=0;
	}
	if(i==12)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P06=0;
	}
	if(i==13)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P05=0;
	}
	if(i==14)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P04=0;
	}
	if(i==15)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P03=0;
	}
	if(i==16)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P02=0;
	}
	if(i==17)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P01=0;
	}
	if(i==18)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P00=0;
	}
	if(i==19)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P10=0;
	}
	if(i==20)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P11=0;
	}
	if(i==21)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P12=0;
	}
	if(i==22)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P13=0;
	}
	if(i==23)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P14=0;
	}
	if(i==24)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P15=0;
	}
	if(i==25)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P16=0;
	}
	if(i==26)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P17=0;
	}
	if(i==27)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P50=0;
	}
	if(i==28)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P51=0;
	}
	if(i==29)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P32=0;
	}
	if(i==30)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P33=0;
	}
	if(i==31)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P34=0;
	}
	if(i==32)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P35=0;
	}
	if(i==33)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P36=0;
	}
	if(i==34)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P37=0;
	}
	if(i==35)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P56=0;
	}
	if(i==36)
	{
		P0=0xFF;
		P1=0xFF;
		P2=0xFF;
		P3=0xFF;
		P4=0xFF;
		P5=0xFF;
		P57=0;
	}
	i++;
	if(i>=37)
	{
		i=0;
	}
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2025-1-4 13:34:27 | 显示全部楼层
好几天没有学习更新了,今天是周六,没什么事摸鱼将矩阵按键学完,前几天矩阵按键的视频已经看了一半
为了减少IO口的占用引入了矩阵按键,下图是独立按键和矩阵按键的区别
1.png
2.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2025-1-4 13:38:21 | 显示全部楼层
矩阵按键的程序实现

1.png
按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。
①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
③第三步:行列组合一下就可以判断出是哪个按键按下了。

  1. u8 key_num=0xff;
  2. void Task(void)
  3. {
  4.         //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  5.         COL1 = 0;
  6.         COL2 = 0;
  7.         COL3 = 0;
  8.         COL4 = 0;
  9.         ROW1 = 1;
  10.         ROW2 = 1;
  11.         if(( ROW1 == 0 ) || ( ROW2 == 0 ))                //如果行按键有按下
  12.         {
  13.                 if(( ROW1 ==0 ) && ( ROW2 ==0 ))        //如果两行都有按键按下,不处理
  14.                 {
  15.                        
  16.                 }
  17.                 else if((( ROW1 ==1 )&&( ROW2 ==0 )) || (( ROW1 ==0 )&&( ROW2 ==1 )))        //如果有按键按下,而且只有一颗
  18.                 {
  19.                         if( ROW1 ==0 )                                //判断哪一行,输出行开始的序号
  20.                                 key_num = 0;
  21.                         else if( ROW2 ==0 )
  22.                                 key_num = 4;
  23.                         //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  24.                         COL1 = 1;
  25.                         COL2 = 1;
  26.                         COL3 = 1;
  27.                         COL4 = 1;
  28.                         ROW1 = 0;
  29.                         ROW2 = 0;
  30.                         if( COL1 ==0 )                                //判断哪一列,叠加按键的序号
  31.                         {
  32.                                 key_num = key_num + 0;
  33.                         }
  34.                         else if( COL2 ==0 )
  35.                         {
  36.                                 key_num = key_num + 1;
  37.                         }
  38.                         else if( COL3 ==0 )
  39.                         {
  40.                                 key_num = key_num + 2;
  41.                         }
  42.                         else if( COL4 ==0 )
  43.                         {
  44.                                 key_num = key_num + 3;
  45.                         }
  46.                 }
  47.                 COL1 = 0;
  48.                 COL2 = 0;
  49.                 COL3 = 0;
  50.                 COL4 = 0;
  51.                 ROW1 = 1;
  52.                 ROW2 = 1;
  53.         }
  54.         else
  55.         {
  56.                 key_num = 0xff;
  57.         }
  58. }
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-05-01 10:54:51
已绑定手机

83

主题

286

回帖

391

积分

中级会员

积分
391
发表于 2025-1-5 10:01:50 | 显示全部楼层
感谢分享
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-05-01 10:54:51
已绑定手机

83

主题

286

回帖

391

积分

中级会员

积分
391
发表于 2025-1-5 10:03:26 | 显示全部楼层
感谢分享
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-01-05 11:38:30
已绑定手机

0

主题

3

回帖

26

积分

新手上路

积分
26
发表于 2025-1-5 11:41:37 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2025-1-9 08:16:25 | 显示全部楼层
密码锁的代码照着冲哥的代码敲完了,运行正常,下面是代码
  1. #include "io.h"
  2. u8 SEG_NUM[]={                       //标准字库
  3. //   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  4.     0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  5. //black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
  6.     0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  7.     0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
  8. u8 T_NUM[8] =
  9. {
  10.         0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
  11. };
  12. /*
  13.         #define ROW1        P06                        //端口定义
  14.         #define ROW2        P07
  15.         #define COL1        P00
  16.         #define COL2        P01
  17.         #define COL3        P02
  18.         #define COL4        P03
  19. */
  20. u8 key_num = 0xff;
  21. //任务1:数码管显示当前的按键号
  22. void Task_1(void)
  23. {
  24.         //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  25.         COL1 = 0;
  26.         COL2 = 0;
  27.         COL3 = 0;
  28.         COL4 = 0;
  29.         ROW1 = 1;
  30.         ROW2 = 1;
  31.        
  32.         if(( ROW1 == 0 ) || ( ROW2 == 0 ))                //如果行按键有按下
  33.         {
  34.                 if(( ROW1 ==0 ) && ( ROW2 ==0 ))        //如果两行都有按键按下,不处理
  35.                 {
  36.                        
  37.                 }
  38.                 else if((( ROW1 ==1 )&&( ROW2 ==0 )) || (( ROW1 ==0 )&&( ROW2 ==1 )))        //如果有按键按下,而且只有一颗
  39.                 {
  40.                         if( ROW1 ==0 )                                //判断哪一行,输出行开始的序号
  41.                                 key_num = 0;
  42.                         else if( ROW2 ==0 )
  43.                                 key_num = 4;
  44.                                
  45.                         //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  46.                         COL1 = 1;
  47.                         COL2 = 1;
  48.                         COL3 = 1;
  49.                         COL4 = 1;
  50.                         ROW1 = 0;
  51.                         ROW2 = 0;
  52.                        
  53.                         if( COL1 ==0 )                                //判断哪一列,叠加按键的序号
  54.                         {
  55. //                                key_num = key_num ;
  56.                         }
  57.                         else if( COL2 ==0 )
  58.                         {
  59.                                 key_num = key_num + 1;
  60.                         }
  61.                         else if( COL3 ==0 )
  62.                         {
  63.                                 key_num = key_num + 2;
  64.                         }
  65.                         else if( COL4 ==0 )
  66.                         {
  67.                                 key_num = key_num + 3;
  68.                         }
  69.                 }
  70.                 COL1 = 0;
  71.                 COL2 = 0;
  72.                 COL3 = 0;
  73.                 COL4 = 0;
  74.                 ROW1 = 1;
  75.                 ROW2 = 1;               
  76.         }
  77.         else
  78.         {
  79.                 key_num = 0xff;
  80.         }
  81.        
  82.         //③第三步:行列组合一下就可以判断出是哪个按键按下了。
  83. }
  84.        
  85. void Init_595(void)
  86. {
  87.         HC595_SER = 0;
  88.         HC595_RCK = 0;
  89.         HC595_SCK = 0;       
  90. }
  91.        
  92. void Send_595( u8 dat )
  93. {
  94.         u8 i;
  95.        
  96.         for( i=0;i<8;i++ )
  97.         {
  98.                 dat <<= 1;                                //DAT = (DAT<<1);        //CY
  99.                 HC595_SER = CY;                //先把数据写到引脚上
  100.                 HC595_SCK = 1;                        //输出上升沿的时钟信号
  101.                 HC595_SCK = 0;
  102.         }
  103. }
  104. void Display_Seg(u8 HC595_1,u8 HC595_2)
  105. {
  106.         Send_595(HC595_1);                        //数码管段码输出  高电平点亮
  107.         Send_595(HC595_2);                        //数码管位码      低电平点亮
  108.        
  109.         HC595_RCK = 1;                                //数据输出       
  110.         HC595_RCK = 0;
  111. }
  112. u8 password[8]={17,17,17,17,17,17,17,17};
  113. u8 Seg_no = 0;
  114. void SEG_Task(void)
  115. {
  116.         if( Seg_no ==0 )                                                                //小时十位
  117.         {
  118.                 Display_Seg( SEG_NUM[password[0]] , ~T_NUM[0]);                //数码管刷段码和位码
  119.         }
  120.         else if(Seg_no==1)
  121.         {
  122.                 Display_Seg(SEG_NUM[password[1]],~T_NUM[1]);
  123.         }
  124.         else if(Seg_no==2)
  125.         {
  126.                 Display_Seg(SEG_NUM[password[2]],~T_NUM[2]);
  127.         }
  128.         else if(Seg_no==3)
  129.         {
  130.                 Display_Seg(SEG_NUM[password[3]],~T_NUM[3]);
  131.         }
  132.         else if(Seg_no==4)
  133.         {
  134.                 Display_Seg(SEG_NUM[password[4]],~T_NUM[4]);
  135.         }
  136.         else if(Seg_no==5)
  137.         {
  138.                 Display_Seg(SEG_NUM[password[5]],~T_NUM[5]);
  139.         }
  140.         else if(Seg_no==6)
  141.         {
  142.                 Display_Seg(SEG_NUM[password[6]],~T_NUM[6]);
  143.         }
  144.         else if(Seg_no==7)
  145.         {
  146.                 Display_Seg(SEG_NUM[password[7]],~T_NUM[7]);
  147.         }
  148.         else
  149.         {
  150.                
  151.         }
  152.         Seg_no++;
  153.         if(Seg_no>7)
  154.         {
  155.                 Seg_no=0;
  156.         }
  157. }
  158. u8 Key_Vol3=0;
  159. u8 key_no=0;
  160. void PW_write_Task(void)
  161. {
  162.         if(key_num<0xff)
  163.         {
  164.                 Key_Vol3++;
  165.                 if(Key_Vol3==5)
  166.                 {
  167.                         if(key_no==0)
  168.                         {
  169.                                 password[0]=17;
  170.                                 password[1]=17;
  171.                                 password[2]=17;
  172.                                 password[3]=17;
  173.                                 password[4]=17;
  174.                                 password[5]=17;
  175.                                 password[6]=17;
  176.                                 password[7]=17;
  177.                         }
  178.                         password[key_no]=key_num;
  179.                         key_no++;
  180.                         if(key_no>=8)
  181.                         {
  182.                                 if((password[0]==1) && (password[1]==2) && (password[2]==3) && (password[3]==4) && (password[4]==5) && (password[5]==6) && (password[6]==7) &&(password[7]==0) )  
  183.                                 {
  184.                                         password[0] = 1;
  185.                                         password[1] = 1;
  186.                                         password[2] = 23;
  187.                                         password[3] = 24;
  188.                                         password[4] = 14;
  189.                                         password[5] = 22;
  190.                                         password[6] = 1;
  191.                                         password[7] = 1;                                       
  192.                                 }
  193.                                 else
  194.                                 {
  195.                                         password[0]=17;
  196.                                         password[1]=17;
  197.                                         password[2]=17;
  198.                                         password[3]=17;
  199.                                         password[4]=17;
  200.                                         password[5]=17;
  201.                                         password[6]=17;
  202.                                         password[7]=17;
  203.                                         password[8]=17;
  204.                                 }
  205.                                 key_no=0;
  206.                         }
  207.                 }
  208.         }
  209.         else
  210.         {
  211.                 Key_Vol3=0;
  212.         }
  213. }
复制代码

这个密码锁的程序,将以前的学习的定时器中断周期性任务数码管显示矩阵按键进行了综合
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-04-19 12:17:08
已绑定手机

1

主题

61

回帖

285

积分

中级会员

积分
285
发表于 2025-1-9 13:00:49 | 显示全部楼层
计划将之前学习的东西梳理复习一下,尤其是新工程的创建和周期性任务
功能如下:
1.同样是一个密码锁
2.开锁状态下长按可以修改密码并保存
3.P33按钮长按为设定密码功能,短按为确定功能
4.8位数码管平时显示时分秒毫秒
5.按数字键时显示输入密码
6.密码输入完成8位后按确定键和保存密码进行比较
7.正确后数码管显示open-***打开次数
--暂时就这些功能,想到再加吧
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 20:12 , Processed in 0.159143 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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