完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
8位数码管电子时钟 两个定时器 t0 记时 t1 扫描
#include #define uint unsigned int #define uchar unsigned char uint h=0,m=0,s=0,t0=0,i=0,t1=0; uchar d[8]; //段显示 uchar code n[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //数码管码段 uchar code w[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位扫描 /*************************端口初始化*************************/ void init() { TMOD=0X11; //选择定时器1和0,工作方式1,内部控制定时器开关 TH0=47104/256; //定时器0初值高8位 定时10ms TL0=47104%256; // 初值低8位 TH1=65036/256; //定时器1初值 TL1=65036%256; // EA=1; //打开总中断 ET0=1; //允许定时器0中断 ET1=1; TR1=1; TR0=1; //打开定时器 } /*************************处理显示数据*************************/ void led_display() { d[0]=n[s%10]; //显示秒 d[1]=n[s/10]; d[2]=n[10]; //显示"-" d[3]=n[m%10]; //显示分钟 d[4]=n[m/10]; d[5]=n[10]; //显示"-" d[6]=n[h%10]; //显示小时 d[7]=n[h/10]; } /*************************数码管扫描*************************/ void scan() { if(t1>10) //数码管扫描 1ms多一次 { t1=0; for (i=0;i<8;i++) { P2=w[i]; P0=d[i]; } } } /*************************定时器0中断*************************/ void time0() interrupt 1 { TH0=47104/256; //初值高8位 定时10ms TL0=47104%256; //初值低8位 t0++; } /*************************定时器1中断*************************/ void time1() interrupt 3 { TH1=65036/256; TL1=65036%256; t1++; } /*************************时间处理*************************/ void time() { if(t0==100) //时间进制处理 { t0=0; s++; if(s==60) { s=0; if(m<60) m++; else { m=0; if(h==24) h=0; else h++; } } } } /*************************主程序*************************/ void main() { init(); while(1) { time(); led_display(); scan(); } } /********************************************************/ |
|
|
|
|
|
独立键盘
#include #define uint unsigned int #define uchar unsigned char uchar code key_code[]={0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7};//k1-k8 uchar code led_code[]={0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80,0x00};//1-8 uint t,key; uint keyscan() { uchar keynum,keynum1,keynum2; uint k,i; P1=0XF0; P3=0X3C; keynum1=P1; keynum2=P3; keynum=(keynum2>>2)|keynum1; if (keynum != 0xff) { t=0; while(t<10); keynum1=P1; keynum2=P3; keynum=(keynum2>>2)|keynum1; if(keynum!=0xff) { for(i=0;i<8;i++) { if(keynum==key_code[i]) k=i; } } } else k=8; return k; } void display(uint d) { P2=0XFE; P0=led_code[d]; } void unit() { TMOD=0X01; TH0=64536/256; TL0=64536%256; ET0=1; TR0=1; EA=1; } void main() { unit(); while (1) { key=keyscan(); display(key); } } void timer0() interrupt 1 { TH0=64536/256; TL0=64536%256; t++; if(t==100) t=0; } |
|
|
|
|
|
/****************矩阵键盘*************/
#include #define uint unsigned int #define uchar unsigned char uchar code key_code[]= { 0xee,0xed,0xeb,0xe7, 0xde,0xdd,0xdb,0xd7, 0xbe,0xbd,0xbb,0xb7, 0x7e,0x7d,0x7b,0x77 }; uchar code led_code[]= { 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e,0xff }; /*************延时**************/ void delay(uint ms) { uchar i; while(ms--) { for(i=0;i<114;i++); } } /***********键盘扫描***********/ uint scankey() { uchar key_l,key_h,keynum,i; uint key; P1=0x0f; //低四位有效,判断按键所在列 key_l=P1; if(key_l!=0x0f) { delay(5); //去抖 key_l=P1; if(key_l!=0x0f) { P1=0XF0; //高四位有效,判断按键所在行 key_h=P1; keynum=key_l|key_h; //组合成按键码 for(i=0;i<16;i++) //匹配按键码对应键值 { if(keynum==key_code[i]) key=i; } return key; //返回键值 } } return key=16; //无按键 ,返回无效,数码管不亮 } /*********数码管显示**********/ void display(uint led_num) { P2=0xfe; P0=led_code[led_num]; } /***********主函数************/ void main() { display(scankey()); } |
|
|
|
|
|
单片机无非是IO口的操作 ,不过还是感谢LZ分享!
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
552 浏览 0 评论
706 浏览 0 评论
883 浏览 0 评论
839 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
775 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
17069 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-15 07:42 , Processed in 0.745575 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1629