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

Ai8051U 实验箱 学习开始打卡

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2024-12-20 22:22:40 | 显示全部楼层

第十集课后小练

screenshot-1734704504835.png

课后作业使用试验箱现有的矩阵键盘,因为矩阵键盘只有8和按键,所以我设置的正确密码位:12345670

当输入正确,数码管下方led流水灯显示,当密码不正确,下方led闪烁

upload 附件:test.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2024-12-26 10:13:10 | 显示全部楼层

第十一集 矩阵按键

微信截图_20241226095833.png

本节课介绍了矩阵按键,可以用X+Y个按键,实现X*Y个按键检测

矩阵按键采用扫描的方式实现,先将一列的端口置零,判断哪一行有按键按下

///第一步:将列设置为低电平

Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;

if(Row1==0||Row2==0){
		if(Row1==0&&Row2==0){}  //如果两行都有按键按下,不处理
		else {
			if(Row1==0){key_numb10=0;}
			else if(Row2==0){key_numb10=4;}
				Col1=1;
				Col2=1;
				Col3=1;
				Col4=1;
				Row1=0;
				Row2=0;

判断完列之后,再把行置零,判断具体哪一个按键按下

if(Col1==0){              //判断哪一列叠加按键的序号
		
				}else if(Col2==0){
				key_numb10=key_numb10+1;
				}else if(Col3==0){
				key_numb10=key_numb10+2;
				}else if(Col4==0){
				key_numb10=key_numb10+3;

任务实操是实现之前的课后练习:密码锁

u8 key_numb10=0xff;void juzhenjianpan(){///第一步:将列设置为低电平Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;

if(Row1==0||Row2==0){
		if(Row1==0&&Row2==0){}  //如果两行都有按键按下,不处理
		else {
			if(Row1==0){key_numb10=0;}
			else if(Row2==0){key_numb10=4;}
				Col1=1;
				Col2=1;
				Col3=1;
				Col4=1;
				Row1=0;
				Row2=0;
	
				if(Col1==0){              //判断哪一列叠加按键的序号
			
				}else if(Col2==0){
				key_numb10=key_numb10+1;
				}else if(Col3==0){
				key_numb10=key_numb10+2;
				}else if(Col4==0){
				key_numb10=key_numb10+3;
				}
			}
		

Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
	}
	else{key_numb10 =0xff;}
Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;

if(Row1==0||Row2==0){
		if(Row1==0&&Row2==0){}  //如果两行都有按键按下,不处理
		else {
			if(Row1==0){key_numb10=0;}
			else if(Row2==0){key_numb10=4;}
				Col1=1;
				Col2=1;
				Col3=1;
				Col4=1;
				Row1=0;
				Row2=0;
	
				if(Col1==0){              //判断哪一列叠加按键的序号
			
				}else if(Col2==0){
				key_numb10=key_numb10+1;
				}else if(Col3==0){
				key_numb10=key_numb10+2;
				}else if(Col4==0){
				key_numb10=key_numb10+3;
				}
			}
		

Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
	}
	else{key_numb10 =0xff;}
​}u8 Passwd[8]={16,16,16,16,16,16,16,16};
void Seg_Task2(void){​switch(Seg_no){	case 0: Display_Seg( SEG_NUMB[Passwd[0]], ~T_NUM[0]) ;break;
	case 1: Display_Seg( SEG_NUMB[Passwd[1]], ~T_NUM[1]); break;
	case 2: Display_Seg( SEG_NUMB[Passwd[2]], ~T_NUM[2]); break;
  case 3: Display_Seg( SEG_NUMB[Passwd[3]], ~T_NUM[3]); break;
  case 4: Display_Seg( SEG_NUMB[Passwd[4]], ~T_NUM[4]); break;
  case 5: Display_Seg( SEG_NUMB[Passwd[5]], ~T_NUM[5]); break;
	case 6: Display_Seg( SEG_NUMB[Passwd[6]], ~T_NUM[6]); break;
	case 7: Display_Seg( SEG_NUMB[Passwd[7]], ~T_NUM[7]); break;
}

Seg_no++;
if(Seg_no>7){
Seg_no=0;
}

}

u8 Key_vol3=0;
u8 Key_no=0;
​void PW_write_Task(void){if(key_numb10<0xff){
Key_vol3++;
if(Key_vol3==5){
if(Key_no==0){
Passwd[0]=16;
Passwd[1]=16;
Passwd[2]=16;
Passwd[3]=16;
Passwd[4]=16;
Passwd[5]=16;
Passwd[6]=16;
Passwd[7]=16;	 }
Passwd[Key_no]	= key_numb10;


	 Key_no++;
	 
	 if(Key_no==8){
			if(Passwd[0]==1&&Passwd[1]==2&&Passwd[2]==3&&Passwd[3]==4&&Passwd[4]==5&&Passwd[5]==6&&Passwd[6]==7&&Passwd[7]==0){
				Passwd[0]=17;
				Passwd[1]=17;
				Passwd[2]=17;
				Passwd[3]=17;
				Passwd[4]=17;
				Passwd[5]=17;
				Passwd[6]=17;
				Passwd[7]=1;
	
			}else{
				Passwd[0]=16;
				Passwd[1]=16;
				Passwd[2]=16;
				Passwd[3]=16;
				Passwd[4]=16;
				Passwd[5]=16;
				Passwd[6]=16;
				Passwd[7]=16;
	
			}
		
			Key_no=0;
	 }
	 		 
	 	 }
 
 }
	 }
Passwd[Key_no]	= key_numb10;


	 Key_no++;
	 
	 if(Key_no==8){
			if(Passwd[0]==1&&Passwd[1]==2&&Passwd[2]==3&&Passwd[3]==4&&Passwd[4]==5&&Passwd[5]==6&&Passwd[6]==7&&Passwd[7]==0){
				Passwd[0]=17;
				Passwd[1]=17;
				Passwd[2]=17;
				Passwd[3]=17;
				Passwd[4]=17;
				Passwd[5]=17;
				Passwd[6]=17;
				Passwd[7]=1;
	
			}else{
				Passwd[0]=16;
				Passwd[1]=16;
				Passwd[2]=16;
				Passwd[3]=16;
				Passwd[4]=16;
				Passwd[5]=16;
				Passwd[6]=16;
				Passwd[7]=16;
	
			}
		
			Key_no=0;
	 }
	 		 
	 	 }
 
 }
​else {
Key_vol3=0;}}

upload 附件:test.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2024-12-26 10:16:42 | 显示全部楼层

第十一集 矩阵按键 课后作业

微信截图_20241226095715.png

我这里使用12345分别对应5种模式,对应的工作时间分别为:5秒,10秒,15秒,20秒,25秒。

开始按键为0。

使用了四个函数加上之前的595数码管显示函数。

mod_task:模式的选择

void mod_task(void){if(key_numb10>0&&key_numb10<6){
Key_vol3++;
if(Key_vol3==5){  mod	= key_numb10;
	    start	= 0;
			  finish=0;
	 	 }
 
 }
  mod	= key_numb10;
	    start	= 0;
			  finish=0;
	 	 }
 
 }
​else if(key_numb10==0){
Key_vol3++;
if(Key_vol3==5){				start	= 1;
			  finish=0;
			if(mod==1){
			 CoutDown_time=5;
				 }
			 else if(mod==2){
			 CoutDown_time=10;
			 }
			 else if(mod==3){
			 CoutDown_time=15;
			 }
			 else if(mod==4){
			 CoutDown_time=20;
			 }
			 else if(mod==5){
			 CoutDown_time=25;
	 	 }

	 }
	}
	 else{
		Key_vol3=0;
	 }
				start	= 1;
			  finish=0;
			if(mod==1){
			 CoutDown_time=5;
				 }
			 else if(mod==2){
			 CoutDown_time=10;
			 }
			 else if(mod==3){
			 CoutDown_time=15;
			 }
			 else if(mod==4){
			 CoutDown_time=20;
			 }
			 else if(mod==5){
			 CoutDown_time=25;
	 	 }

	 }
	}
	 else{
		Key_vol3=0;
	 }
​}

CountDown_Task:倒计时

void CountDown_Task(void){	if(start==1){

	  CoutDown_time--;

if( CoutDown_time==0){

	finish=1;
	start=0;
}
	if(start==1){

	  CoutDown_time--;

if( CoutDown_time==0){

	finish=1;
	start=0;
}
​}
}

数码管显示

void Seg_Task2(void){switch(Seg_no){
	case 0: Display_Seg( SEG_NUMB[17], ~T_NUM[0]); break;
	case 1: Display_Seg( SEG_NUMB[17], ~T_NUM[1]); break;
	case 2: Display_Seg( SEG_NUMB[17], ~T_NUM[2]); break;
  case 3: Display_Seg( SEG_NUMB[17], ~T_NUM[3]); break;
  case 4: Display_Seg( SEG_NUMB[17], ~T_NUM[4]); break;
  case 5: Display_Seg( SEG_NUMB[17], ~T_NUM[5]); break;
	case 6: if(start==0&&finish==0){  Display_Seg(SEG_NUMB[17], ~T_NUM[6]) ;}else if(start==1&&finish==0){Display_Seg( SEG_NUMB[CoutDown_time/10], ~T_NUM[6]);}else if(finish==1){  Display_Seg(SEG_NUMB[17], ~T_NUM[6]) ;}break;
	case 7: if(start==0&&finish==0){ Display_Seg( SEG_NUMB[mod], ~T_NUM[7]) ;}else if(start==1&&finish==0){Display_Seg( SEG_NUMB[CoutDown_time%10], ~T_NUM[7]);}else if(finish==1){  Display_Seg(SEG_NUMB[17], ~T_NUM[7]) ;}break;
}

Seg_no++;
if(Seg_no>7){
Seg_no=0;
}

}
switch(Seg_no){
	case 0: Display_Seg( SEG_NUMB[17], ~T_NUM[0]); break;
	case 1: Display_Seg( SEG_NUMB[17], ~T_NUM[1]); break;
	case 2: Display_Seg( SEG_NUMB[17], ~T_NUM[2]); break;
  case 3: Display_Seg( SEG_NUMB[17], ~T_NUM[3]); break;
  case 4: Display_Seg( SEG_NUMB[17], ~T_NUM[4]); break;
  case 5: Display_Seg( SEG_NUMB[17], ~T_NUM[5]); break;
	case 6: if(start==0&&finish==0){  Display_Seg(SEG_NUMB[17], ~T_NUM[6]) ;}else if(start==1&&finish==0){Display_Seg( SEG_NUMB[CoutDown_time/10], ~T_NUM[6]);}else if(finish==1){  Display_Seg(SEG_NUMB[17], ~T_NUM[6]) ;}break;
	case 7: if(start==0&&finish==0){ Display_Seg( SEG_NUMB[mod], ~T_NUM[7]) ;}else if(start==1&&finish==0){Display_Seg( SEG_NUMB[CoutDown_time%10], ~T_NUM[7]);}else if(finish==1){  Display_Seg(SEG_NUMB[17], ~T_NUM[7]) ;}break;
}

Seg_no++;
if(Seg_no>7){
Seg_no=0;
}

}

juzhenjianpan:矩阵键盘显示

void juzhenjianpan(){///第一步:将列设置为低电平Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;

if(Row1==0||Row2==0){
		if(Row1==0&&Row2==0){}  //如果两行都有按键按下,不处理
		else {
			if(Row1==0){key_numb10=0;}
			else if(Row2==0){key_numb10=4;}
				Col1=1;
				Col2=1;
				Col3=1;
				Col4=1;
				Row1=0;
				Row2=0;

				if(Col1==0){              //判断哪一列叠加按键的序号
		
				}else if(Col2==0){
				key_numb10=key_numb10+1;
				}else if(Col3==0){
				key_numb10=key_numb10+2;
				}else if(Col4==0){
				key_numb10=key_numb10+3;
				}
			}
	

Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
	}
	else{key_numb10 =0xff;}
Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;

if(Row1==0||Row2==0){
		if(Row1==0&&Row2==0){}  //如果两行都有按键按下,不处理
		else {
			if(Row1==0){key_numb10=0;}
			else if(Row2==0){key_numb10=4;}
				Col1=1;
				Col2=1;
				Col3=1;
				Col4=1;
				Row1=0;
				Row2=0;

				if(Col1==0){              //判断哪一列叠加按键的序号
		
				}else if(Col2==0){
				key_numb10=key_numb10+1;
				}else if(Col3==0){
				key_numb10=key_numb10+2;
				}else if(Col4==0){
				key_numb10=key_numb10+3;
				}
			}
	

Col1=0;
Col2=0;
Col3=0;
Col4=0;
Row1=1;
Row2=1;
	}
	else{key_numb10 =0xff;}
​}

upload 附件:test.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-3 23:36:06 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-6 11:44:06 | 显示全部楼层
移植官方例程里的PWM

test - PWM.rar

162.17 KB, 下载次数: 50

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-12 08:27:07 | 显示全部楼层

第十二集-复位系统

本节介绍了复位系统,分为:

1.硬件复位
2.软件复位

1.硬件复位

分为:

1.上电复位(复位电压为1.7-1.9V)

2.低压复位

3.复位脚复位

4.看门狗复位:只有一个寄存器:WDT_CONTR

只需在main函数初始化的时候启动看门狗:

WDT_CONTR=0X24;

在循环里边设置喂狗:

WDT_CONTR=0X34;

图片1.png

注意:

(程序有USB功能记得先加USB复位)

P3M0 = 0x00;
P3M1 = 0x00;P3M0 &= ~0x03;
P3M1 |= 0x03;USBCON = 0X00;
USBCLK = 0X00;
IRC48MCR = 0X00;
Delay10ms();

2.软件复位

IAP_CONTR=0X60;      //复位到  usb下载模式
IAP_CONTR=0X20;    // 直接复位
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-12 08:33:18 | 显示全部楼层

第十二集-复位系统 课后小练


screenshot-1736608923362.png

在冲哥矩阵键盘那一节原有密码锁的代码基础上继续完善

代码实现:

3.当按下的密码为“ 1 2 3 4 5 6 7 0”时,数码管显示open的字符,否则,还是显示“- - - - - - - -”

数码管部分增加:

0x5c, /'o', 19/
0x73, /'P', 20/
0x54, /'N', 21/
0x3e, /'U', 22/
0x86, /'1.', 23/

1.看门狗,超时1秒自动复位:增加看门狗

WDT_CONTR=0X24;

WDT_CONTR=0X34;

2.增加开机版本号,开机显示三秒的U 1.00 版本号:新定义一个函数,判断三秒时间到了吗

start_flag放在定时器里边,每1ms加1

u8 passward[8] = { 17,17,17,17,22,23,1,1 };
extern u16 ms_1_flag;
u8 start_flag=0;void show_version(void){
if(start_flag==0){

	if(ms_1_flag==3000){
		passward[0] = 16;
				passward[1] = 16;
				passward[2] = 16;
				passward[3] = 16;
				passward[4] = 16;
				passward[5] = 16;
				passward[6] = 16;
				passward[7] = 16;	

		start_flag=1;
	}
	}
}

3.增加手动复位,P33按钮按下时重启(方便查看版本号和清除密码)

在按键检测中:

Usb_REstet();
// IAP_CONTR=0X60;     ///   usb下载模式
IAP_CONTR=0X20;    ///复位到重启

upload 附件:WDT_kehou_mimasuo.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:78
  • 最近打卡:2025-04-29 08:19:44
已绑定手机

4

主题

153

回帖

300

积分

中级会员

积分
300
发表于 2025-1-12 09:08:53 | 显示全部楼层
冲哥讲的特别详细
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-24 17:25:07 | 显示全部楼层

第十三集 外部中断

本集讲解了外部中断,以外部中断1为例,引脚为P33

void INT1_Init (void){
IT1=1; //下降沿中断
EX1=1; //打开中断允许
EA =1; //打开总中断

}

void INT_ISR(void) interrupt 2
{

P21=!P21;

}

upload 附件:demo.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-25 10:53:53 | 显示全部楼层

第十三集 外部中断 课后小练

微信截图_20250125105217.png

用手头上的擎天柱,P41为启动按键,按下后P21上的LED灯点亮,P33为外部中断,按下后led灯熄灭。

upload 附件:demo-外部中断作业.rar

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-5 14:53 , Processed in 0.137363 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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