完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
//基于pic16f676宝贵的IO,本程序使用2片74HC595
//驱动8位数码管的小时钟。可做成实物,特附proteus仿真图。 //小弟初学,水平有限,大家多多指点,不吝赐教。 //QQ交流:271344691 #include #define uint unsigned int #define uchar unsigned char #define SH_CP RC0//595端口 #define DS RC1 #define ST_CP RC2 #define key0 RC3//按键端口 #define key1 RC4 #define key2 RC5 #define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒 const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码 uchar sec=0; uchar min=0,hour=0; uchar count=0; __CONFIG(0X0002);//外接16MHZ晶振 void delayms(uint z) //1ms延时函数 { uint x,y; for(x=z;x>0;x--) for(y=100;y>0;y--); } void delayus(uint z) { uint x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); } void serial_input_595(uint dat) { for(uchar i=0;i<8;i++) { if(dat&0x80) DS=1;else DS=0; dat<<=1; SH_CP=0;delayus(3); SH_CP=1;delayus(3); SH_CP=0;delayus(3); } } void parallel_output_595() { ST_CP=0;delayus(2); ST_CP=1;delayus(2); ST_CP=0;delayus(2); } void distime()//显示时间 { serial_input_595(0x01); serial_input_595(table[hour/10]); parallel_output_595(); delayms(1); serial_input_595(0x02); serial_input_595(table[hour%10]); parallel_output_595(); delayms(1); serial_input_595(0x04); serial_input_595(table[10]); parallel_output_595(); delayms(1); serial_input_595(0x08); serial_input_595(table[min/10]); parallel_output_595(); delayms(1); serial_input_595(0x10); serial_input_595(table[min%10]); parallel_output_595(); delayms(1); serial_input_595(0x20); serial_input_595(table[10]); parallel_output_595(); delayms(1); serial_input_595(0x40); serial_input_595(table[sec/10]); parallel_output_595(); delayms(1); serial_input_595(0x80); serial_input_595(table[sec%10]); parallel_output_595(); delayms(1); } void keyscan()//简单按键处理,实现调时。 { if(key0==0) { delayms(10); if(key0==0) { sec++; if(sec==60) sec=0; distime(); } while(key0==0); } if(key1==0) { delayms(10); if(key1==0) { min++; if(min==60) min=0; distime(); } while(key1==0); } if(key2==0) { delayms(10); if(key2==0) { hour++; if(hour==24) hour=0; distime(); } while(key2==0); } } void main() { TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写 TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读 PORTC=0XFF; ANSEL=0X00; T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间 TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF; //TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样 // TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。 TMR1CS=0; TMR1IF=0; TMR1IE=1; TMR1ON=1; GIE=1; PEIE=1; while(1) { distime(); keyscan(); } } void interrupt TMR_CONTROLL() { if(TMR1IF==1) { //TMR0=6; count++; if(count==100)//16M crystal { count=0; sec++; if(sec==60) { sec=0; min++; if(min==60) { min=0; hour++; if(hour==24) { hour=0; } } } } //TMR1H=(65536-5000)/256; // TMR1L=(65536-5000)%256; TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8; TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF; TMR1IF=0; } }
|
|
相关推荐
|
|
![]() ![]() ![]() |
|
|
|
|
|
void distime()//显示时间,这个函数调用74hc595的输入程序是依次选中高位,再输入欲显示的数,程序运行是可行的吗?
|
|
|
|
|
|
顶个。。。。。。。。。。。。。。
|
|
|
|
|
|
顶顶,顶顶顶,正好看看,多谢
|
|
|
|
|
|
好好学习一下,谢谢分享
|
|
|
|
|
|
学习中,谢谢分享
|
|
|
|
|
|
学习中,谢谢分享
|
|
|
|
|
|
下载学习,希望多多通过源码。谢谢!!!
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2005 浏览 1 评论
3124 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2248 浏览 2 评论
2671 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
3869 浏览 5 评论
780浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6213浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-19 09:52 , Processed in 0.889177 second(s), Total 80, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191