单片机 & 4×4矩阵键盘 & 4位串行595数码管显示

 1 #include ? <reg52.h>
 2 #define uchar unsigned char
 3 #define uint unsigned int
 4 //Led数码管数
 5 sbit DIO = P2^0;//串行数据输入
 6 sbit LRCLK = P2^1;//时钟脉冲信号——上升沿有效
 7 sbit LSCLK = P2^2;//打入信号————上升沿有效
 8 unsigned char code LED_0F[] =
 9 {// 0 1 2 34 5 6 78 9 A bC d E F -
10 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
11 };
12 uchar scan_keyboard(void); // 扫描键盘
13 void delay_ms(int n); //毫秒级延时函数
14 void get_LED(uchar key); //获得LED对应的数组值
15 void LED_ON(uchar x); //点亮led数码管
16 void main()
17 {
18 while(1){
19 uchar key = scan_keyboard();
20 get_LED(key);
21 }
22 }
23 void delay_ms(int n)
24 {
25 int i = 0, j = 0;
26 for(i = 0; i < n; i++)
27 for(j = 0; j < 100; j++);
28 }
29 void LED_ON(uchar lcode)
30 {
31 uint i;
32 for(i = 8;i >= 1; i--)
33 {
34 if (lcode & 0x80)
35 DIO = 1;
36 else
37 DIO = 0;
38 lcode <<= 1;
39 LSCLK = 0;
40 LSCLK = 1;
41 }
42 }
43 void LED_code(uchar value)
44 {
45 uchar code *led_table; // 查表指针
46 uchar lcode; //要得到的显示码
47 //显示第1位
48 led_table = LED_0F + value;
49 lcode = *led_table;
50 LED_ON(lcode);
51 LED_ON(0x01);
52 LRCLK = 0;
53 LRCLK = 1;
54 //显示第2位
55 }
56 void get_LED(uchar key)
57 {
58 if(key == 0x00)
59 return; //如果为0x00,说明没有扫描到值,返回
60 switch(key)
61 {
62 case 0xee: LED_code(0);break;//0按下相应的键显示相对应的码值
63 case 0xde: LED_code(1);break;//1 按下相应的键显示相对应的码值
64 case 0xbe: LED_code(2);break;//2
65 case 0x7e: LED_code(3);break;//3
66 case 0xed: LED_code(4);break;//4
67 case 0xdd: LED_code(5);break;//5
68 case 0xbd: LED_code(6);break;//6
69 case 0x7d: LED_code(7);break;//7
70 case 0xeb: LED_code(8);break;//8
71 case 0xdb: LED_code(9);break;//9
72 case 0xbb: LED_code(10);break;//a
73 case 0x7b: LED_code(11);break;//b
74 case 0xe7: LED_code(12);break;//c
75 case 0xd7: LED_code(13);break;//d
76 case 0xb7: LED_code(14);break;//e
77 case 0x77: LED_code(15);break;//f
78 }
79 }
80 uchar scan_keyboard()
81 {
82 uchar row_wire, col_wire; //定义行线和列线,行线0-3,列线4-7
83 P1 = 0xf0; //行线输出全为0,列线输出全为1
84 col_wire = P1 & 0xf0; //读入列线值
85 if(col_wire != 0xf0)
86 {
87 delay_ms(1); //去抖延时
88 if(col_wire != 0xf0)
89 {
90 col_wire = P1 & 0xf0; //读入列线值
91 P1 = col_wire | 0x0f; //输出当前列线值
92 row_wire = P1 & 0x0f; //读入行线值
93 return(col_wire + row_wire);//键盘最后组合码值
94 }
95 }
96 return 0x00;
97 } 
时间: 2024-11-18 05:30:33

单片机 & 4×4矩阵键盘 & 4位串行595数码管显示的相关文章

单片机入门-矩阵键盘控制数码管显示

任务简述:通过按下4X4矩阵键盘实现数码管对应显示数字 实现方式:通过行列分接法,可以节省使用单片机的I/O口,扫描矩阵键盘是否有按下,判断P2端口得到的值. protues 硬件系统 单片机晶振复位电路: 锁存器.上拉电阻: 4x4矩阵键盘: 代码实现: void key44scan(void)//键盘扫描函数 { uint t; P2=0xfe; t=P2; t=t&0xf0; if(t!=0xf0) { delay(); t=P2; switch(t) { case 0xee:keynum

AVR单片机教程——矩阵键盘

本文隶属于AVR单片机教程系列. ? 开发板上有4个按键,我们可以把每一个按键连接到一个单片机引脚上,来实现按键状态的检测.但是常见的键盘有104键,是每一个键分别连接到一个引脚上的吗?我没有考证过,但我们确实有节省引脚的方法. 矩阵键盘 这是一个4*4的矩阵键盘,共有16个按键只需要8个引脚就可以驱动.我们先来看看它的原理. 每个按键有两个引脚,当按键按下时接通.每一行的一个引脚接在一起,分别连接到左边4个端口,称为"行引脚":每一列的另一个引脚接在一起,分别连接到右边的4个端口,称

51单片机实现矩阵键盘行扫描

-------------------------------------------- 分类: 按结构原理分: 触点式开关按键 无触点开关按键 接入方式 独立式按键 矩阵式键盘 -------------------------------------------- 矩阵式键盘识别方法(行扫描法) 检测列线的状态: 列线Y4~Y7置高电平,行线Y0~Y3置低电平.只要有一列的电平为低,则表示键盘该列有一个或多个按键被按下.若所有列线全为高电平,则键盘中无按键按下. 判断闭合按键所在的位置: 行

51、52单片机使用矩阵键盘

为了学习矩阵键盘,先做个小小的实验目标 : 按下矩阵键盘后 ,数码管显示按下的是第几键. 我的矩阵键盘是4X4的,操作原理是先检测按下的键是哪行.再确定是哪列.这样就能识别是按的哪个键了. 首先看电路图,确定键盘是连CPU的哪个针.我的开发板上是连接的P1,具体是P10~P17,八个针对应逻辑的8位. (此处省略,直接贴代码) #include<reg52.h>void delay(int n);void juzhen(void); char duanxuan[16]={0x3f,0x06,0

基于小脚丫的ADC081S101 电压采集595数码管显示

RTL结构图 采集模块运用SPI 通讯 MISO方式收集数据 module ad_collect(input sddata,input rst_n,output reg cs,output reg sclk,input clk,output [7:0]seg_data,output done); reg [7:0]cnt;reg[4:0]state;reg[7:0]data;reg rdone; [email protected](posedge clk or negedge rst_n ) b

单片机与控制实验(1)——数码管显示

一.实验目的和要求 初步学习和掌握MCS-51的体系结构和汇编语言,了解Keil编程环境和程序下载工具的使用方法.了解数码管输出的原理及编程方式. 二.实验设备 单片机测控实验系统 STC-ISP程序下载工具 Keil开发环境 三.实验内容 使用MCS-51汇编语言编写程序,完成如下功能: 1. 使用三个数码管显示十进制数值(001~999,可任意设置): 2. 每隔1秒,该数值自动减一,直到归零; 3. 归零后的下一秒,显示一个新的十进制数值(001~999,可任意设置): 4. 每隔1秒,新

51单片机的数码管和矩阵键盘

使用4*4的矩阵键盘和一个数码管 在4*4的矩阵键盘上编码0-F的字符,和一个数码管显示每个键盘上输入的字符. //4*4键盘检测程序,按下键后相应的代码显示在数码管上 #include<reg51.h> typedef unsigned char UINT8; UINT8 i=100; UINT8 j,k,temp,key; void delay(unsigned char i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } UINT8 cod

十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)

1.键盘的分类 编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘 非编码键盘:靠软件编程来识别的称为非编码键盘.独立键盘.矩阵键盘 2.按键消抖              如图,理想波形与实现波形之间是有区别的.实际波形在按下和释放的瞬间都有抖动现象,抖动事件的长短与按键的机械特性有关,一般为5~10ms.通常我们手动按下键然后立即释放,这个动作中稳定闭合时间超过20ms.因此检测键盘是否按下时,需加上去抖动操作. 一般有两种消抖方式: 硬件消

矩阵键盘 数码管

开始时数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0~F,6个数码管同时静态显示. 数码管和矩阵键盘 首先关闭所有的数码管的段选不让数码管显示任何数字,然后位选中所有的数码管,接下来只需要选中所有的数码管,以后的操作的只需要送段选数据就行了,接着进入while()大循环不停的扫描键盘是否有被按下 #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wel