历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2018年01月07日 | 数码管秒表C程序

2018-01-07 来源:eefocus

数码管秒表C程序

*                 数码管显示秒表, 分辨率0.01s                      

*                 K1---控制按钮                            
*                       第一次按下时, 启动开始计时 
*                       第二次按下时, 停止          
*                       第三次按下时, 归零   
*  引用资源:数码管数据 p0口,数码管控制p2口  控制按钮 p3.2口 
*    秒单位,寄存器与数码管对应关系:                          
*                                             
* --- 秒单位 ---------- 数码管端口 ---- 缓冲区 --------- 计时BCD码值寄存器
*     十万位               P20        dis_buf[7]          sec_bcd[7] 
*     万位                 P21        dis_buf[6]          sec_bcd[6]  
*     千位                 P22        dis_buf[5]          sec_bcd[5] 
*     百位                 P23        dis_buf[4]          sec_bcd[4]  
*     十位                 P24        dis_buf[3]          sec_bcd[3]   
*     个位(1.s)            P25        dis_buf[2]          sec_bcd[2]   
*     十分位(0.1s)         P26        dis_buf[1]          sec_bcd[1]   
*     百分位(0.01s)        P27        dis_buf[0]          sec_bcd[0]


#include  
#include  

unsigned char data dis_digit; 
unsigned char key_s, key_v; 

unsigned char code dis_code[11]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表 
unsigned char dis_buf[8];        // 显示缓冲区 
unsigned char sec_bcd[8];         // 秒计数值, BCD码 
unsigned char dis_index;        //  
unsigned char key_times;        // K1 按下次数                // 

void clr_time();     
void update_disbuf(); 
bit    sCAN_key(); 
void proc_key(); 
void delayms(unsigned char ms); 

sbit    K1 = P3^2; 


void main(void) 

    P0 = 0xff; 
    P2 = 0xff; 
    TMOD = 0x11;        // 定时器0, 1工作模式1, 16位定时方式 
    TH1 = 0xdc; 
    TL1 = 0; 

    TH0 = 0xFC; 
    TL0 = 0x17; 
     
    clr_time();            //  
                                
    dis_digit = 0x7f;        // 初始显示P20口数码管 
    dis_index = 0;            //  
     
    key_times = 0; 
    key_v = 0x01; 
     
    IE = 0x8a;                // 使能timer0, timer1中断 
     
    TR0 = 1; 
    TR1 = 0; 
    while(1) 
    { 
        if(scan_key()) 
        { 
            delayms(10); 
            if(scan_key()) 
            { 
                key_v = key_s; 
                proc_key(); 
            } 
        } 
         
    } 


void clr_time() 

    sec_bcd[0] = 0x0; 
    sec_bcd[1] = 0x0; 
    sec_bcd[2] = 0x0; 
    sec_bcd[3] = 0x0; 
    sec_bcd[4] = 0x0; 
    sec_bcd[5] = 0x0; 
    sec_bcd[6] = 0x0; 
    sec_bcd[7] = 0x0;    
     
    update_disbuf(); 
     


bit scan_key() 

    key_s = 0x00; 
    key_s |= K1; 
    return(key_s ^ key_v);     


void proc_key() 

    if((key_v & 0x01) == 0) 
    { 
        key_times++; 
        if(key_times == 1) 
        { 
            TR1 = 1; 
        } 
        else if(key_times == 2) 
        {     
            TR1 = 0; 
        } 
        else 
        { 
            clr_time(); 
            key_times = 0; 
        } 
         
    } 


void timer0() interrupt 1 
// 定时器0中断服务程序, 用于数码管的动态扫描 
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量 
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时, 
//                选通P2.0口数码管 
// dis_buf   --- 显于缓冲区基地址     

    TH0 = 0xFC; 
    TL0 = 0x17; 
     
    P2 = 0xff;                            // 先关闭所有数码管 
    P0 = dis_buf[dis_index];            // 显示代码传送到P0口 
    P2 = dis_digit;                        //  

    dis_digit = _cror_(dis_digit,1);    // 位选通值右移(P20<-P27), 下次中断时选通下一位数码管 
    dis_index++;                        //  
                     
    dis_index &= 0x07;            // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描 


void timer1() interrupt 3 
// 
{     
    unsigned char i; 
    TH1 |= 0xdc; 
    for(i = 0; i < 8; i++) 
    { 
        sec_bcd[i]++;            // 低位加1 
        if(sec_bcd[i] < 10)        // 如果低位满10则向高位进1 
            break;            // 低位未满10 
        sec_bcd[i] = 0;            // 低位满10清0 
    } 
    update_disbuf();            // 更新显示缓冲区 


void update_disbuf() 
// 更新显示缓冲区 

    dis_buf[0] = dis_code[sec_bcd[0]]; 
    dis_buf[1] = dis_code[sec_bcd[1]]; 
    dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f;    // 加上小数点 
    dis_buf[3] = dis_code[sec_bcd[3]]; 
    dis_buf[4] = dis_code[sec_bcd[4]]; 
    dis_buf[5] = dis_code[sec_bcd[5]]; 
    dis_buf[6] = dis_code[sec_bcd[6]]; 
    dis_buf[7] = dis_code[sec_bcd[7]]; 


void delayms(unsigned char ms)     
// 延时子程序 
{                         
    unsigned char i; 
    while(ms--) 
    { 
        for(i = 0; i < 120; i++); 
    } 
}


推荐阅读

史海拾趣

FLIR公司的发展小趣事

近年来,随着智能化和便携化趋势的兴起,FLIR积极响应市场需求,推出了一系列智能化、便携化的红外热像仪产品。例如,FLIR的I系列和T系列产品就以其小巧轻便、操作简便的特点受到了广大用户的青睐。这些产品不仅具备高性能的红外成像能力,还集成了多种智能化功能,如自动测温、图像分析、报告生成等,极大地提升了用户的使用体验和工作效率。此外,FLIR还推出了适用于智能手机的红外热像仪配件,进一步拓宽了产品的应用领域和市场空间。

B+B SmartWorx公司的发展小趣事

B+B SmartWorx始终坚持以客户为中心,通过提供优质的产品和服务来满足客户需求。公司相信,客户满意度和产品创新是驱动其增长的关键因素。因此,B+B SmartWorx在设计和制造网络连接设备时,始终注重设备的易用性、可管理性和可靠性。这种对客户的深度理解和持续创新,使得B+B SmartWorx在电子行业中赢得了良好的声誉,并实现了持续稳健的发展。

这些故事基于B+B SmartWorx的发展历程和现有信息,虚构了一些具体情节,旨在展现该公司在电子行业中的成长与变迁。请注意,这些故事可能并不完全准确反映B+B SmartWorx的实际发展情况,如需了解更多关于该公司的具体信息,建议查阅相关官方资料或新闻报道。

DESCO公司的发展小趣事

为了进一步提升竞争力,DESCO公司进行了多次收购和资源整合。例如,在XX年,公司成功收购了美国一家知名的防静电产品制造商,获得了其先进的生产技术和销售渠道。这次收购使DESCO公司的产品线更加丰富,市场覆盖面更加广泛。此外,公司还加强了与其他企业的战略合作,共同开发新产品、拓展新市场。

ALTERA(阿尔特拉)公司的发展小趣事

为了进一步提升竞争力,DESCO公司进行了多次收购和资源整合。例如,在XX年,公司成功收购了美国一家知名的防静电产品制造商,获得了其先进的生产技术和销售渠道。这次收购使DESCO公司的产品线更加丰富,市场覆盖面更加广泛。此外,公司还加强了与其他企业的战略合作,共同开发新产品、拓展新市场。

HAHN - Elektrobau GmbH & Co KG公司的发展小趣事

进入21世纪后,高通在推动5G技术发展方面发挥了关键作用。作为真正的5G领军企业,高通在基础研发方面持续投入,拥有引领和参与标准制定的长期历史。高通的5G技术涵盖了从系统构建到多样化应用的各个方面,包括毫米波频谱的利用、大规模MIMO技术的演进等。这些突破性发明为现代蜂窝通信提供了强有力的支撑,使得高通在5G标准制定和技术实施方面占据了核心地位。高通已签订超过150份5G许可协议,为全球超过180亿台终端提供了技术支持。

芯邦(Chipsbank)公司的发展小趣事

近年来,芯邦科技的营收规模逐渐增大,从2020年到2022年,公司的营业收入分别达到了0.99亿元、1.75亿元和1.92亿元。尽管增速呈现下降趋势,但芯邦科技在电子行业中依然保持着稳健的市场表现。同时,公司也注重研发投入,不断提升产品的技术水平和市场适应性。

问答坊 | AI 解惑

小东西避免重大损失—Windows CE在工控中的应用

大家知道起重机么?看看右图就有个直观的了解咯。起重机又称吊车,属于物料搬运机械。起重机的工作特点是做间歇性运动,即在一个工作循环中取料、运移、卸载等动作的相应机构是交替工作的哟,在我们的建筑业中是不可缺少的重要工具哦。 那么 ...…

查看全部问答>

DS1302

请大家DS1302要不要写程序的…

查看全部问答>

求助

我是初学者,才用2051片和1302做了个定时器,还加了电池但掉电后数字复零,不知为啥请各位老师指导.我的QQ:754862083.电话:029-81227236…

查看全部问答>

51单片机写入24C02一个字节数据的汇编代码。有详细注释,搭电路测试通过

;读写24C02   P1.3时钟信号    P1.4 数据信号  器件地址三个引脚全部接  地         clr p1.3 ;时钟信号初始化         setb p1.4;初始 ...…

查看全部问答>

eboot中,在TOC中增加变量的问题??

// // Bootloader configuration parameters. // typedef struct _BOOTCFG {     ULONG       ImageIndex;             ULONG       ConfigFlags;   ...…

查看全部问答>

sql ce不能运行,求助~~

在只安装有.net framework环境下,在运行到连接sqlce数据库时就无法通过,但也不明确提示什么错, 在安装有开发环境下,能正常运行,不知道怎么回事~~~ 总不至于在客户那边都给装上开发环境吧~~ 我试着装过net framework compact,sql ce,都没效果~~ ...…

查看全部问答>

help

我在用keil时,头文件不见!! 问题是: Build target \'Target 1\' compiling CARPARK1.C... CARPARK1.C(1): warning C318: can\'t open file \'reg522.h\' CARPARK1.C(30): error C202: \'P26\': undefined identifier CARPARK1.C(32): error C ...…

查看全部问答>

关于频率采集

#include #include #define ulong   unsigned long #define uint    unsigned int #define uchar   unsigned char typedef unsigned char BYTE; typedef unsigned int WORD; typedef bit BOOL ; sbit KG ...…

查看全部问答>

快速查询多就绪任务的最高优先级

今天用GRLIB将手机界面做出来了,加入touch.c就完成了触摸功能,就可以完成任务了。然后又把UC/OS_II加入,以前一直做多就绪任务最高优先级查询,但一直没弄清楚,现在弄明白了。也和大家分享一下心得。 要弄清楚,首先要了解两个变量和两个数组。 ...…

查看全部问答>

【求助】如何从软件上控制整体功耗?

唯一的耗电器件就是7位半的液晶,以及XTR115两线制供电,片子是MSP430F425   整体功耗要求0.7mA以下。现在差一点,从软件上可以怎样改进?我觉得从运行频率上可以做文章。哪位控制功耗的高手指导一下?…

查看全部问答>