標(biāo)題: 關(guān)于天祥單片機開發(fā)板接口沖突問題 [打印本頁]

作者: 879139909    時間: 2019-2-19 22:01
標(biāo)題: 關(guān)于天祥單片機開發(fā)板接口沖突問題
想用郭天祥的tx-1c開發(fā)板做矩陣鍵盤輸入數(shù)字+lcd1602的顯示,但發(fā)現(xiàn)P3.4和P3.5口是共用的,P3.5的lcdrs不是問題,但P3.4的lcden是使能端,鍵盤掃描的時候按下的按鍵如果在P3.4這一欄下的話會讓液晶屏直接寫入數(shù)據(jù),想問一下這個該如何解決?最好是通過編程的技巧來解決,謝謝!

作者: wc86110    時間: 2019-2-20 04:42
開發(fā)板和程序是配套的,需要的只是設(shè)置好板上的端口
作者: wulin    時間: 2019-2-20 14:53
TX-1C開發(fā)板由于LCD1602占用了P3.4和P3.5口,導(dǎo)致板子上4*4矩陣鍵盤與LCD1602不能同時使用。板子上也沒有可供選擇的跳線。就現(xiàn)有硬件結(jié)構(gòu)想通過編程技巧完成兩者共用達不到理想的顯示效果(也許給P0賦一個無效值會改善)。如果改寫成2*4矩陣鍵盤與LCD1602共用則沒有任何問題。
作者: Mr.Zd    時間: 2019-2-20 15:10
你是自己改程序的話,可以先不用4*4的鍵盤,3*4也可以的,你是簡單的顯示驗證,你驗證好之后想做個計算器什么的,可以再重新畫板,去做一個真正的實物。
作者: wulin    時間: 2019-2-20 18:04
寫一個適合TX-1C開發(fā)板電路的2*4矩陣鍵盤+LCD1602示例程序給你參考,仿真電路圖與TX-1C開發(fā)板相關(guān)電路相同。



#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS=P3^5;        //液晶屏RS口  寫指令低,寫數(shù)據(jù)高
sbit LCD_EN=P3^4;        //液晶屏EN口  高脈沖使能寫指令/數(shù)據(jù),低跳變執(zhí)行
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;        //按鍵操作標(biāo)志
/*******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矩陣端口數(shù)據(jù)
{
        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矩陣端口數(shù)據(jù)
{
        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;        //初始設(shè)置LCD_EN低電平
        LCD_RS=0;        //允許寫指令
        P0=com;                //傳遞指令
        delay(10);        //延時1ms
        LCD_EN=1;        //使能寫入
        delay(10);        //延時1ms
        LCD_EN=0;        //低跳變執(zhí)行       
}
/*******液晶寫數(shù)據(jù)程序********/
void write_date(uchar date)
{
//        LCD_EN=0;        //初始設(shè)置LCD_EN低電平
        LCD_RS=1;        //允許寫數(shù)據(jù)
        P0 =date;        //傳遞數(shù)據(jù)
        delay(10);        //延時1ms
        LCD_EN=1;        //使能寫入
        delay(10);        //延時1ms
        LCD_EN=0;        //低跳變執(zhí)行
       
}
/*******液晶初始化程序********/
void init()                //設(shè)置顯示模式、
{
        write_com(0x38);//設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口
        write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
        write_com(0x0c);//設(shè)置開顯示,不顯光標(biāo)
        write_com(0x06);//設(shè)置寫一個字符后地址指針加1
}

void keyscan()                                        //按鍵掃描程序
{
        static bit sign=0;                        //按鍵自鎖標(biāo)志
        static uint count=0;                //消抖計數(shù)變量                       
        uchar num=0;                                //臨時變量
        PX(0x30);                                        //先給矩陣端口賦一個初值0011 0000
        if(PD()!=0x30)                                //檢測有按鍵按下
        {
                if((++count>=500)&&(sign==0))//100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
                {                       
                        sign=1;                                //按鍵自鎖標(biāo)志置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;                        //按鍵操作標(biāo)志置1
                }
        }
        else                                                //鍵抬起
        {
                sign=0;                                //按鍵自鎖標(biāo)志清0
                count=0;                                //消抖計數(shù)清0
        }
}
/**********************主程序*************************/
void main()
{
        init();                                                //初始化LCD程序
        write_com(0x80);                        //數(shù)據(jù)指針第一行起始0x80位置
        write_date(key+'0');                //寫一個字節(jié)數(shù)據(jù)       
        while(1)
        {
                keyscan();                                //2*4矩陣鍵盤掃描
                if(flag==1)                                //按鍵操作標(biāo)志1刷新LCD
                {
                        flag=0;                                //按鍵操作標(biāo)志清0
                        write_com(0x80);                //數(shù)據(jù)指針第一行起始0x80位
                        write_date(key+'0');        //寫一個字節(jié)數(shù)據(jù)                               
                }
        }
}







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1