一个按键控制秒表.doc_第1页
一个按键控制秒表.doc_第2页
一个按键控制秒表.doc_第3页
一个按键控制秒表.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*00.0099.99 秒计时*/#include #include unsigned char data dis_digit;unsigned char key_s, key_v;unsigned char code dis_code11=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x00;/ 09, off unsigned char dis_buf8;/ 显示缓冲区unsigned char sec_bcd8; / 秒计数值, BCD码unsigned char dis_index;/ dis_index - 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量unsigned char key_times;/ K1 按一下,开始计时,再按一下,停止计时,按第三下,清零/*函数全局声明*/void clr_time();void update_disbuf();bitscan_key();void proc_key();void delayms(unsigned char ms);sbitK1 = P32;/管脚定义void main(void)P0 = 0xff;P1 = 0xff; /关闭数码管显示TMOD = 0x11;/ 定时器0, 1 工作模式1, 16位定时方式TH1 = 0xdc; /?TL1 = 0; TH0 = 0xFC; /TL0 = 0x17;clr_time();/ 赋初值 dis_digit = 0x7f;/ 初始显示P1口数码管dis_index = 0;/ 赋初值key_times = 0;key_v = 0x01;IE = 0x8a;/ 使能timer0, timer1中断,即令EA=1,ET1=1,ET0=1TR0 = 1; /启动定时器0TR1 = 0; /关定时器1,为下面开启做铺垫while(1)if(scan_key()delayms(10);if(scan_key()key_v = key_s;proc_key();void clr_time()sec_bcd0 = 0x0;sec_bcd1 = 0x0;sec_bcd2 = 0x0;sec_bcd3 = 0x0;sec_bcd4 = 0x0;sec_bcd5 = 0x0;sec_bcd6 = 0x0;sec_bcd7 = 0x0; update_disbuf();bit scan_key()key_s = 0x00;key_s |= K1;return(key_s key_v);/key_s key_v只要对应位的值中有一个为1,一个为0,结果就为1;否则为0void proc_key()if(key_v & 0x01) = 0)key_times+;if(key_times = 1)TR1 = 1;/开启定时器1else if(key_times = 2)TR1 = 0;elseclr_time();/赋初值全是0key_times = 0;void timer0() interrupt 1/ 定时器0中断服务程序, 用于数码管的动态扫描/ dis_index - 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量/ dis_digit - 位选通值, 传送到P1口用于选通当前数码管的数值, 如等于0xfe时,/选通P2.0口数码管/ dis_buf - 显于缓冲区基地址TH0 = 0xFC;TL0 = 0x17;P1 = 0xff;/ 先关闭所有数码管P0 = dis_bufdis_index;/ 显示代码传送到P0口P1 = dis_digit;/ 主函数中已有dis_digit = 0x7f;打开最高位dis_digit = _cror_(dis_digit,1);/ 位选通值右移(P30-P37), 下次中断时选通下一位数码管dis_index+;/ dis_index &= 0x07;/ 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描,0x07与0x07得到的还是0x07,由0到0x07,扫描完8个void timer1() interrupt 3unsigned char i;TH1 |= 0xdc; /?for(i = 0; i 8; i+)sec_bcdi+;/ 低位加1if(sec_bcdi 10)/ 如果低位满10则向高位进1break;/ 低位未满10sec_bcdi = 0;/ 低位满10清0update_disbuf();/ 更新显示缓冲区void update_disbuf()/ 更新显示缓冲区dis_buf0 = dis_codesec_bcd0;dis_buf1 = dis_codesec_bcd1;dis_buf2 = dis_codesec_bcd2 & 0xff;/ 加上小数点,00.0099.99秒计时,高电平点亮,其余部分与1相与,还是本身;低电平点亮时是0x7fdis_buf3 = dis_codesec_bcd3;dis_buf4 = dis_codesec_bcd4;dis_buf5 = dis_codesec_bcd5;dis_buf6 = dis_codesec_bcd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论