数码管
来源:互联网 发布:linux控制台显示中文 编辑:程序博客网 时间:2024/05/30 02:24
六位数码管共阴级显示(0-F)
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
例子:六位数码管从一自动计数
首先是关于六位数码管的数字显示问题
段选位选接口
sbit DX=P2^0;sbit WX=P2^1;
显示六位无符号整数
void displayint(unsigned long n)//显示6位无符号整数{ unsigned char temp; temp=0xdf; if(n==0) { P0=0XFF; /*消除P0的值*/ WX=1; /*位选输入有效*/ P0=temp; /*输出位选码*/ WX=0; /*位选锁存*/ P0=0; /*消除P0的值*/ DX=1; /*段选输入有效*/ P0=table[n];/*输出段码*/ DX=0; /*段码锁存*/ } while(n) { P0=0XFF; /*消除P0的值*/ WX=1; /*位选输入有效*/ P0=temp; /*输出位选码*/ WX=0; /*位选锁存*/ P0=0; /*消除P0的值*/ DX=1; /*段选输入有效*/ P0=table[n%10];/*输出段码*/ DX=0; /*段码锁存*/ temp=_cror_(temp,1); n=n/10; delay(1); }}
显示输入数字
void displayint(unsigned long n)//显示6位无符号整数{ unsigned char i; unsigned char temp=0xfe;//位选 //从左往右(从高位到低为)开始显示 for(i=1;i<=6;i++) { P0=0XFF; /*消除P0的值*/ WX=1; /*位选输入有效*/ P0=temp; /*输出位选码*/ WX=0; /*位选锁存*/ P0=0; /*消除P0的值*/ DX=1; /*段选输入有效*/ P0=table[s[i-1]];/*输出段码*/ DX=0; /*段码锁存*/ temp=_crol_(temp,1); delay(1); }}
独立按键实现相关按键功能
void main(){ EA=1;ET0=1;TMOD=0x01; //初始化定时器T0 while(1) //扫描显示 { //按键一计数功能实现 if(K1==0) //检测到有按键按下 { delay(10);//延迟去抖 if(K1==0) //检测到按键仍然被按下 { TH0=15536/256; //启动定时器T0:晶振12MHz,定时50ms,对应计数值50000,计数初值15536 TL0=15536%256; TR0=1; while(K1==0); //检测按键是否释放 } } //按键二暂停功能实现 if(K2==0) //检测到有按键按下 { delay(10);//延迟去抖 if(K2==0) //检测到按键仍然被按下 { TR0=0;//停止定时器 while(K2==0); //检测按键是否释放 } } //按键三清零功能实现 if(K3==0) //检测到有按键按下 { delay(10);//延迟去抖 if(K3==0) //检测到按键仍然被按下 { TR0=0;//停止定时器,并清零 num=0; while(K3==0); //检测按键是否释放 } } displayint(num); }
按键触发中断T0
void ET0_INT() interrupt 1
{ TH0=15536/256; TL0=15536%256; c++; if(c==20) {c=0;num++;}}
完整代码
//独立按键(3个按键,6位数码管)//按下K1启动自动计数(每秒加1,要用到定时器),显示在数码管上,接P3^0//按下K2暂停自动计数,接P3^1//按下K3计数值清零停止计数,接P3^2#include <reg51.h>#include <intrins.h>#define uch8 unsigned charsbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^7;sbit DX=P2^0;sbit WX=P2^1;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};unsigned long num=0;//计数值unsigned char c=0;//定时器定时为50ms,定时20次为1svoid delay(int x) //延时x毫秒{int i,j; for(i=0;i<x;i++) for(j=0;j<115;j++) ;}void displayint(unsigned long n)//显示6位无符号整数{ uch8 temp; temp=0xdf; if(n==0) { P0=0XFF; /*消除P0的值*/ WX=1; /*位选输入有效*/ P0=temp; /*输出位选码*/ WX=0; /*位选锁存*/ P0=0; /*消除P0的值*/ DX=1; /*段选输入有效*/ P0=table[n];/*输出段码*/ DX=0; /*段码锁存*/ } while(n) { P0=0XFF; /*消除P0的值*/ WX=1; /*位选输入有效*/ P0=temp; /*输出位选码*/ WX=0; /*位选锁存*/ P0=0; /*消除P0的值*/ DX=1; /*段选输入有效*/ P0=table[n%10];/*输出段码*/ DX=0; /*段码锁存*/ temp=_cror_(temp,1); n=n/10; delay(1); }}void main(){ EA=1;ET0=1;TMOD=0x01; //初始化定时器T0 while(1) //扫描显示 { if(K1==0) //检测到有按键按下 { delay(10);//延迟去抖 if(K1==0) //检测到按键仍然被按下 { TH0=15536/256; //启动定时器T0:晶振12MHz,定时50ms,对应计数值50000,计数初值15536 TL0=15536%256; TR0=1; while(K1==0); //检测按键是否释放 } } if(K2==0) //检测到有按键按下 { delay(10);//延迟去抖 if(K2==0) //检测到按键仍然被按下 { TR0=0;//停止定时器 while(K2==0); //检测按键是否释放 } } if(K3==0) //检测到有按键按下 { delay(10);//延迟去抖 if(K3==0) //检测到按键仍然被按下 { TR0=0;//停止定时器,并清零 num=0; while(K3==0); //检测按键是否释放 } } displayint(num); } /*另一种方法 while(1) //扫描显示 { temp=P3; temp=temp&0x07; //只取低3位 if(temp!=0x07) //检测到有按键按下 { delay(10);//延迟 temp=P3; temp=temp&0x07; if(temp!=0x07) //检测到按键仍然被按下 switch(temp) { case 0x06:TH0=15536/256;TL0=15536%256;TR0=1;break;//启动定时器T0:晶振12MHz,定时50ms,对应计数值50000,计数初值15536 case 0x05:TR0=0;break;//停止定时器 case 0x03:TR0=0;num=0;//停止定时器,并清零 } do{temp=P3; //检测按键是否释放 temp=temp&0x07; }while(temp!=0x07); } displayint(num); } */}void ET0_INT() interrupt 1{ TH0=15536/256; TL0=15536%256; c++; if(c==20) {c=0;num++;}}
阅读全文
0 0
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管:
- 数码管
- 数码管显示
- 数码管程序
- 单词查找树
- hello world!——VS使用教程
- Refactoring_Improving_the_design_of_existing_code--笔记
- Android异步处理技术
- python学习系列(三)字符串和列表的操作
- 数码管
- 经验风险最小化与模型选择
- 【约瑟夫环】Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置。
- 3---------最短路径--迪杰斯特拉算法
- display属性的深入理解和总结
- 1003. Emergency (25)(经典的dfs)
- Octave教程三:Computing On Data
- 35 个 Java 代码性能优化总结
- Android函数响应式编程——必学的RxJava组合操作符startWith、merge、concat、zip、combineLastest