欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 90|回复: 0

基于STC单片机通过8255芯片对IO进行扩展矩阵键盘

[复制链接]
发表于 2023-3-3 22:25:46 | 显示全部楼层 |阅读模式
本帖最后由 bcwx 于 2023-3-3 22:28 编辑

本实验平台为亚龙236单片机控制装置,程序是本人在上中专时候编写,至于接线那些不记得了

[C] 纯文本查看 复制代码
#include <REGX52.H>
#include <absacc.h>
#define uchar unsigned char 
#define uint unsigned int
//8255端口及控制地址定义
#define PA XBYTE[0x0000]  /* PA口 */
#define PB XBYTE[0x0100]  /* PB口(未用) */
#define PC XBYTE[0x0200]  /* PC口 */
#define PE XBYTE[0x0300]  /* 控制 */
uchar h;
void ys(unsigned int i)
{
                        while(--i);
}
uchar jp()
{         //下面的返回值h不能在这里定义成局部变量,一定要设置成全局变量
                                uchar temp;  
                                PC=0xfe; //扫描第1行按键       
                                temp=PC; //送第一个的扫描码
                                if(temp&0xf0)
        {
                                ys(10);
                                temp=PC;
                                if(temp&0xf0)
                {
                                temp=PC;   //重新读取PC口
                                switch(temp)
                        {
                                case 0xee: h=0xee; break;
                                case 0xde: h=0xde; break;
                                case 0xbe: h=0xbe; break;
                                case 0x7e: h=0x7e; break;
                        }
                                while(temp!=0xf0)  //等待松手
                                {
                                temp=PC;
                                temp=temp&0xf0;
                                }        
                }
        }
                                PC=0xfd;        //扫描第2行按键        
                                temp=PC;        //送第2个的扫描码
                                if(temp&0xf0)
        {
                                ys(10);
                                temp=PC;
                                if(temp&0xf0)
                {
                                temp=PC;   //重新读取PC口
                                switch(temp)
                        {
                                case 0xed: h=0xed; break;
                                case 0xdd: h=0xdd; break;
                                case 0xbd: h=0xbd; break;
                                case 0x7d: h=0x7d; break;
                        }
                                while(temp!=0xf0) //等待松手
                                {
                                temp=PC;
                                temp=temp&0xf0;
                                }        
                }
        }
                                PC=0xfb;         //扫描第3行按键       
                                temp=PC;        //送第3个的扫描码
                                if(temp&0xf0)
        {
                                ys(10);
                                temp=PC;
                                if(temp&0xf0)
                {
                                temp=PC;   //重新读取PC口
                                switch(temp)
                        {
                                case 0xeb: h=0xeb; break;
                                case 0xdb: h=0xdb; break;
                                case 0xbb: h=0xbb; break;
                                case 0x7b: h=0x7b; break;
                        }
                                while(temp!=0xf0) //等待松手
                                {
                                temp=PC;
                                temp=temp&0xf0;
                                }        
                }
        }
                                PC=0xf7; //扫描第4行按键       
                                temp=PC; //送第4个的扫描码
                                if(temp&0xf0)
                {
                                ys(10);
                                temp=PC;
                                if(temp&0xf0)
                                        {
                                temp=PC;   //重新读取PC口
                                switch(temp)
                                        {
                                case 0xe7: h=0xe7; break;
                                case 0xd7: h=0xd7; break;
                                case 0xb7: h=0xb7; break;
                                case 0x77: h=0x77; break;
                        }
                                while(temp!=0xf0) //等待松手
                        {
                                temp=PC;
                                temp=temp&0xf0;
                        }        
                }
        }
                                return h;        //返回按键值
}
void main(){         
                        ys(3000); //等待8255复位完成
                        PE=0x88;
                        while(1)
        {
                        jp();
                        P2=h; 
        }
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2025-10-31 17:10

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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