找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2420|回复: 3
收起左侧

51单片机矩阵键盘程序语句调试问题

[复制链接]
ID:477073 发表于 2019-2-24 12:01 | 显示全部楼层 |阅读模式
这个矩阵键盘的,怎么改变刚打开单片机还没有按键时数码管显示的符号,加上图二这三句 没有改变显示的字符,求大佬指教


QQ图片20190224115743.jpg
QQ图片20190224115804.jpg
回复

使用道具 举报

ID:213173 发表于 2019-2-24 16:28 | 显示全部楼层


/*************        IO口定义        **************/
sbit        P_HC595_SER   = P2^5;        //SER                data input
sbit        P_HC595_RCLK  = P2^6;        //RCLk        store (latch) clock
sbit        P_HC595_SRCLK = P2^7;        //SRCLK        Shift data clock

unsigned char 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,
//  不显   -   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,
//    0.  1.   2.   3.   4.   5.   6.   7.   8.   9.   -1
        0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};

unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位码

/**************** 向HC595发送一个字节函数 ******************/

void Send_595(u8 dat)
{               
        u8        i;
        for(i=0; i<8; i++)
        {
                dat <<= 1;
                P_HC595_SER   = CY;
                P_HC595_SRCLK = 1;
                P_HC595_SRCLK = 0;
        }
}
/********************** 显示扫描函数 ************************/

void DisplayScan(void)
{       
        Send_595(~LED_TYPE ^ T_COM[display_index]);        //输出位码
        Send_595( LED_TYPE ^ t_display[LED8[display_index]]);        //输出段码

        P_HC595_RCLK = 1;
        P_HC595_RCLK = 0;                                                        //锁存输出数据
        if(++display_index >= 8)       
                display_index = 0;        //8位结束回0
}




回复

使用道具 举报

ID:213173 发表于 2019-2-24 20:05 | 显示全部楼层

无标题1.jpg
初始显示字母示例程序
#include <reg52.h>
#define uint unsigned int                 //宏定义无符号整型数据
#define uchar unsigned char         //宏定义无符号字符型数据

sbit        P_HC595_SER   = P2^0;
sbit        P_HC595_SRCLK = P2^1;
sbit        P_HC595_RCLK  = P2^2;

uchar  code table[]={//共阴数码管段码"0~H"
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
// A    B    C    D    E    F    G    H
   0x77,0x7C,0x39,0x5E,0x79,0x71,0x3d,0x76};

uchar code dis_buf[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码
uchar buf[8];

uchar key=0;                                        //定义键值全局变量

void keyscan()                                        //按键扫描程序
{
        static bit sign=0;                        //按键有效标志
        static uint count=0;                //消抖计数变量                       
        uchar num=0;                                //临时变量
        P3=0xf0;                                        //赋值P3 1111 0000
        if(P3!=0xf0)                                //检测有按键按下
        {
                count++;                                //消抖计数
                if((count>=500)&&(sign==0))//100~1000,根据主循环周期调整约10~20ms
                {                       
                        sign=1;                                //按键有效标志置1
                        num=P3;                                //保存P3值xxxx 0000,x为0或1
                        num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
                        P3=num;                                //赋值P3 xxxx 1111
                        num=P3;                                //保存P3值xxxx xxxx
                        switch(num)
                        {
                                case 0xee: key= 1; break;
                                case 0xde: key= 2; break;
                                case 0xbe: key= 3; break;
                                case 0x7e: key= 4; break;
                                case 0xed: key= 5; break;
                                case 0xdd: key= 6; break;
                                case 0xbd: key= 7; break;
                                case 0x7d: key= 8; break;
                                case 0xeb: key= 9; break;
                                case 0xdb: key=10; break;
                                case 0xbb: key=11; break;
                                case 0x7b: key=12; break;
                                case 0xe7: key=13; break;
                                case 0xd7: key=14; break;
                                case 0xb7: key=15; break;
                                case 0x77: key=16; break;
                        }
                }
        }
        else                                                //键抬起
        {
                sign=0;                                        //按键有效标志清0
                count=0;                                //消抖计数清0
        }
}
/**************** 向HC595发送一个字节函数 ******************/
void Send_595(uchar dat)
{               
        uchar i;
        for(i=0;i<8;i++)
        {
                dat <<= 1;
                P_HC595_SER  = CY; //溢出位赋值数据输出端
                P_HC595_SRCLK = 1; //移位时钟
                P_HC595_SRCLK = 0;
        }
}
/**************** 向HC595发送2个字节函数 ******************/
void DisplayScan()
{       
        static uchar j;
        Send_595(dis_buf[j]);//向HC595发送位码
        Send_595(table[buf[j]]);//向HC595发送段码
        P_HC595_RCLK = 1;//锁存输出数据
        P_HC595_RCLK = 0;
        if(++j==8)
                j=0;
}

void main()                                                //主函数
{
        uchar i;
        P_HC595_SRCLK = 0;//初始化移位时钟端
        P_HC595_RCLK  = 0;//初始化锁存输出端
        while(1)
        {
                keyscan();                                //按键扫描程序
                if(key==0)
                {
                        buf[0]=10;
                        buf[1]=11;
                        buf[2]=12;
                        buf[3]=13;
                        buf[4]=14;
                        buf[5]=15;
                        buf[6]=16;
                        buf[7]=17;
                }
                else
                {
                        buf[0]=0;
                        buf[1]=0;
                        buf[2]=0;
                        buf[3]=0;
                        buf[4]=0;
                        buf[5]=0;
                        buf[6]=key/10;
                        buf[7]=key%10;
                }
                if(++i>=100)
                {
                        i=0;
                        DisplayScan();                //发送2个字节
                }
        }
}



无标题1.jpg
回复

使用道具 举报

ID:213173 发表于 2019-2-25 07:50 | 显示全部楼层
无标题.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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