51单片机4x4矩阵键盘扫描+数码管显示
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机4x4矩阵键盘扫描+数码管显示相关的知识,希望对你有一定的参考价值。
51单片机4x4矩阵键盘扫描+数码管显示(二)
- 演示效果
- 材料:
AT89C52
、2位数码管
、74HC595
、 - Proteus仿真
- 《先列后行扫描法》
方法二:先列后行扫描法
实例代码
#include<reg52.h>
#include "intrins.h"
sbit ST=P2^0;//定义74HC595移位寄存器
sbit SH=P2^2;
sbit DS=P2^1;
sbit P25=P2^5;//数码管十位显示
sbit P26=P2^6;//数码管个位显示
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define temp P1 //定义按键I/O口
u8 smgduan[]= {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//共阳数码管段码
u8 duanZhi[]= {0,0};//数码管显示位数的数值数组
u8 gewei, shiwei;
u8 num=0;
void SendTo595(u8 byteData);
u8 keyscan();
void display(u8 date);
void delay(int s)
{
u16 i,j;
for(i=0; i<s; i++) //延时函数
for(j=114; j>0; j--);
}
void main()
{
while(1)
{
display(keyscan());
}
}
/***********************************************************
*函数名 :SendTo595
*功能 :串行发送8个比特(一个字节)的数据给595,再并行输出
*参数 :byteData
************************************************************/
void SendTo595(u8 byteData)
{
char i=0;
// P2=duanMa[n];
ST = 0; //ST //先拉低,为后面的上升沿做准备
for(i; i<8; i++)
{
// SH = 0;//先拉低,
if(byteData&0x80)DS=1;
else DS=0;
// DS = (byteData&0x80)?1:0;
byteData = byteData <<1; //该字节右移一位
SH = 1;
_nop_();
_nop_();
SH = 0; //上升沿,让串行输入时钟变为高电平,并延时2个时钟周期
}
/*位移寄存器数据准备完毕,转移到存储寄存器*/
ST =1;//上升沿,让存储寄存器时钟变为高电平,并延时2个时钟周期
_nop_();
_nop_();
// ST = 0;
}
void display(u8 date)
{
gewei = date%10;
shiwei = date/10;
duanZhi[0]=smgduan[shiwei];
duanZhi[1]=smgduan[gewei];
P25=0x01;//十位显示
P26=0x00;
SendTo595(duanZhi[0]); //十位显示
delay(6);
P25=0x00;//个位显示
P26=0x01;
SendTo595(duanZhi[1]);//个位显示。
delay(53);
//消隐
//P2=0X00;
P25=0x00;
P26=0x00;
}
u8 keyscan()
{
// u8 num;
temp=0x0f;
// if(temp!=0x0f)
// {
// delay_ms(5);
if(temp!=0x0f)
{
temp=0x0f; //先确定列
switch(temp)
{
case 0x07: num=1; break;
case 0x0b: num=2; break;
case 0x0d: num=3; break;
case 0x0e: num=4; break;
}
temp=0xf0; //再确定行
switch(temp)
{
case 0x70: num=num+0; break;
case 0xb0: num=num+4; break;
case 0xd0: num=num+8; break;
case 0xe0: num=num+12; break;
}
return num;
}
// }
return num;
}
以上是关于51单片机4x4矩阵键盘扫描+数码管显示的主要内容,如果未能解决你的问题,请参考以下文章
Proteus仿真51单片机4x4矩阵键盘扫描lcd1602显示