找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2229|回复: 4
打印 上一主题 下一主题
收起左侧

关于天祥单片机开发板接口冲突问题

[复制链接]
回帖奖励 15 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
想用郭天祥的tx-1c开发板做矩阵键盘输入数字+lcd1602的显示,但发现P3.4和P3.5口是共用的,P3.5的lcdrs不是问题,但P3.4的lcden是使能端,键盘扫描的时候按下的按键如果在P3.4这一栏下的话会让液晶屏直接写入数据,想问一下这个该如何解决?最好是通过编程的技巧来解决,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2019-2-20 04:42 | 只看该作者
开发板和程序是配套的,需要的只是设置好板上的端口
回复

使用道具 举报

板凳
ID:213173 发表于 2019-2-20 14:53 | 只看该作者
TX-1C开发板由于LCD1602占用了P3.4和P3.5口,导致板子上4*4矩阵键盘与LCD1602不能同时使用。板子上也没有可供选择的跳线。就现有硬件结构想通过编程技巧完成两者共用达不到理想的显示效果(也许给P0赋一个无效值会改善)。如果改写成2*4矩阵键盘与LCD1602共用则没有任何问题。
回复

使用道具 举报

地板
ID:463518 发表于 2019-2-20 15:10 | 只看该作者
你是自己改程序的话,可以先不用4*4的键盘,3*4也可以的,你是简单的显示验证,你验证好之后想做个计算器什么的,可以再重新画板,去做一个真正的实物。

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:213173 发表于 2019-2-20 18:04 | 只看该作者
写一个适合TX-1C开发板电路的2*4矩阵键盘+LCD1602示例程序给你参考,仿真电路图与TX-1C开发板相关电路相同。



#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS=P3^5;        //液晶屏RS口  写指令低,写数据高
sbit LCD_EN=P3^4;        //液晶屏EN口  高脉冲使能写指令/数据,低跳变执行
sbit code0=P3^0;        //2*4矩阵端口
sbit code1=P3^1;
sbit code2=P3^2;
sbit code3=P3^3;
sbit code4=P3^6;
sbit code5=P3^7;

uchar key=0;//定义键值全局变量
bit flag=0;        //按键操作标志
/*******100us延时程序********/
void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=10;b>0;b--);
}

void PX(uchar i)//写入2*4矩阵端口数据
{
        code0=i&0x01;i>>=1;       
        code1=i&0x01;i>>=1;
        code2=i&0x01;i>>=1;
        code3=i&0x01;i>>=1;
        code4=i&0x01;i>>=1;
        code5=i&0x01;
}

uchar PD()                //读取2*4矩阵端口数据
{
        uchar i;
        i=code5;
        i=(i<<1)|code4;
        i=(i<<1)|code3;
        i=(i<<1)|code2;
        i=(i<<1)|code1;
        i=(i<<1)|code0;
        return i;
}
/*******液晶写指令程序********/
void write_com(uchar com)
{
        LCD_EN=0;        //初始设置LCD_EN低电平
        LCD_RS=0;        //允许写指令
        P0=com;                //传递指令
        delay(10);        //延时1ms
        LCD_EN=1;        //使能写入
        delay(10);        //延时1ms
        LCD_EN=0;        //低跳变执行       
}
/*******液晶写数据程序********/
void write_date(uchar date)
{
//        LCD_EN=0;        //初始设置LCD_EN低电平
        LCD_RS=1;        //允许写数据
        P0 =date;        //传递数据
        delay(10);        //延时1ms
        LCD_EN=1;        //使能写入
        delay(10);        //延时1ms
        LCD_EN=0;        //低跳变执行
       
}
/*******液晶初始化程序********/
void init()                //设置显示模式、
{
        write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
        write_com(0x01);//显示清零,数据指针清零
        write_com(0x0c);//设置开显示,不显光标
        write_com(0x06);//设置写一个字符后地址指针加1
}

void keyscan()                                        //按键扫描程序
{
        static bit sign=0;                        //按键自锁标志
        static uint count=0;                //消抖计数变量                       
        uchar num=0;                                //临时变量
        PX(0x30);                                        //先给矩阵端口赋一个初值0011 0000
        if(PD()!=0x30)                                //检测有按键按下
        {
                if((++count>=500)&&(sign==0))//100~1000,根据主循环周期调整约10~20ms
                {                       
                        sign=1;                                //按键自锁标志置1
                        num=PD();                        //保存PD高2位00xx 0000,x为0或1
                        PX(num|0x0f);                //再给矩阵端口赋一个值00xx 1111
                        num=PD();                        //保存PD()值  00xx xxxx
                        switch(num)
                        {
                                case 0x2e: key= 1; break;
                                case 0x2d: key= 2; break;
                                case 0x2b: key= 3; break;
                                case 0x27: key= 4; break;
                                case 0x1e: key= 5; break;
                                case 0x1d: key= 6; break;
                                case 0x1b: key= 7; break;
                                case 0x17: key= 8; break;
                        }
                        flag=1;                        //按键操作标志置1
                }
        }
        else                                                //键抬起
        {
                sign=0;                                //按键自锁标志清0
                count=0;                                //消抖计数清0
        }
}
/**********************主程序*************************/
void main()
{
        init();                                                //初始化LCD程序
        write_com(0x80);                        //数据指针第一行起始0x80位置
        write_date(key+'0');                //写一个字节数据       
        while(1)
        {
                keyscan();                                //2*4矩阵键盘扫描
                if(flag==1)                                //按键操作标志1刷新LCD
                {
                        flag=0;                                //按键操作标志清0
                        write_com(0x80);                //数据指针第一行起始0x80位
                        write_date(key+'0');        //写一个字节数据                               
                }
        }
}


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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