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

第一课 序言《AI8051U的特点》

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 10:41:08 | 显示全部楼层
接下来看看是不是2个按键同时按下

是的话,什么都不干(等于取消掉,自动开始下一轮循环)

if(( ROW1 ==0 ) && ( ROW2 ==0 ))        //如果两行都有按键按下,不处理
                {
                        
                }

如果只按了1个按键:

else if((( ROW1 ==1 )&&( ROW2 ==0 )) || (( ROW1 ==0 )&&( ROW2 ==1 )))        //如果有按键按下,而且只有一颗
        
这个检查的很细致,一定是只有按下一个按键才有反应

因为矩阵按键天生是只能识别按下1个按键.............


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 10:50:09 | 显示全部楼层
满足只有一个按键按下,查一下是哪行按下,并且记录下来:

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;

先把行和列的电平倒过来:
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 10:54:02 | 显示全部楼层
接着判断谁被按下:

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;
                       
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 11:04:54 | 显示全部楼层
解释一下,为甚上面的

//                                key_num = key_num ;

要注释掉,因为编译的时候会有个警告,不想出现警告就直接注释掉

因为原来的意思是        key_num = key_num + 0 ;

编译器就觉得什么都没干,你搞啥?就警告你!

当然上面是简化处理了,没有判断2个按键同时按下............

毕竟我们是课程实验,不是实用项目开发

还有个问题,按键松开了,就不要保存原来的值,直接清空:

else
        {
                key_num = 0xff;
        }
  
反正有用的键值是0--7,我们用FF表示什么都没有按下!     




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 14:27:45 | 显示全部楼层
函数void Task_1(void)写好了

记得去io.h声明一下:

#ifndef __IO_H
#define __IO_H

#include "config.h"                        //调用头文件

#define ROW1        P06                        //端口定义
#define ROW2        P07
#define COL1        P00
#define COL2        P01
#define COL3        P02
#define COL4        P03

#define HC595_SER         P34
#define HC595_RCK         P35
#define HC595_SCK         P32

extern u8 key_num ;

void LED0_Blink(void);
void LED1_Blink(void);
void LED2_Blink(void);

void KEY_Task(void);
void Task_1(void);
void SEG_Task(void);
void Init_595(void);
//void PW_write_Task(void);

#endif

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 14:30:10 | 显示全部楼层
数码管显示部分

就把前面程序的移植过来:

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

u16 Key_Vol ;                                //按键按下持续时间

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[8] =
{
        0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 14:31:51 | 显示全部楼层
包括移位锁存器595的驱动:

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 = (DAT<<1);        //CY
                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[17] , ~T_NUM[0]);                //数码管刷段码和位码
        else
                Display_Seg( SEG_NUM[key_num] , ~T_NUM[0]);                //数码管刷段码和位码
}

全部复制过来
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 14:57:32 | 显示全部楼层
还记得SEG_NUM[17] 是什么都不显示么?

其实我觉得改成16,显示“-”好点

实验效果不错!

截图202601211457306054.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 15:01:47 | 显示全部楼层
这里:

                        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;               

如果没有最后的这6行:

                COL1 = 0;
                COL2 = 0;
                COL3 = 0;
                COL4 = 0;
                ROW1 = 1;
                ROW2 = 1;               

那么运行起来就会有跳动的感觉,主要是端口状态没有恢复,

所以这6行还是要的!

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-1-21 15:03:28 | 显示全部楼层
这样就几乎不闪了:
截图202601211503263383.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-6-13 13:57 , Processed in 0.074544 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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