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

凌阳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; } }


相关文章:
1×8键输入凌阳61单片机在LED数码管上的显示实验
1×8键输入凌阳61单片机在LED数码管上的显示实验_IT...7 K8 8 开机后(程序运行后) 为数码管全部显示 0...占用的 CPU 时间多,但使用的硬件少,能节省线路板...
单片机课程设计——温度显示(7段数码管)
本次使用的是 atmel 公司的 AT89C51 单片机系列,...程序数码管的动态显示程序, 可以显示 4 位数字,...程序可以应以与电子钟,温度计,速度显示的基本显示 ...
8位数码管显示电子时钟c51单片机程序
8位数码管显示电子时钟 c51单片机程序时间:2012-09-10 13:52:26 来源: 作者: /* 8位数码管显示 时间格式 S1 用于小时加1操作 S2 用于小时减1操作 S3 用于...
用数码管(8位)显示的数字时钟程序
单片机数字时钟 17页 2财富值如要投诉违规内容,请到...用数码管(8 位)显示的数字时钟程序用数码管(8 位...//段选锁存器 sbit wela=P2^7; //位选锁存器...
单片机课程设计——温度显示(7段数码管)
单片机课程设计——温度显示(7段数码管)_工学_高等...温度以9或12位数字; 用户可定义报警设置; 报警搜索...程序可以应以与电子钟,温度计,速度显示的基本显示 ...
51单片机数码管显示电子时钟C程序
51单片机数码管显示电子时钟C程序_信息与通信_工程科技_专业资料 暂无评价|0人阅读|0次下载|举报文档 51单片机数码管显示电子时钟C程序_信息与通信_工程科技_专业...
数码管动态显示的51单片机时钟设计
数码管动态显示的51单片机时钟设计_信息与通信_工程科技...源程序如下 //数码管设计的可调电子钟 //K1,K2 ...[7]=DSY_CODE[s%10]; } void T0_INT() ...
6位7段LED数码管显示
掌握 SPCE061A 单片机控制 LED 数码管显示的方法。...和 61 的状态持续 1s;其他状态刷新时间为 0.5s...凌阳科技推出了 μ’nSP IDE 工具的最新版本——...
凌阳数码管显示程序
凌阳61单片机使用7段数码... 5页 免费 1×8键输入凌阳61单片机... 19页 2...可​以​接​数​码​管​ ​或​者​L​E​D​ ​...
7段数码管显示电路_图文
基于单片机控制的7段数码管显示电路及源程序 ...二极管组成 数字显示,另外一个圆形的发光二极管显示...单片机工作时钟由 18.432MHZ 的晶振产生;电路中共...
更多相关标签: