《8051U深度入门到32位51大型实战教学视频》学习打卡
跟着冲哥一起学习AI8051U第三集打卡跟着冲哥敲代码,成功点亮第一颗LED灯---附件有代码
第四集已学习,已手敲代码,测试通过
第五集打卡,已手敲代码,测试通过
第6集 IO输入输出,已手敲代码,测试通过。
第7集 定时器中断,已手敲代码,测试OK
第八集:
任务1:LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次
任务2:数组点亮LED,实现流水灯
任务3:按键1按一下,LED通过数组移动一下
第9集已学习,已手敲代码,测试通过
任务一:数码管静态显示一个数字
#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 T_NUM = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 State1 = 0; //LED1初始状态u8 State2 = 0; //LED2初始状态u8 State3 = 0; //LED3初始状态
u16 Key_Vol = 0; //按键按下持续时间
void LED0_Blink(void){ State1 = !State1; P00 = State1;}
void LED1_Blink(void){ State2 = !State2; P01 = State2;}
void LED2_Blink(void){ State3 = !State3; P02 = State3;}
void KEY_Task(void){// if( P32 == 0 )// {// Key_Vol++;// if( Key_Vol==5 )// {// //按键按下的任务// printf( "按键单击\r\n" );// }// }// else// {// Key_Vol = 0;// }
}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; HC595_SER = CY; 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;}
void Seg_Task(void){ Display_Seg( SEG_NUM, ~T_NUM );
}
任务2 数码管显示12345678
任务3
擎天柱 虚拟显示-LED,P2流水灯效果
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 T_NUM = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; u8 State1 = 0; //LED1初始状态u8 State2 = 0; //LED2初始状态u8 State3 = 0; //LED3初始状态 u16 Key_Vol = 0; //按键按下持续时间 void LED0_Blink(void){ State1 = !State1; P00 = State1;} void LED1_Blink(void){ State2 = !State2; P01 = State2;} void LED2_Blink(void){ State3 = !State3; P02 = State3;} void KEY_Task(void){// if( P32 == 0 )// {// Key_Vol++;// if( Key_Vol==5 )// {// //按键按下的任务// printf( "按键单击\r\n" );// }// }// else// {// Key_Vol = 0;// } }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; HC595_SER = CY; 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 Seg_no = 0;u8 shi =0;u8 fen =0;u8 miao =0; void Seg_Task(void){ u8 num = 0; if( Seg_no ==0 ) { num = shi/10; Display_Seg( SEG_NUM, ~T_NUM ); } else if( Seg_no ==1 ) { num = shi%10; Display_Seg( SEG_NUM, ~T_NUM ); } else if( Seg_no ==2 ) { Display_Seg( SEG_NUM, ~T_NUM ); } else if( Seg_no ==3 ) { num = fen/10; Display_Seg( SEG_NUM, ~T_NUM ); } else if( Seg_no ==4 ) { num = fen%10; Display_Seg( SEG_NUM, ~T_NUM ); } else if( Seg_no ==5 ) { Display_Seg( SEG_NUM, ~T_NUM ); } else if( Seg_no ==6 ) { num = miao/10; Display_Seg( SEG_NUM, ~T_NUM ); } else if( Seg_no ==7 ) { num = miao%10; Display_Seg( SEG_NUM, ~T_NUM ); } else { } Seg_no ++; if( Seg_no>7 ) Seg_no=0;}void TIMECOUNT_Task(void){ miao ++; if( miao>59 ) { miao = 0; fen ++; if( fen>59 ) { fen = 0; shi ++; if( shi>23 ) shi = 0; } }} u8 state_now = 0;void PLED_40(void){ u8 cod; cod = 0x0f; //表示开启P0-P3 cod = 0x01; //P0端口 cod = 0x01; //P1 cod = T_NUM; //P2 cod = 0x01; //P3 LED40_SendData( cod,5 ); P2 = T_NUM; state_now++; if( state_now>7 ) state_now = 0;}Task.c#include "task.h"#include "io.h"static TASK_COMPONENTS Task_Comps[]={//状态计数周期函数// {0, 300, 300, LED0_Blink}, /* task 1 Period: 300ms */// {0, 600, 600, LED1_Blink}, /* task 1 Period: 600ms */ // {0, 900, 900, LED2_Blink}, /* task 1 Period: 600ms */// {0, 10, 10, KEY_Task}, /* task 1 Period: 600ms */ {0,1, 1, Seg_Task}, /* task 1 Period: 600ms */ {0,1000,1000, TIMECOUNT_Task}, /* task 1 Period: 600ms */ {0,1000,1000, PLED_40}, /* task 1 Period: 600ms */ };u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps); //========================================================================// 函数: 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.TIMCount) /* If the time is not 0 */ { Task_Comps.TIMCount--; /* Time counter decrement */ if(Task_Comps.TIMCount == 0) /* If time arrives */ { /*Resume the timer value and try again */ Task_Comps.TIMCount = Task_Comps.TRITime; Task_Comps.Run = 1; /* The task can be run */ } } }}//========================================================================// 函数: 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.Run) /* If task can be run */ { Task_Comps.Run = 0; /* Flag clear 0 */ Task_Comps.TaskHook(); /* Run task */ } }} io.h#ifndef __IO_H#define __IO_H#include "config.h" //调用头文件 //#define 引脚名称 PXX的端口 #define HC595_SER P34#define HC595_RCK P35#define HC595_SCK P32 void LED0_Blink(void);void LED1_Blink(void);void LED2_Blink(void); void KEY_Task(void); void Send_595( u8 dat );void Display_Seg(u8 HC595_1,u8 HC595_2);void Seg_Task(void);void TIMECOUNT_Task(void);void Init_595(void);void PLED_40(void); #endif
擎天柱-虚拟显示-LED,P2流水灯效果(续)
第十集:虚拟LED和数码管
擎天柱/AI8051U转89C52-DIP40核心功能板V1.1打卡
任务1.(1)点亮P2口端口
void TASK_1( void )
{
//-------------------------p2端口流水灯------------------------
LED40_SetPort(2,~P2_STATE);//点亮P20端口
}
(2)P2口流水灯,P10闪烁
void TASK_1( void )
{
//-------------------------p2端口流水灯------------------------
LED40_SetPort(2,~P2_STATE);//点亮P20端口
P2_STATE = (P2_STATE << 1);
if( P2_STATE == 0 )
P2_STATE = 1;
//-------------------------p1端口闪烁------------------------
if(P10_STATE == 0)
LED40_SetBit(1,0);
else
LED40_ClrBit(1,0);
P10_STATE = !P10_STATE;
}
任务2.左边数码管显示P32按下次数,右边数码管显示P33按下次数
#include "io.h"
u8 State1 = 0; //LED1初始状态
u8 State2 = 0; //LED2初始状态
u8 State3 = 0; //LED3初始状态
u16 Key_Vol = 0;//按键按下持续时间
u16 Key_Vol_2 = 0;//按键按下持续时间
void LED0_Blink(void)
{
State1 = !State1;
P00 = State1;
}
void LED1_Blink(void)
{
State2 = !State2;
P01 = State2;
}
void LED2_Blink(void)
{
State3 = !State3;
P02 = State3;
}
u16 KEY1_COUNT = 0;//p32按钮计数
u16 KEY2_COUNT = 0;//p33按钮计数
void KEY_Task(void)
{
//----------P32按钮计数---------
if( P32 == 0)
{
Key_Vol++;
if(Key_Vol == 5)
{
KEY1_COUNT++;
}
}
else
{
Key_Vol = 0;
}
//----------P32按钮计数---------
if( P33 == 0)
{
Key_Vol_2++;
if(Key_Vol_2 == 5)
{
KEY2_COUNT++;
}
}
else
{
Key_Vol_2 = 0;
}
}
u8 P2_STATE = 0X01;
u8 P10_STATE = 0;
// 任务2:左边数码管显示P32按下次数,右边数码管显示P33按下次数
void TASK_2( void )
{
KEY_Count = KEY1_COUNT *10000+KEY2_COUNT;
SEG7_ShowLong(KEY_Count , 10);
}
io.h
#ifndef __IO_H
#define __IO_H
#include "config.h" //调用头文件
void LED0_Blink(void);
void LED1_Blink(void);
void LED2_Blink(void);
void KEY_Task(void);
void TASK_1( void );
void TASK_2( void );
#endif
任务3:按下数字按键在数码管显示对应的按键数字
//任务3:按下数字按键在数码管显示对应的按键数字
void TASK_3( void )
{
SEG7_ShowLong(REC_NUM , 10);
}
第十一集 矩阵按键
任务1:数码管显示当前按键
IO.C程序
#include "io.h"
u8 State1 = 0; //LED1初始状态
u8 State2 = 0; //LED2初始状态
u8 State3 = 0; //LED3初始状态
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 T_NUM=
{
0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};
void LED0_Blink(void)
{
State1 = !State1;
P00 = State1;
}
void LED1_Blink(void)
{
State2 = !State2;
P01 = State2;
}
void LED2_Blink(void)
{
State3 = !State3;
P02 = State3;
}
void KEY_Task(void)
{
if( P32 == 0)
{
Key_Vol++;
if(Key_Vol == 5)
{
printf("按键单机\r\n");
}
}
else
{
Key_Vol = 0;
}
}
/*
#define ROW1 P06//端口定义
#define ROW2 P07
#define COL1 P00
#define COL2 P01
#define COL3 P02
#define COL4 P03
*/
u8 key_num = 0xff;
//任务1:数码管显示当前的按键号
void Task_1(void)
{
// ①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
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 == 1 ) && ( ROW2 == 0 )) ||(( ROW1 == 0 ) && ( ROW2 == 1 ))) //如果有按键按下,而且只有一颗
{
if( ROW1 == 0 )//判断哪一行,输出行开始的序号
key_num = 0;
else if( ROW2 == 0)
key_num = 4;
// ②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
COL1=1;
COL2=1;
COL3=1;
COL4=1;
ROW1=0;
ROW2=0;
if( COL1 ==0 )//判断哪一列,叠加按键的序号
{
// key_num =key_num ;
}
else if( COL2 ==0 )
{
key_num =key_num + 1;
}
else if( COL3 ==0 )
{
key_num =key_num + 2;
}
else if( COL4 ==0 )
{
key_num =key_num + 3;
}
}
COL1=0;
COL2=0;
COL3=0;
COL4=0;
ROW1=1;
ROW2=1;
}
else
{
key_num = 0xff;
}
// ③第三步:行列组合一下就可以判断出是哪个按键按下了。
}
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;
HC595_SER = CY;//先把数据写到引脚上
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;
}
void SEG_Task(void)
{
if(key_num == 255)
Display_Seg( SEG_NUM , ~T_NUM);
else
Display_Seg( SEG_NUM , ~T_NUM); //数码管刷新段码和位码
}
第十一集:矩阵按键
任务2:密码锁
页:
[1]
2