第十集 虚拟LED和数码管
本节主要介绍了ISP软件上的虚拟LED,数码管和虚拟键盘等仿真功能的使用流程及注意事项虚拟LED
虚拟数码管
虚拟键盘
任务1:P2口流水灯,P10闪烁
void TASK_1( void )
{
LED40_SetPort(2,~P2_STATE); //点亮P20端口
P2_STATE = (P2_STATE<<1); //1000 0000 _> 1 0000 0000
if( P2_STATE == 0 )
{
P2_STATE = 1;
}
if( P10_STATE == 0)
{
LED40_SetBit(1,0);
}
else
{
LED40_ClrBit(1,0);
}
P10_STATE = !P10_STATE;
}
u32 KEY_Count = 0;
任务2:左边数码管显示P32按下次数 右边数码管显示P33按下次数
void TASK_2( void )
{
KEY_Count = KEY1_COUNT *10000 + KEY2_COUNT;
SEG7_ShowLong(KEY_Count ,10);
}
u32 REC_NUM = 0;
任务3:按下数字按键在数码管显示对应的按键数字
void TASK_3( void )
{
SEG7_ShowLong( REC_NUM ,10);
}
课后练习
io.c
#include "io.h"
u16 cnt1,cnt2;
u16 Key_Vol ; //按键按下持续时间
u8 code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black- H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
u8 cod = {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40};
void KEY_Task(void)
{
if( P32 == 0 )
{
Key_Vol++;
if( Key_Vol==5 )
{
//按键按下的任务
cnt1++;
}
}
else
{
Key_Vol = 0;
}
if( P33 == 0 )
{
Key_Vol++;
if( Key_Vol==5 )
{
//按键按下的任务
cnt2++;
}
}
else
{
Key_Vol = 0;
}
}
u8 index=0;
u8 overflag = 0;
void Task_4(void)
{
SEG7_ShowCode(cod);
switch(rec_vkey)
{
case 0:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
case 1:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
case 2:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
case 3:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
case 4:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
case 5:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
case 6:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
case 7:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
case 8:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
case 9:cod = t_display;rec_vkey = 0xff;index++;if(index > 8){overflag = 1;index = 0;}break;
default:rec_vkey = 0xff;break;
}
if(overflag)
{
overflag = 0;
if((cod==t_display) && (cod==t_display) && (cod==t_display) && (cod==t_display) && \
(cod==t_display) && (cod==t_display) && (cod==t_display) && (cod==t_display))
{
cod = 0x00;
cod = 0x00;
cod = 0x00;
cod = 0x00;
cod = 0x5C;
cod = 0x73;
cod = 0x79;
cod = 0x37;
}
else
{
cod = 0x40;
cod = 0x40;
cod = 0x40;
cod = 0x40;
cod = 0x40;
cod = 0x40;
cod = 0x40;
cod = 0x40;
}
}
}
io.h
#ifndef __IO_H
#define __IO_H
#include "config.h" //调用头文件
void KEY_Task(void);
void Task_4(void);
#endif
收到官方送的AI8051U实验箱啦,感谢官方支持!!!!!!!!!
<p>老规矩先点灯</p>
<video controls="controls" src="forum.php?mod=attachment&aid=76640"></video>
<p>第九集计时</p>
<video controls="controls" src="forum.php?mod=attachment&aid=76661"></video>
<p>第九集课后练习</p>
<video controls="controls" src="forum.php?mod=attachment&aid=76687"></video>
冲哥的屏幕到了先来个手写计算器例程学习下
<p>第十集课后练习</p>
<video controls="controls" src="forum.php?mod=attachment&aid=76944"></video>
第11集 矩阵按键
一、矩阵按键介绍与独立按键对比:
独立按键:一个按键占用一个 I/O 口。
矩阵按键:将按键排成行列矩阵形式,可减少 I/O 口占用。
矩阵按键的优势:
以较少的 I/O 口控制较多的按键。
例如:8 个 I/O 口可控制 16 个按键。
二、矩阵按键控制原理
按键检测原理:
先将部分引脚输出低电平,部分输出高电平。
若有按键按下,高电平引脚会被拉低。
通过改变输出电平的引脚,结合行和列的状态,可判断按下的按键。
三、矩阵按键程序编写
功能函数:
定义矩阵按键读取函数,返回按下按键的序号。
函数内通过三步操作判断按键状态:先输出特定电平,延时等待,读取引脚状态并计算。
优化函数:
通过静态变量记录上一次按键状态,与当前状态对比,避免重复输出。
页:
1
[2]