完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
1位数码管上先显示零,按下SW0键(外中断1)蜂鸣器发出"答"的一声,数码管递增加数,
到9回零;按下SW1键(外中断0)蜂鸣器发出"笛"的一声,数码管递减减数,到0回9,用外中 断和定时器编程实现? 这是我写代码,但是结果。。。。。 图片上的代码跟这个是一样的 #include "stc15f2k60s2.h" ***it k=P3^2; ***it k2=P3^3; int a,b; //HC595½Ó¿Ú¶¨Òå ***it DAT = P3^7; //HC595´®ÐÐÊý¾ÝÏß ***it SCK = P4^2; //HC595ÒÆλʱÖÓÏß ***it RCK = P4^1; //HC595Ëø´æʱÖÓÏß ***it OE = P4^5; //HC595Êä³öÔÊÐíÏß unsigned char code duanxuan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //È«¾Ö±äÁ¿ //unsigned char duanxuan=0x7d; //¶ÎÑ¡ unsigned char weixuan=0x80; //λѡ void delay (unsigned char ms) { unsigned char a; while ((ms--)!=0) { for (a=0;a<600;a++) {} } } void suocunqi(unsigned char dis,unsigned char dig) //¿ØÖƶÎÑ¡ λѡ { unsigned char i; //¶¨Òå¼ÆÊýÆ÷ unsigned int temp=0; //¶¨ÒåÊý¾Ý±äÁ¿ temp=dis; //½«Á½¸ö8λ±äÁ¿ºÏ²¢³ÉÒ»¸ö16×Ö½Ú±äÁ¿ temp=temp<<8 | dig; OE=1; //HC595Êä³öÔÊÐíÏß ¸ßµçƽ//¹Ø±ÕÏÔʾ for(i=0;i<16;i++) //ËͳöÊý¾Ý { SCK=0; //HC595ÒÆλʱÖÓÏß µÍµçƽ//ÖõÍʱÖÓÏß if( (temp&0x8000)==0x8000 ) //ÏÈ·¢Ë͸ß×Ö½Ú { DAT=1; //HC595´®ÐÐÊý¾ÝÏß ¸ßµçƽ //ÖøßÐźÅÏß } else { DAT=0; //HC595´®ÐÐÊý¾ÝÏß µÍµçƽ//ÖõÍÐźÅÏß } SCK=1; //HC595ÒÆλʱÖÓÏß ¸ßµçƽ//ÖøßʱÖÓÏß temp<<=1; //Êý¾Ý×óÒÆ } //Ëø´æÐźÅÉÏÉýÑØËø´æÊý¾Ý RCK=0; //HC595Ëø´æʱÖÓÏß µÍµçƽ RCK=1; //HC595Ëø´æʱÖÓÏß ¸ßµçƽ OE=0; //HC595Êä³öÔÊÐíÏß µÍµçƽ//´ò¿ªÏÔʾ } void fasongshuju (unsigned char Dat,unsigned char dig ) //·¢Ë͵ãÁÁÊýÂë¹ÜµÄλ Óë ¶Î µÄÊý¾Ý { suocunqi(Dat,~dig); } void chushihua (void) //³õʼ»¯º¯Êý { DAT=1; //HC595´®ÐÐÊý¾ÝÏß ¸ß SCK=1; //HC595ÒÆλʱÖÓÏß ¸ß RCK=1; //HC595Ëø´æʱÖÓÏß ¸ß //Êä³öÔÊÐí£¬¿ªÊ¼ÏÔʾ OE=0; //HC595Êä³öÔÊÐíÏß µÍ } void main(void) //Ö÷º¯Êý { EA=1; ET0=1; EX0=1; IT0=1; IT1=1; EX1=1; TMOD=0X01; TH0=(65536-3000)/256; TL0=(65536-3000)%256; chushihua (); //µ÷Óà ³õʼ»¯º¯Êý fasongshuju(duanxuan[0],weixuan); while(1) { if(k==0) { delay (20); while(k2==1) { a++; if(a>9) { a=0; } } } if(k2==0) { delay(20); while(k==1) { a--; if(a==0) { a=9; } } } } } void time0 (void ) interrupt 1 using 1 { fasongshuju(duanxuan[a],weixuan); TH0=(65536-3000)/256; TL0=(65536-3000)%256; } void int0 (void ) interrupt 0 using 0 { TR0=1; } void int1 (void ) interrupt 2 using 2 { TR0=1; } |
|
相关推荐
8个回答
|
|
要把问题现象说清楚,现在不知道你要问什么问题,程序有几个问题,一,没有判断按键的释放,这样变量a会不停的变化。二,没看到对蜂鸣器的操作。三,主程序没有启动定时器0,估计开始没显示,直到有按键按下才会开始显示。
最佳答案
|
|
|
|
人中狼 发表于 2017-4-23 07:18 蜂鸣器的比较简单,就还没写上去,这个程序一开始是显示0,本来是想按下去以后就开始启动定时器,然后成0-9或9-0这样子的流动,但是实际的是他的显示是乱了,不是一个正常数字 这里该怎么改呢 |
|
|
|
分开调试吧,先把显示调对,要能正确显示想要显示的内容,不知道你是用动态显示还是静态显示,两种的程序不一样,动态的需要定时做显示扫描,显示调好了,再调其他的,可以利用显示做一些提示来判断程序运行状态
|
|
|
|
人中狼 发表于 2017-4-23 11:28 这是动态的吧,显示原来是可以的,就是加上中断后,再加了几个语句就会乱了
|
|
|
|
这是动态显示的电路,不过如果只显示一个数码管,也可以当静态的用,你先把a的值固定不变,把while(1)里面的内容屏蔽,也就是只剩while(1){},外部中断保持,如果没错的话,你的程序应该是上电后无显示或显示不定值,当任意按键按下后显示a的值
|
|
|
|
人中狼 发表于 2017-4-23 12:40 我那while(1)之前有个显示0,我按你的做了,按下后数码管就一直显示原来的0; |
|
|
|
在while(1)之前把显示关闭,什么都不显示,你现在设定的a值是多少,如果没正确显示,那就是定时器没启动,或显示部分有问题
|
|
|
|
谢谢你 大哥,我还是慢慢研究吧,一句两句说不清啊 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11790 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 19:14 , Processed in 0.696398 second(s), Total 87, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号