完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大神,我的数码管不能同时显示,只能一个一个的显示,不知道问题出在哪,求教。程序如下:
#include #include #define uchar unsigned char //类型定义,定义uchar类型 #define uint unsigned int //类型定义,定义uint类型 uint Tcount,ADadv;//定义定时器溢出次数、数据平均值 uint ADnum[10]; //定义数据存储的数组 uint jishu; //定义光照阈值基数符号 int q=0; //存储数组的数量符号 int m=0; //定义按键标志符号 ***it adcs=P2^7;//定义单片机P2.7管脚符号adcs ***it adrd=P2^6;//定义单片机P2.6管脚符号adrd ***it adwr=P2^5;//定义单片机P2.5管脚符号adwr ***it led1=P2^0;//定义单片机P2.0管脚符号 ***it dula=P2^4; //定义单片机P2.4管脚、P2.3管脚符号为 ***it wela=P2^3; //dula、wela ***it s1=P2^2; //定义单片机P2.2管脚符号按键s1 ***it s2=P2^1; //定义单片机P2.1管脚符号按键S2 void delayms(uint xms); void key(); void ad_ini(); void display(uint,uint,uint,uint,uint); uchar code table[]={ //共阴极段码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void main() { uint A1,A2,A3,L1,L2; uint i,j; jishu=60; //设置比较阈值的基数为60LX Tcount=0; TMOD=0x01; //设置定时器/计数器工作方式1 TH0=(65536-50000)/256; //设置定时器/计数器的初值 TL0=(65536-50000)%256; EA=1; //开全局中断允许 ET0=1; //开定时器/计数器T0中断允许 EX0=1; //开外部中断0中断允许 TR0=1; //启动定时器/计数器T0 IT0=1; //外部中断0下降沿触发 ad_ini(); //AD初始化 led1=1; while(1) { if(q>=10) { for(q=0;q<=9;q++) {ADadv=ADnum[q]+ADadv;} ADadv=ADadv/10;//AD采集数据满10个,取平均 } A1=ADadv/100; //计算数据的百位、十位、个位数字 A2=ADadv%100/10; A3=ADadv%10; L1=jishu/10; //计算阈值十位、个位数字 L2=jishu%10; if(m==0) { key(); //键盘扫描 display(A1,A2,A3,L1,L2); //显示 } else for(i=500;i>0;i--) { for(j=110;j>0;j--) m=0; } if(jishu else led1=0; } } void ad_ini() //AD命令管脚先置1 ,为启动做准备 { adcs=1; adrd=1; adwr=1; } void ad_start() //AD转换启动程序 { adcs=0; //AD的片选信号cs adwr=0; //AD的写信号 _nop_(); //等待一个机器周期 _nop_(); adwr=1; adcs=1; } void ad_int() interrupt 0 //转化结束后,INTO自动为0 ,进入该中断程序 { EX0=0; //进入中断后关闭中断使能,防止中断再次进入 P0=0xff; //读取单片机P0端口数据前先给P0端口写1操作 adcs=0; //AD片选信号为0 adrd=0; //AD读信号为0 _nop_(); //等待一个机器周期 _nop_(); ADadv=P0; //将AD转换完成的数字通过P0口读取 adrd=1; //为下一次AD启动做准备 adcs=1; q=q+1; EX0=1; //开外部中断0使能 } void T0_int() interrupt 1 //定时中断 50ms产生个中断,使Tcount加1 { TH0=(65536-50000)/256; //定时器赋初值TH0、TL0 TL0=(65536-50000)%256; Tcount++; //进入该中断的次数 if(Tcount>=10) { ad_start(); //中断次数增加到10时,启动一次AD Tcount=0; //重新计数中断次数 } } void delayms(uint xms) //定义延迟程序 定时时间单位是ms,定时数值 { uint i,j; // 由xms值大小决定。 for(i=xms;i>0;i--) for(j=110;j>0;j--); } void key() { if(s1==0) //判断按键是否按下 delayms(5); //延迟5ms if(s1==0); //再次判断按键是否按下 {jishu=jishu+1; m=1;} //基数上加1,m为按键标志 if(s2==0) //判断按键是否按下 delayms(5); //延迟5ms if(s2==0) //再次判断按键是否按下 { jishu=jishu-1;m=1;} //基数上减1操作 } void display(uint bai,uint shi,uint ge,uint L1,uint L2) { P1=0x00; //消影 dula=1; //选择段选锁存器 P1=table[bai]; //把数据的百位(断码)送入锁存器输入端口 dula=0; //把段选锁存器输出端口数据锁存 P1=0xff; //消影 wela=1; //选择位选锁存器 P1=0xfe; //把位选数据送到位选锁存器输入端口 wela=0; //把位选锁存器输出端口锁存 delayms(500); //延迟5ms P1=0x00; //消影 dula=1; //选择段选锁存器 P1=table[shi]; //把数据的十位(断码)送入锁存器输入端口 dula=0; //把段选锁存器输出端口数据锁存 P1=0xff; //消影 wela=1; //选择位选锁存器 P1=0xfd; //把位选数据送到位选锁存器输入端口 wela=0; //把位选锁存器输出端口锁存 delayms(500); //延迟5ms P1=0x00; //消影 dula=1; //选择段选锁存器 P1=table[ge]; //把数据的个位(断码)送入锁存器输入端口 dula=0; //把段选锁存器输出端口数据锁存 P1=0xff; //消影 wela=1; //选择位选锁存器 P1=0xfb; //把位选数据送到位选锁存器输入端口 wela=0; //把位选锁存器输出端口锁存 delayms(500); //延迟5ms P1=0x00; //消影 dula=1; //选择段选锁存器 P1=table[L1]; //把数据的阈值十位送入锁存器输入端口 dula=0; //把段选锁存器输出端口数据锁存 P1=0xff; //消影 wela=1; //选择位选锁存器 P1=0xf7; //把位选数据送到位选锁存器输入端口 wela=0; //把位选锁存器输出端口锁存 delayms(500); //延迟5ms P1=0x00; //消影 dula=1; //选择段选锁存器 P1=table[L2]; //把数据的阈值个位送入锁存器输入端口 dula=0; //把段选锁存器输出端口数据锁存 P1=0xff; //消影 wela=1; //选择位选锁存器 P1=0xef; //把位选数据送到位选锁存器输入端口 wela=0; //把位选锁存器输出端口锁存 delayms(500); //延迟5ms } |
|
相关推荐
5个回答
|
|
总体循环时间太长了。程序设计不好。
|
|
|
|
发工程上了,这样好累
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
4607 浏览 3 评论
5890 浏览 1 评论
6164 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
7901 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1226 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 11:42 , Processed in 0.606411 second(s), Total 86, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号