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

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


凌阳61单片机使用 段数码管显示数字时钟的程序 凌阳 单片机使用7段数码管显示数字时钟的程序 单片机使用
#include <SPCE061v004.h> #include <unspmacro.h> //中断函数定义 void IRQ1(void) __attribute__((ISR)); void IRQ5(void) __attribut

e__((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位)显示的数字时钟程序
单片机数字时钟 17页 2财富值如要投诉违规内容,请到...用数码管(8 位)显示的数字时钟程序用数码管(8 位...//段选锁存器 sbit wela=P2^7; //位选锁存器...
单片机、设计数码管显示,电子时钟
单片机、设计数码管显示,电子时钟_电子/电路_工程科技...可见动态扫描显示是在执行动态扫描显示程序的。 要...(黑) 00H 表 1 共阴极 7 段 LED 显示字型...
7段数码管显示电路
二极管组成 数字显示,另外一个圆形的发光二极管显示...正常显示,CPU 必须每隔一段时间执行一次显示程序,...单片机 7 段数码管静态显示电路原理图之 CPU 电路 ...
单片机课程设计——温度显示(7段数码管)
本次使用的是 atmel 公司的 AT89C51 单片机系列,...程序数码管的动态显示程序, 可以显示 4 位数字,...程序可以应以与电子钟,温度计,速度显示的基本显示 ...
1单片机实现7段数码管的显示
1单片机实现7段数码管的显示_电子/电路_工程科技_...KeilC 等软件对电路的仿真、编程 与分析; (4)提供...凌阳61单片机使用7段数码... 5页 免费 单片机...
8位数码管显示电子时钟c51单片机程序
8位数码管显示电子时钟 c51单片机程序时间:2012-09-10 13:52:26 来源: 作者: /* 8位数码管显示 时间格式 S1 用于小时加1操作 S2 用于小时减1操作 S3 用于...
单片机数码管显示0至7数字的程序
单片机数码管显示0至7数字的程序_理学_高等教育_教育专区。单片机程序数码管显示...凌阳61单片机使用7段数码... 5页 免费 0~7显示数码管程序 1页 免费 C51单...
单片机课程设计——温度显示(7段数码管)
单片机课程设计——温度显示(7段数码管)_工学_高等...温度以9或12位数字; 用户可定义报警设置; 报警搜索...程序可以应以与电子钟,温度计,速度显示的基本显示 ...
数码管动态显示的51单片机时钟设计
数码管动态显示的51单片机时钟设计_信息与通信_工程科技...[7]=DSY_CODE[s%10]; } void T0_INT() ...{ P0=P3=0xFF; //主程序 TMOD=0x11; //T0,...
单片机数字时钟实验报告
数字时钟实验报告 一、 实验目的 1、熟悉单片机的结构和各引脚的的功能以及如何用程序控制。 2、学习用单片机数字时钟控制、按键扫描及 LED 数码管显示的设计方法...
更多相关标签:
凌阳61单片机 | 凌阳单片机61a | 单片机数码管显示时钟 | 单片机数码管时钟程序 | c51单片机数码管时钟 | 单片机数码管时钟 | 单片机数码管时钟闹钟 | 单片机6位数码管时钟 |