Towon 发表于 2024-12-22 19:55:20

第十集 虚拟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

Towon 发表于 2024-12-25 14:20:05

收到官方送的AI8051U实验箱啦,感谢官方支持!!!!!!!!!

Towon 发表于 2024-12-25 15:42:48

<p>老规矩先点灯</p>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=76640"></video>

Towon 发表于 2024-12-25 16:47:22

<p>第九集计时</p>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=76661"></video>

Towon 发表于 2024-12-25 18:44:12

<p>第九集课后练习</p>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=76687"></video>

Towon 发表于 2024-12-26 13:33:37

冲哥的屏幕到了先来个手写计算器例程学习下




Towon 发表于 2024-12-26 21:18:39

<p>第十集课后练习</p>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=76944"></video>

Towon 发表于 2024-12-27 12:26:02

第11集 矩阵按键

一、矩阵按键介绍
与独立按键对比:
独立按键:一个按键占用一个 I/O 口。
矩阵按键:将按键排成行列矩阵形式,可减少 I/O 口占用。
矩阵按键的优势:
以较少的 I/O 口控制较多的按键。
例如:8 个 I/O 口可控制 16 个按键。

二、矩阵按键控制原理
按键检测原理:
先将部分引脚输出低电平,部分输出高电平。
若有按键按下,高电平引脚会被拉低。
通过改变输出电平的引脚,结合行和列的状态,可判断按下的按键。


三、矩阵按键程序编写
功能函数:
定义矩阵按键读取函数,返回按下按键的序号。
函数内通过三步操作判断按键状态:先输出特定电平,延时等待,读取引脚状态并计算。
优化函数:
通过静态变量记录上一次按键状态,与当前状态对比,避免重复输出。
页: 1 [2]
查看完整版本: 《Ai8051U教学视频》学习心得