Mega16按键与数码显示程序

发布者:HeavenlyJoy444最新更新时间:2015-07-21 来源: 51hei关键字:Mega16  按键  数码显示 手机看文章 扫描二维码
随时随地手机看文章
#include  
#include  
#define No_key 255 
#define K1_11 
#define K1_22 
#define K1_33 
#define K1_4    4 
#define K2_15 
#define K2_26 
#define K2_37 
#define K2_4    8 
#define K3_19 
#define K3_20 
#define K3_310 
#define K3_4    11 
#define K4_112 
#define K4_213 
#define K4_314 
#define K4_4    15 
#define Key_mask0b00001111   
#define data PORTB.0 
#define clk PORTB.1  
flash unsigned char led[16]={0x28,0xeb,0x19,0x89,0xca,0x8c,0x0c,0xe9,0x08,0x88, 
                             0xdf,0x4a,0x1c,0x3e,0x7e,0x2a}; 
unsigned charkey_stime_counter; 
unsigned char   key_temp; 
bitkey_stime_ok;  
//D0接键盘,低4位列线输入,高4位行线输出 
unsigned char read_keyboard() 
{ 
 static unsigned char key_state = 0, key_value, key_line; 
 unsigned char key_return = No_key,i; 
 switch (key_state) 
 { 
  case 0: 
  key_line = 0b00010000; 
  for (i=1; i<=4; i++)// 扫描键盘 
  { 
         PORTA = ~key_line;// 输出行线电平 
 PORTA = ~key_line;// 必须送2次!!! 
 key_value = Key_mask & PINA;// 读列电平 
 if (key_value == Key_mask) 
 key_line <<= 1;// 没有按键,继续扫描 
 else 
 { 
  key_state++;// 有按键,停止扫描 
  break;// 转消抖确认状态 
 } 
} 
break; 
  case 1: 
        if (key_value == (Key_mask & PINA))// 再次读列电平, 
{ 
 switch (key_line | key_value)// 与状态0的相同,确认按键 
 {// 键盘编码,返回编码值  
  case 0b00011110: 
       key_return = K1_1; 
       break; 
  case 0b00011101: 
       key_return = K1_2; 
       break; 
          case 0b00011011: 
       key_return = K1_3; 
       break; 
  case 0b00010111: 
       key_return = K1_4; 
       break;      
  case 0b00101110: 
       key_return = K2_1; 
       break; 
   case 0b00101101: 
       key_return = K2_2; 
       break; 
  case 0b00101011: 
       key_return = K2_3; 
       break; 
  case 0b00100111: 
       key_return = K2_4; 
       break; 
   case 0b01001110: 
       key_return = K3_1; 
       break; 
   case 0b01001101: 
       key_return = K3_2; 
       break; 
  case 0b01001011: 
       key_return = K3_3; 
       break;  
  case 0b01000111: 
       key_return = K3_4; 
       break; 
   case 0b10001110: 
       key_return = K4_1; 
       break; 
   case 0b10001101: 
       key_return = K4_2; 
       break; 
  case 0b10001011: 
       key_return = K4_3; 
       break;  
  case 0b10000111: 
       key_return = K4_4; 
       break; 
 } 
key_state++;// 转入等待按键释放状态 
       } 
       else 
 { 
  key_state--; 
  delay_ms(5); 
 }// 两次列电平不同返回状态0,(消抖处理) 
 break; 
  case 2:// 等待按键释放状态 
      PORTA = 0b00001111;// 行线全部输出低电平 
      PORTA = 0b00001111;// 重复送一次 
      if ( (Key_mask & PINA) == Key_mask) 
      key_state=0;// 列线全部为高电平返回状态0 
      break; 
 } 
 return key_return; 
} 
//向数码管送入数据 
void sendbyte(unsigned char byte) 
{     
 unsigned char num,c;  
 num=led[byte]; 
 for(c=0;c<8;c++) 
 { 
  clk=0; 
  data=num&0x01; 
  clk=1; 
  num>>=1; 
 } 
} 
void display(void) 
{ 
 if (key_stime_ok) 
  { 
   key_stime_ok = 0;// 10ms到 
   key_temp = read_keyboard();// 调用键盘接口函数读键盘 
   if (key_temp != No_key) 
   {// 有按键按下 
    sendbyte(key_temp); 
    delay_ms(10); 
   } 
  } 
} 
void main(void) 
{ 
 DDRB = 0xFF; 
 //PORTC = 0xFF;// 键盘接口初始化 
 DDRA = 0xF0;// PD2、PD1、PD0列线,输入方式,上拉有效 
 // T/C0 初始化  
 TCCR0=0x0B;// 内部时钟,64分频(4M/64=62.5KHz),CTC模式 
 TCNT0=0x00; 
 OCR0=0x7C;// OCR0 = 0x7C(124),(124+1)/62.5=2ms 
 TIMSK=0x02;// 允许T/C0比较匹配中断 
 #asm("sei")// 开放全局中断 
 while (1) 
 { 
  display(); 
 } 
}      
// Timer 0 比较匹配中断服务,2ms定时 
interrupt [TIM0_COMP] void timer0_comp_isr(void) 
{ 
 //display();// 调用LED扫描显示 
 if (++key_stime_counter >=5) 
 { 
  key_stime_counter = 0; 
  key_stime_ok = 1;// 10ms到 
 } 
}
关键字:Mega16  按键  数码显示 引用地址:Mega16按键与数码显示程序

上一篇:avr单片机驱动12864液晶程序
下一篇:mega8515的矩阵键盘与LED显示程序

推荐阅读最新更新时间:2024-03-16 14:25

msp430单片机实现常按键和短按键加去抖功能
通过P1口的中断开启定时器,然后利用定时器中断不断扫描相应的端口状态,判断按键的 //定时器设置 void TimerA1Init() { _UINT data = 0 ; TA1CTL = data ;//clear all ,diaable interrupt , claer ifg TA1CTL |= TASSEL__ACLK | ID_0 | TACLR ; // ACLK, stop mode, ,div:1 ,clear TAR //TA0CTL |= MC__UP ;//启动定时器 TA1CCTL0 = CCIE ; //ccr0 比较中断允许 TA1CCR0 = 327 ; //ccr0
[单片机]
51单片机心形灯实现按键控制流水编程
实现按键K1实现从左向右流水,按键K2实现从右往左流水,按键K3实现暂停流水,按键K4实现继续流水 注意:本代码存在小小BUG即按键K1以后可以按键K3和K4控制流水,不能按K2中断K1流水操作来实现K2从右向左流水。按键K2对于K1也同理! 心形灯原理图 编译软件:Keil uVision5 (如有需要可点此链接下载:https://download.csdn.net/download/qq_36931762/11343174) 单片机程序下载软件:STC-ISP (如有需要可点此链接下载:https://download.csdn.net/download/qq_36931762/11343157) 程序代码:
[单片机]
51单片机心形灯实现<font color='red'>按键</font>控制流水编程
51单片机——独立按键
独立按键编程思路 #include reg51.h ​#include intrins.h //循环右位移函数库 void delay_10_ms(unsigned int t); sbitP1_0=P1^0; //P1口为按键 void main(void) { unsigned char i; P0=0x01; while(1) { if(P1_0==0)//按键按下 { delay_10_ms(1); //利用延时消除抖动 if(P1_0==0) { P0=_cror_(P0,1); //P0口为LED //_cror_为字符型循环右位移函数// while((i 5
[单片机]
按键控制数码显示时间程序
#include  reg51.h   unsigned b ={0x3f,0x06,0x5b,0x4f,0x66,0x7d,0x07,0x7f,0x6f};  /*******************************************************************  --函数名称:void delay(void)  --函数功能:用于延时  /*******************************************************************/  void delay(void)  {     unsigned char i,j,k;     for(i=20;
[单片机]
TM1637数码显示STC51单片机驱动程序
/* Coder : Farman Date : 2018-01-02 参考了厂家的TM1637数据手册,在此表示感谢。 */ #include STC89C5XRC.h //包含52单片机头文件 #include Delay.h //////////////////////////////////////////////////////////////////////////// sbit I2C_SCL = P2^1; //定义模拟IIC总线的时钟线 sbit I2C_SDA = P2^0; //定义模拟IIC总线的数据线 #define TM1637_BRIGHTNESS 7 // 0 - 7
[单片机]
linux-2.6.32在mini2440开发板上移植(17)之按键驱动程序移植
编者:按键驱动程序涉及到linux中断程序的编写。 1、按键原理图。 2、驱动程序的编写移植。 在/linux-2.6.32.2/drivers/char/目录下创建一个新的驱动程序文件mini2440_buttons.c,内容及详细注释如下: #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include linux/poll.h #include linux/irq.h #include asm/irq.h #incl
[单片机]
linux-2.6.32在mini2440开发板上移植(17)之<font color='red'>按键</font>驱动程序移植
51单片机音乐盒设计 按键可以上一曲,下一曲,开始或暂停
功能介绍: 本设计采用STC89C51/52(与AT89C51/52、AT89S51/52通用,指定单片机请留言)单片机做为主控制器 主要功能: 单片机内置8首歌曲,按键可以上一曲,下一曲,开始或暂停。电位器可以调节音量。LM386驱动喇叭,够响亮! 使用说明: 一共4个按键 上面那个独立的是复位按键,按下去程序从头执行,详情请看视频讲解文件夹中的最小系统介绍。 下面3个按键分别是:上一曲、开始/暂停、下一曲。 单片机源程序如下: ////////////////////////////////////////////// //51单片机音乐播放器程序 // //共三个按键:上
[单片机]
【汽车黑科技】智能表面技术——按键鸟枪换炮
智能表面技术:智能表面是面向未来的人机交互技术的关键组成部分,是电气化汽车与成员控制交互的入口。它将信息显示、智能控制、智能交互等功能无缝整合至同一表面,从而使仪表板、门板和副仪表板等各区域表面相互之间和谐统一。装饰和功能之间的界限逐渐减少,创造出兼具功能性和美感的创新内饰。 ● 关于我们 正在开展的部委课题: 1)新能源二手车流通体系研究:分析行业面临的突出问题及原因,提出切实可行的政策建议 2)汽车排放召回:协助主管部门细化《机动车排放召回管理规定》相关条款,制定落地方案 3)智能网联汽车沙盒监管:主要涉及 自动驾驶、OT
[汽车电子]
【汽车黑科技】智能表面技术——<font color='red'>按键</font>鸟枪换炮
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • Linux内核移植
    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核下面以Linux2 6 30 4内核移植到gec2440为例:一、准备 ...
  • S5PV210 PWM定时器
    第一节 S5PV210的PWM定时器S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。PWM定时器使用PCLK_PS ...
  • S5PV210 NAND Flash
    NAND Flash关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Fl ...
  • S5PV210串口
    串口设置之输入输出字符S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来 ...
  • S5PV210按键控制LED
    原理图如图所示:查询用户手册得到:程序例子:(完整代码见“代码下载链接”)1、轮询的方式查询按键事件 *main c* 核心代码如下:while(1 ...
  • S5PV210控制蜂鸣器
  • S5PV210的启动过程
  • S5PV210点亮LED
  • S5PV210启动过程详解
何立民专栏 单片机及嵌入式宝典

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

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