当前位置:首页 >> 信息与通信 >>

凌阳61单片机使用7段数码管显示数字时钟的程序


凌阳61单片机使用 段数码管显示数字时钟的程序 凌阳 单片机使用7段数码管显示数字时钟的程序 单片机使用
#include <SPCE061v004.h> #include <unspmacro.h> //中断函数定义 void IRQ1(void) __attribute__((ISR)); void IRQ5(void) __attribute__((ISR)); void IRQ6(void) __attribute__((ISR)); enum { RUN, CHGSECOND, CHGMINUTE, CHGHOUR } clock_status; //时钟的状态 unsigned int hour,minute,second; unsigned int show_hour, show_minute, show_second; enum { NOKEY, PRESSING, PRESSED } key_status; unsigned key_code; // 7段 LED 数码管的字形码,采用高八位输出,决定显示的字形,如: '0'、'1'等 const unsigned int zhixingma[] = { 0x3f00, 0x0600, 0x5b00, 0x4f00, 0x6600, 0x6d00, 0x7c00, 0x0700, 0x7f00,0x6f00 }; //数码管选择的"位段码",决定哪一位数码管显示 const unsigned int weiduanma[] = {0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040}; //数码管的两个 DD 引脚,为时,中间的冒号亮 const unsigned int wei_DD = 0x0081; //键盘按下与否的状态

void display(unsigned int wei, unsigned int number) { *P_IOA_Data = zhixingma[number]; //设置位段码时,不能改变冒号的状态 *P_IOB_Data = weiduanma[wei] | (*P_IOB_Buffer & wei_DD); } //取反数码管中间的冒号 void opposite_dots() { *P_IOB_Data = wei_DD ^ (*P_IOB_Buffer); } void delay(unsigned int howlong) { while(howlong--){ unsigned int temp = 0x00ff; *P_Watchdog_Clear = 1; while(temp--); } } void init() { INT_OFF();

*P_IOA_Dir = 0xff00; *P_IOA_Attrib = 0xff00; *P_IOB_Dir = 0x00ff; *P_IOB_Attrib = 0x00ff; *P_TimerA_Data = 0xffff - 256; *P_TimerA_Ctrl = C_SourceA_1 | C_SourceB_256Hz; *P_INT_Ctrl = C_IRQ1_TMA | C_IRQ6_TMB2 | C_IRQ5_2Hz; INT_IRQ(); } void change_clock() { unsigned int key_code = get_key(); static unsigned int max; switch(key_code){ case 1: switch( clock_status ){ case CHGSECOND: if(++second == 60) second = 0; break; case CHGMINUTE: if(++minute == 60) minute = 0; break; case CHGHOUR: if(++hour == 24) hour =0; break; default: break; } break; case 2: switch( clock_status ){ case CHGSECOND: if(--second == 0) second = 59; break; case CHGMINUTE: if(--minute == 0) minute = 59; break; case CHGHOUR: if(--hour == 0) hour = 23; break; default: break; } break; // key_code == 0 will do nothing

case 3: switch( clock_status ){ case RUN: clock_status = CHGSECOND; break; case CHGSECOND: clock_status = CHGMINUTE; break; case CHGMINUTE: clock_status = CHGHOUR; break; case CHGHOUR: clock_status = RUN; break; } break; default: break; } }

int main() { init(); while(1){ change_clock(); if(show_second){ display(5, second % 10); delay(1); display(4, second / 10); delay(1); } if(show_minute){ display(3, minute % 10); delay(1); display(2, minute / 10); delay(1); } if(show_hour){ display(1, hour % 10); delay(1); display(0, hour / 10); delay(1); }

} }

void IRQ1() { //时钟计数中断 if( (C_IRQ1_TMA & *P_INT_Ctrl) != 0 ) { if( clock_status == RUN ) { second++; if(second >= 60 ) second=0, minute++; if(minute >= 60 ) minute=0, hour++; if(hour >= 24 ) hour=0; } *P_INT_Clear = C_IRQ1_TMA; } }

void IRQ5() {//数码管闪烁 if( (C_IRQ5_2Hz & *P_INT_Ctrl) != 0) { switch(clock_status){ case RUN: opposite_dots(); show_hour = show_minute = show_second = 0xffff; break; case CHGSECOND: show_second ^= 0xffff; show_minute = show_hour = 0xffff; break; case CHGMINUTE: show_minute ^= 0xffff; show_second = show_hour = 0xffff; break; case CHGHOUR: show_hour ^= 0xffff; show_second = show_minute = 0xffff; break; } *P_INT_Clear = C_IRQ5_2Hz; } }

void IRQ6() { //每10ms 扫描一次键盘 static unsigned int old_key = 0; static unsigned int key_count = 0; unsigned int current_key;

if( (C_IRQ6_TMB2 & *P_INT_Ctrl) != 0) { current_key = *P_IOA_Data & 0x0007; if( current_key != 0) { //有按键 if( key_status == NOKEY ) { old_key = current_key; key_count++; key_status = PRESSING; }else{ if( current_key == old_key) //不相等,抖动 { if( ++key_count >= 5) //有>5次扫描的值相等,说明不是抖动,判断按键值 { if(current_key == 0x0001) key_code = 1; if(current_key == 0x0002) key_code = 2; if(current_key == 0x0004) key_code = 3; } }else{ //抖动 old_key = 0; key_count = 0; key_status = NOKEY; } } }else{ //无按键

old_key = 0; key_count = 0; if( key_status == PRESSING ) key_status = PRESSED; //按键释放了 } *P_INT_Clear = C_IRQ6_TMB2; } }


相关文章:
8位数码管显示电子时钟c51单片机程序
8位数码管显示电子时钟 c51单片机程序时间:2012-09-10 13:52:26 来源: 作者: /* 8位数码管显示 时间格式 S1 用于小时加1操作 S2 用于小时减1操作 S3 用于...
单片机的实时时钟设计(数码管显示)》
本文研究了基于数码管显示的数字时钟系统设计与实现。...的大部分功能,现在已经能 单片机通过软件方法来...61 60 59 58 57 56 55 54 53 52 51 50 49 ...
STC90C51单片机数码管时钟程序
STC90C51单片机数码管时钟程序_电子/电路_工程科技_专业资料。/***...试验数码管显示数字时钟 * * * * 连接方法:短路帽将 J15 和 J16 连起来 JP10(P0...
单片机、设计数码管显示,电子时钟
单片机、设计数码管显示,电子时钟_电子/电路_工程科技...可见动态扫描显示是在执行动态扫描显示程序的。 要...(黑) 00H 表 1 共阴极 7 段 LED 显示字型...
51单片机简易可调的数码管电子钟程序
} } } } 本程序是基于 51 单片机简易可调的数码管电子时钟程序,按键可以调整当时时间,按 键可以调节定时时间,定时时间到继电器吸合, 8 位数码管显示 时间格式格...
单片机数字时钟实验报告
数字时钟实验报告 一、 实验目的 1、熟悉单片机的结构和各引脚的的功能以及如何用程序控制。 2、学习用单片机数字时钟控制、按键扫描及 LED 数码管显示的设计方法...
基于单片机的电子时钟6位LED数码管显示
而且,由于是软 件实现,当单片机不上电,程序不执行时,时钟将不工作。 基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。 2.数码管显示方案 2.数码管显示...
1×8键输入凌阳61单片机在LED数码管上的显示实验
1×8键输入凌阳61单片机在LED数码管上的显示实验_IT...7 K8 8 开机后(程序运行后) 为数码管全部显示 0...占用的 CPU 时间多,但使用的硬件少,能节省线路板...
课程设计51单片机数字时钟
三、原理论述单片机控制的数字钟的硬件结构与软件设计,给出了汇编语言源程序。此...显示器件选用LED七段数码管。 在译码显示电路输出的驱动下,显示出清晰、直观的...
单片机简易数字时钟
准确会带来非常大的麻烦,所以以数码 管显示器的时钟比指针式的时钟表现出了...从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法 来...
更多相关标签: