单片机之矩阵键盘的驱动程序

发布者:JoyousJourney最新更新时间:2019-08-15 来源: eefocus关键字:单片机  矩阵键盘  驱动程序 手机看文章 扫描二维码
随时随地手机看文章


#include

 

#define KEYPORT P1

#include "./delay/delay.h"

 

sbit seg_select = P2^0;      //段选

sbit bit_select = P2^1;      //位选

#define SEGPORT  P0

 

 

unsigned char segdata[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char bitdata[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsigned char TempData[2];

 

void display(void)

{

  static unsigned char i = 0;

  SEGPORT = 0x0;              //消除重影

  seg_select = 1;

  seg_select = 0;

  

  SEGPORT = 0xff;

  bit_select = 1;

  bit_select = 0;

  SEGPORT = TempData[i];

  seg_select = 1;

  seg_select = 0;

  

  SEGPORT = bitdata[i];

  bit_select = 1;

  bit_select = 0;

  

    i++;

    if(2 == i)

    {

i = 0;

}

}

 

void timer0_init(void)                       //中断函数

{

EA = 1;                               //打开总中断

  TMOD |= 0x01;                        //设置定时器工作方式

  TH0 = (65536 - 2000) / 256;

  TL0 = (65536 - 2000) % 256;

  ET0 = 1;                           //打开定时器中断允许

  TR0 = 1;                           

}

 

void timer0_isr(void) interrupt 1    //中断服务程序

{

TH0 = (65536 - 2000) / 256;

  TL0 = (65536 - 2000) % 256;

  display();

  

}

 

 

unsigned char key_scan(void)

{

unsigned char keyvalue;

  KEYPORT = 0xf0;

  if(0xf0 != KEYPORT)                                // 有按键按下  

{

delay_ms(10);

  if(0xf0 != KEYPORT)                          //确实有按键按下

{

  //KEYPORT &= 0xfo;

KEYPORT = 0xfe;

  if(0xfe != KEYPORT)

{

keyvalue = KEYPORT;

  while(0xfe != KEYPORT);           //有按键抬起

delay_ms(10);

while(0xfe != KEYPORT);          //确实有按键抬起

return keyvalue;

}

KEYPORT = 0xfd;

if(0xfd != KEYPORT)

{

 

}

KEYPORT = 0xfb;

if(0xfb != KEYPORT)

{

 

}

KEYPORT = 0xf7;

if(0xf7 != KEYPORT)

{

 

}

}

}

return 0xff;

}

 

unsigned key_prc()

{

unsigned char keynum;

  keynum = key_scan();

  switch(keynum)

{

case 0x7e: return 0; break;

  case 0xbe: return 1; break;

  case 0xde: return 2; break;

  case 0xee: return 3; break;

  default: return 0xff; break;

}

}

 

void main()

{

unsigned char key;

timer0_init();

  while(1)

{

key = key_prc();

  if(0xff != key)

{

  TempData[0] = segdata[key / 16];

  TempData[1] = segdata[key % 16];

}

}

}

 

/*********delay.c*******/

void delay_us(unsigned char t)

{

while(--t);

}

 

void delay_ms(unsigned char t)

{

while(t--)

{

delay_us(245);

delay_us(245);

}

}

 

void delay_s(unsigned char t)

{

    while(t--)

{

        delay_ms(200);

delay_ms(200);

  delay_ms(200);

delay_ms(200);

  delay_ms(200);

}

}

 

/*******delay.h******/

#ifndef _DELAY_H_

#define _DELAY_H_

 

extern void delay_us(unsigned char t);

extern void delay_ms(unsigned char t);

extern void delay_s(unsigned char t);

 

#endif


关键字:单片机  矩阵键盘  驱动程序 引用地址:单片机之矩阵键盘的驱动程序

上一篇:单片机码表的驱动程序
下一篇:单片机之利用按键来使数码管上两位示数增加

推荐阅读最新更新时间:2024-11-16 23:01

电机转速信号的单片机测量程序
#include reg52.h #include absacc.h #include stdio.h #define uchar unsigned char #define uint unsigned int // 定义8253的寄存器地址 #define COM XBYTE // 定义8253的控制字寄存器地址 #define C0 XBYTE // 定义8253的计数器0寄存器地址 #define C0I XBYTE sbit P1_7=P1^7; uint BUF810; uchar h,l,a,b,c,sendflag,FREQ; //主函
[单片机]
STM32单片机电源端并联电容的重要性
如图,笔者用TQFP(32-100PIN)0.55MM转直插的转接板焊了一个STM32F207VET6的板子。板上引出了SWD调试接口(仅占用PA13和PA14),USART1串口引脚,插了一个触摸传感器和蜂鸣器模块。 所要实现的功能是:用手触碰一下触摸传感器后,蜂鸣器响一声。 接触摸传感器模块输出信号接到PA0口上。在没有接电源电容之前,每一次单片机复位(无论是软件复位还是按下复位键复位),PA0上会自动产生一个异常的高电平,要等上将近10秒才会回到低电平,然后触摸传感器才能正常工作。每次复位的时候蜂鸣器都会响一下,10秒之内按触摸键都没有反应。 后来我接了一个4.7μF的电解电容器和两个100nF的无极性电容器,问题就解决
[单片机]
ATmega 16 单片机的模拟比较器的相关寄存器(四)
1.SFIOR 特殊功能IO寄存器 ADTS2 ADTS1 ADTS0 ACME PUD PSR2 PSR10 位3 ACME:模拟比较器多路复用器使能 当此位为逻辑 1 ,且ADC处于关闭状态(ADCSRA寄存器的ADEN为 0 )时,ADC多路复用器为模拟比较器选择负极输入。当此位为 0 时,AIN1连接到比较器的负极输入端。 2.ACSR 模拟比较器控制和状态寄存器 ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0 位7 ACD:模拟比较器禁用 ACD置位时,模拟比较器的电源被切断。可以在任何时候设置此位来关掉模拟比较器。这可以减少
[单片机]
51单片机--仿真出租车计价器
这汇编的程序,编写的很复杂,实现的功能却还是很简陋。 在硬件方面,显示金额的位数也不足。 做而论道用 C 重新编写了一个程序,如下: #include reg52.h #include intrins.h #define BAITIAN 10 //白天价格/km #define YEJIAN 14 //夜间价格/km #define DENGREN 1 //停车等人价格/30s sbit QD = P3^4; sbit RY = P3^7; unsigned char danjia, jvli, n_X0, mode; unsigned int jinee, n_50ms; bit ye;
[单片机]
51<font color='red'>单片机</font>--仿真出租车计价器
用于单片机的以太网网关--网络通
    摘要: “网络通”是基于普通单片机的廉价以太网测控网关。它可以将具有RS-232、RS-485等接口的测控设备简单而且直接地连接在以太网(因特网)上,利用丰富的现成的以太网资源,组成一系列以太网的分布式测控系统。     关键词: 以太网分布式测控系统 以太网测控网关 网关 网络通 1 概 述   利用现有以太网(因特网)的丰富资源,组建以太网分布式测控系统是一种低成本、高可靠性、快捷的技术方案。组建以太网分布式测控系统的关键设备是以太网测控网关,而以太网测控网关的组成方式有以下三种。   第一种是在20世纪90年代中期,人们采用PC机+网卡+采集插卡组成以太网测控网关,进行协议转换,将由现场
[工业控制]
PC机与单片机串行通信设计方案
单片微型计算机简称单片机,它是将中央处理器(CPU)、存储器(RAM,ROM)、定时/计数器和各种接口电路都集成到一块集成电路芯片上的微型计算机。随着计算机技术尤其是单片机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、湿度等参数进行检测和控制。PC机具有强大的监控和管理功能,而单片机则具有快速及灵活的控制特点,通过PC机的RS 232串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。因此如何实现PC机与单片机之间的通信具有非常重要的现实意义。针对一些远距离控制或者是危险性比较高的数据采集和控制的应用情况,本文主要介绍一种用双工方式实现PC机与单片机之间的串行通信。 1 设计方案 为了通过
[单片机]
PC机与<font color='red'>单片机</font>串行通信设计方案
在STM8单片机中自己实现 printf()函数功能
  由于STM8单片机本身内存比较小,而系统自带的printf()函数又比较占据空间,所以在稍微大一点的工程中有时候一使用 printf() 函数就会导致单片机内存不足,于是想着能不能自己写一个比较小的函数来实现类似printf()函数的功能。经过网上查找资料和总结终于找到了一个占用内存比较小,又能实现串口打印功能的方法。   现在将自己的方法分享出来,这里使用 STM8S003F3P6单片机测试。   首先新建一个工程,专门用来测试串口功能。   串口部分相关代码如下: //串口 void Uart1_IO_Init( void ) { PD_DDR |= ( 1 5 ); //输出模式
[单片机]
在STM8<font color='red'>单片机</font>中自己实现 printf()函数功能
富士通半导体杯MCU设计竞赛颁奖典礼隆重举行
2010-2011年富士通半导体杯“两岸三地•创意未来”MCU设计竞赛颁奖典礼近日在上海浦东嘉里大酒店隆重举行。以“舞动巧思 放声未来”为主题的颁奖典礼现场表彰了一系列兼具创新与实用的未来生活设计,这也意味着吸引两岸三地高校师生及电子爱好者踊跃参与的本届MCU竞赛圆满落幕。 2010年11月启动的本届富士通半导体杯MCU设计竞赛,赢得了两岸三地(大陆、台湾和香港)教育界、半导体行业和行业媒体的广泛关注,参赛选手也是再创新高,大陆地区吸引了1,300多名参赛选手,而台湾、香港地区也有110余组选手踊跃参赛。经过严谨的评审,50多所高校的70余件作品脱颖而出,角逐最终大奖。来自天津大学的“物联网智能冰箱iStore设计方案”和西南交
[单片机]
富士通半导体杯<font color='red'>MCU</font>设计竞赛颁奖典礼隆重举行
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved