矩阵键盘状态机之74HC164驱动数码管依次显示键值_第1页
矩阵键盘状态机之74HC164驱动数码管依次显示键值_第2页
矩阵键盘状态机之74HC164驱动数码管依次显示键值_第3页
矩阵键盘状态机之74HC164驱动数码管依次显示键值_第4页
矩阵键盘状态机之74HC164驱动数码管依次显示键值_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用视图Web模式看uchar code smg_duan=/数码管(共阴)编码0-F,全灭; 按键对应的数字不是上图,而是-这里下面的 /用IO口P0,所以把A B C D E F G DP分别接到P00 P01 P02 P03 P04 P05 P06PO7 所以编码如下 - -|-1-|-2-|-3-|- -|-4-|-5-|-6-|-0X3f,0X06,0X5B,0X4f,0X66,0X6D,0X7D,0x07,0x7f,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00 -|-7-|-8-|-9-|-/可以把0x71或任意一个改为0x00,这样就可以按下0x7

2、1这个案件时清楚显示了 -|-C-|-0-|-E-|-/*0xfC,0x0C,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00/多写了0x00,代表段选全部熄灭*/;0X3f,0X06,0X5B,0X4f,0X66,0X6D,0X7D,0x07,0x7f,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00/可以把0x71或任意一个改为0x00,这样就可以按下0x71这个案件时清楚显示了完整程序如下:/*= * 开发人员:laowang * 当前版本:V1.0 * 创建

3、时间:11/26/2013 * 修改时间:04/21/2017 * 功能说明:对4*3矩阵键盘扫描,用4位共阴数码管进行显示,刚开始时不亮,依次按下按键时 数码管依次显示0-F,扫描方法为状态机方法+定时器中断 * 修改人员:梁超云 *=*/#include<reg52.h>#include"Define.h"#include"display.h"#include"matrixkeyscan.h"#include "74HC164.h"void Timer0_init();/定时器初始化函数uint f

4、lag1=0;uint flag=0; /按键扫描标志,每中断一次,扫描一次bit power_on=1;/主函数void main() uchar key_state=0;uchar readkey;readkey=0xff;Timer0_init();Display_init();/使之不亮while(1) if(flag=1) flag=0;flag1+;if(flag1>=4)flag1=0;readkey=Keyscan();if (power_on=0)power_on=1;num2+;if(num2>=4)num2=0;DisplayBUFF(readkey);Dis

5、play(); void Timer0() interrupt 1 /TH0=0xD8; /10Ms产生一次中断/TL0=0xF0;/TH0=0xB1; /20Ms产生一次中断/ TL0=0xE0;/TH0=0xec; /5Ms产生一次中断/ TL0=0x78;TH0=0x63; /40Ms产生一次中断 TL0=0xc0; flag+;void Timer0_init()/TH0=0xD8; /12MHz-10Ms产生一次中断/ TL0=0xF0;/TH0=0xB1; /20Ms产生一次中断/ TL0=0xE0;/TH0=0xec; /5Ms产生一次中断/ TL0=0x78;TH0=0x63;

6、 /40Ms产生一次中断 TL0=0xc0;EA=1;ET0=1; TR0=1;/*=硬件电路= *说明:数码管为共阴数码管,驱动方式为74hc164 扫描方式为动态扫描 *=*/梁超云改为P0.0-P0.7直接数码管的A-H,P2接数码管位选#include<reg52.h>#include"Define.h"/把常用的宏定义写成了头文件,包含进来#include"display.h"#include "74HC164.h"#include"matrixkeyscan.h"uchar segbuff4

7、; uchar num2=0;/sbit wela=P35;/位选/sbit dula=P34;/段选uchar code smg_duan=/数码管(共阴)编码0-F,全灭; /用IO口P0,所以把A B C D E F G GP分别接到P00 P01 P02 P03 P04 P05 P06PO7 所以编码如下0X3f,0X06,0X5B,0X4f,0X66,0X6D,0X7D,0x07,0x7f,0x6F,0x77,0x7C,0x39,0x5E,/*0x79*/0x00,0x71,0X00 /用IO口P0,所以把A B C D E F G GP分别接到P07 P06 P05 P04 P03

8、 P02 P01 PO0 所以编码如下/可以把0x79或任意一个改为0x00,这样就可以按下0x79这个案件时清楚显示了/0xfC,0x0C,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,/*0x9E*/0X00,0x8E,0x00/多写了0x00,代表段选全部熄灭;/uchar code smg_wei=0xfe,0xfd,0xfB,0xf7;/数据向左移动。要右移的话就uchar code smg_wei=0xf7,0xfB,0xfd,0xfe;/*= *函数名称:Display_init() *功 能:对数码管进行

9、初始化操作 *入口参数: *出口参数:void *说 明:刚上电时,所有的数码管均不显示 *=*/void Display_init()P1=0x00; /将所有的位选关闭,所有数码管不亮,/wela=1;/wela=0;P2=0xff; /将段选关闭。/dula=1; /dula=0;void Display()sendbyte(segbuffflag1%4);P2=smg_wei(flag1-1)%4;/保证每次都从左边开始亮,其实是看数码管硬件怎么排位置的/P2=smg_wei(flag1+3)%4;/*= *函数名称:Display(uchar) *功 能:数码管静态扫描 *入口参数:

10、 *出口参数:void *说 明:进行段选的显示。因为位选在刚开始的时候已经弄好了 *=*/void DisplayBUFF(uchar num1)/更新显存 uchar i,x;/wela=1;i=num2%4;/四位数码管所以%4,6位%6,8位%8,以此类推segbuffi=smg_duannum1;x=smg_duannum1;if(x=0x00)segbuff0=0x00;segbuff1=0x00;segbuff2=0x00;segbuff3=0x00;num2=0;flag1=0;/清空缓存/sendbyte(segbuffi);/wela=0;/dula=1;/dula=0;/

11、*=硬件电路= * *说明:矩阵键盘为4*4,数据口为P0,行线为P0.0-P0.3,列线为P0.4-P0.720170418梁超云改为P0口,显示字形码接在P1,位在P2 *=*/#include<reg52.h>#include"Define.h"#include"matrixkeyscan.h"#define key P0/矩阵键盘的数据口#define no_key 0xff /无按键按下#define key_state0 0 /状态0,此时无按键按下#define key_state1 1 /状态1,此时处于确定按键是否按下#de

12、fine key_state2 2 /状态2,此时判断按键是否释放/*= *函数名称:Keyscan() *功 能:对矩阵键盘进行扫描,扫描方式为状态机+定时器中断 *入口参数: *出口参数:key_value,代表具体的键值 *说 明:有个缺陷,刚开始数码管就亮,还没找到是哪里出了问题(已解决) *=*/uchar Keyscan()uchar key_state; /状态指示static uchar key_value;/键值返回uchar key_temp; uchar key1,key2; uchar last_key_value;bit bit_release=0;/释放标志位 ke

13、y=0xf0;key1=key; key1=key&0xf0; /确定哪一行的按键按下 key=0x0f;key2=key; key2=key&0x0f; /确定哪一列的按键按下key_temp=key1|key2; /确定按键位置 switch(key_state) /检测当前状态 case key_state0:/之前无按键被按下 if(key_temp!=no_key)/说明有按键按下或者抖动 key_state=key_state1;/转换为状态1,然后去判断是否真的按下 break; case key_state1:/状态1,说明之前已经有按键按下或者抖动 if(ke

14、y_temp=no_key)/全为高电平,说明是抖动 key_state=key_state0;/返回到状态1, else/确实有按键被按下 switch(key_temp) /当确定按键按下后,列举所有的按键情况 case 0xee: key_value=1;break; case 0xde: key_value=2;break; case 0xbe: key_value=3;break; /case 0x7e: key_value=13;break; case 0xed: key_value=4;break; case 0xdd: key_value=5;break; case 0xbd:

15、 key_value=6;break; /case 0x7d: key_value=10;break; case 0xeb: key_value=7;break; case 0xdb: key_value=8;break; case 0xbb: key_value=9;break; /case 0x7b: key_value=11;break; case 0xe7: key_value=12;break; case 0xd7: key_value=0;break; case 0xb7: key_value=14;break; /case 0x77: key_value=15;break; de

16、fault: key_value=16;break; /* case 0xee: key_value=0;break; case 0xde: key_value=1;break; case 0xbe: key_value=2;break; case 0x7e: key_value=3;break; case 0xed: key_value=4;break; case 0xdd: key_value=5;break; case 0xbd: key_value=6;break; case 0x7d: key_value=7;break; case 0xeb: key_value=8;break;

17、case 0xdb: key_value=9;break; case 0xbb: key_value=10;break; case 0x7b: key_value=11;break; case 0xe7: key_value=12;break; case 0xd7: key_value=13;break; case 0xb7: key_value=14;break; case 0x77: key_value=15;break; default: key_value=16;break; */ key_state=key_state2;/跳到状态2,进而判断是否被释放 break; case ke

18、y_state2:/状态2,判断是否被释放 if(key_temp=no_key)/释放,转回到状态0 key_state=key_state0;bit_release=1; break; if(key_state=key_state0) last_key_value=key_value; if(bit_release) bit_release=0;/* bit_release 也就是释放标志位 */ power_on=0; /解决:有个缺陷,刚开始数码管就亮,还没找到是哪里出了问题 return key_value; else return last_key_value;/*= *74ls1

19、64为八位串行输入、并行输出的移位寄存器 * 开发人员:梁超云 * 当前版本:V1.0 * 创建时间:04/21/2017 * 修改时间: * 功能说明:74HC164驱动 *=*/#include "reg52.h"#include "Define.h"#include "74HC164.h"void sendbyte(uchar byte) /发送一个字节高位在前 uchar num,c;num=byte;for(c=0;c<8;c+)CLK=0;DAT=num&0x80;CLK=1;num<<=1; /

20、*void sendbyte(uchar byte) /发送一个字节低位在前 uchar num,c;num=byte;for(c=0;c<8;c+)CLK=0;DAT=num&0x01;CLK=1;num>>=1; */#ifndef _DISPLAY_H_ /头文件保护符#define _DISPLAY_H_ #include"Define.h"extern void Display_init();extern void DisplayBUFF(uchar num1);externuchar i,num2;extern uchar segbuf

21、f4;extern void Display();#endif#ifndef _MATRIXKEYSCAN_H_ /头文件保护符#define _MATRIXKEYSCAN_H_ #include"Define.h"extern uchar key_value;extern uchar last_key_value;extern uchar key_state;extern uchar Keyscan();extern bit power_on;#endif#ifndef _DEFINE_H_ /头文件保护符#define _DEFINE_H_ #define uchar

22、unsigned char/宏定义#define uint unsigned intextern uint flag1;extern uint flag;#endif/*-REG52.HHeader file for generic 80C52 and 80C32 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.-*/#ifndef _REG52_H_#define _REG52_H_/* BYTE Registers */sfr P0

23、 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF =

24、0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;/* BIT Registers */* PSW */sbit CY = PSW7;sbit AC = PSW6;sbit F0 = PSW5;sbit RS1 = PSW4;sbit RS0 = PSW3;sbit OV = PSW2;sbit P = PSW0; /8052 only/* TCON */sbit TF1 = TCON7;sbit TR1 = TCON6;sbit TF0 = TCON5;sbit TR0 = TCON4;sbit IE1 = TCON3;sbit IT1 = TCON2;sbit IE0 = TCON1;sbit IT0 = TCON0;/* IE */sbit EA = IE7;sbit ET2 = IE5; /8052 on

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论