历史上的今天
今天是:2024年11月26日(星期二)
2020年11月26日 | STC89单片机+TM1638超级秒表程序
2020-11-26 来源:51hei
超级秒表,具有计时功能,暂停功能,定时器功能,用起来超级好玩。
单片机源程序如下:
#ifndef _TM1638_H
#define _TM1638_H
#include #define DATA_COMMAND 0X40 #define DISP_COMMAND 0x80 #define ADDR_COMMAND 0XC0 //TM1638模块引脚定义 sbit DIO=P1^0; sbit CLK=P1^1; sbit STB=P1^2; //共阴数码管显示代码 unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; void TM1638_Write(unsigned char DATA) //写数据函数 { unsigned char i; for(i=0;i<8;i++) { CLK=0; if(DATA&0x01) { DIO=1; } else { DIO=0; } CLK=1; DATA>>=1; } } unsigned char TM1638_Read(void) //读数据函数 { unsigned char i; unsigned char temp=0x00; DIO=1; for(i=0;i<8;i++) { temp>>=1; CLK=0; if(DIO) { temp|=0x80; } else { temp&=0x7f; } CLK=1; } return temp; } void Write_COM(unsigned char cmd) //发送命令字 { STB=0; TM1638_Write(cmd); STB=1; } unsigned char Read_key() { unsigned char Key[4],i,Keyvalue=0; STB=0; // Write_COM(0x42); TM1638_Write(0x42); for(i=0;i<4;i++) { Key[i]=TM1638_Read(); } STB=1; for(i=0;i<4;i++) { Keyvalue|=Key[i]< } for(i=0;i<8;i++) { if((0x01< {break;} } return i; } /* unsigned char Read_key(void) { unsigned char c[4],i,key_value=0; STB=0; TM1638_Write(0x42); //读键扫数据 命令 for(i=0;i<4;i++) c[i]=TM1638_Read(); STB=1; //4个字节数据合成一个字节 for(i=0;i<4;i++) key_value|=c[i]< for(i=0;i<8;i++) if((0x01< break; return i; } */ void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据 { Write_COM(0x44); STB=0; TM1638_Write(0xc0|add); TM1638_Write(DATA); STB=1; } /* void Write_oneLED(unsigned char num,unsigned char flag) //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮 { if(flag) Write_DATA(2*num+1,1); else Write_DATA(2*num+1,0); } */ void Write_allLED(unsigned char LED_flag) //控制全部LED函数,LED_flag表示各个LED状态 { unsigned char i; for(i=0;i<8;i++) { if(LED_flag&(1< //Write_DATA(2*i+1,3); Write_DATA(2*i+1,1); else Write_DATA(2*i+1,0); } } //TM1638初始化函数 void init_TM1638(void) { unsigned char i; Write_COM(0x8b); //亮度 (0x88-0x8f)8级亮度可调 Write_COM(0x40); //采用地址自动加1 STB=0; // TM1638_Write(0xc0); //设置起始地址 for(i=0;i<16;i++) //传送16个字节的数据 TM1638_Write(0x00); STB=1; } #endif 复制代码 #include #include "tm1638.h" #define u16 unsigned int #define u8 unsigned char /* 制作一个秒表 要求: a. 可以计时至少 10 分钟,并且精确到0.01s,在数码管上实时显示 当前时间; b. 按下 S1,开始计时;按下 S2 暂停/启动;按下 S3 结束计时; c.(选做)增加一个模式选择键以及数字输入按键,按下后可在计时模 式和设置模式切换。 在设置模式中,可设置一个时间(利用按键输入), 切换回计时模式时,当计到设置时间时,蜂鸣器响。 */ u16 TIMERBAT=0; bit flag=0; u8 state=0; //0没开始计时或者暂停 1开始计时 2设置模式 u8 hym;//按键键码控制 void Timer0Init(void); void Display(); void Set_Bell(); void Clock_System(); void CLR_Time(); void CLRBell(); bit Judge_Baba(); u8 code distab[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}; u8 shijian[5]; //0爸爸 1秒 2分 3时 u8 shijianshezhi[4]; //0秒 1分 2时 void main() { init_TM1638(); Timer0Init(); flag=0; while(1) { if(state==2) { Set_Bell(); } else { Clock_System(); } } } void Set_Bell() { TR0=0; while(state==2) { hym=Read_key(); if(hym!=8) { switch(hym) { case 3:state=0;break; case 4:shijianshezhi[2]++;shijianshezhi[2]%=24;break; case 5:shijianshezhi[1]++;shijianshezhi[1]%=60;break;
下一篇:单片机5*4矩阵键盘计算器制作
史海拾趣
|
一、模拟电路设计 基础知识(笔试时候容易遇到的题目) 1.最基本的如三极管曲线特性(太低极了点) 2.基本放大电路(电压放大器,电流放大器,互导放大器和互阻放大器),种类,优 &nb ...… 查看全部问答> |
|
1、引言 医学超声诊断成像技术大多数采用超声脉冲回波法,即利用探头产生超声波进入人体,由人体组织反射产生的回波经换能器接收后转换为电信号,经过提取、放大、处理,再由数字扫描变换器转换为标准视频信号,最后由显示器进行显示。在基于FPGA+ ...… 查看全部问答> |
|
请教9261的串口收发问题 我在核中添加了下面的代码: at91_register_uart(AT91SAM9261_ID_US1, 1, ATMEL_UART_RTS); at91_register_uart(AT91SAM9261_ID_US2, 2, ATMEL_UART_RTS); at91_register_uart(AT91SAM9261_ID_US3, 3, ATMEL_UART_RTS ...… 查看全部问答> |
|
编辑完对话框类后无法在EDIT里输入汉字; 还有请帮忙看看一下代码怎么修改 LOGFONT m_lf; //字体结构 strcpy(m_lf.lfFaceName,ipadress ); 报错:error C2664: \ ...… 查看全部问答> |
|
图为直接耦合共射放大电路~ 直流通路里有直流电源Vcc,可是交流通路里没有Vcc啊,负载线方程怎么会相同呢? 请最好把Uce和Ic的函数关系式即负载线方程写出来~… 查看全部问答> |




