实验1 单片机IO口应用及数码管显示
时间:11-19
来源:互联网
点击:
抖动
if(PRESSED==IsCountKey){//当按键按下
while(PRESSED==IsCountKey){//当按键一直按下
DisplayNumByOrder(count);//显示原数值
}
}
}
}
//扫描键盘
voidmain(){
intcount=0;
while(1){
IsCount(count);
count++;
DisplayNumByOrder(count);
if(count==)count=0;
}
}
#define unit unsigned int
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
//数码管前三位显示一个跑表,从到之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
sbit Key1=P3^0;//开始
sbit Key2=P3^1;//暂停
sbit Key3=P3^2;//清零
constbit PRESSED=0;//按下
constbit SUSPEND=1;//0的时候运行,1的时候暂停
//监测
voiddelay_1ms(unit x){
unit i=x;
unit j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在数码管上显示对应的值
**/
voiddisplay(unsignedcharNum)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0;//送完段选信号后,进行消影的处理
}
/**
控制数码管显示后3位,并分解计数值
**/
voidDisplayNumByOrder(unit Count){
low=0;mid=0;high=0;display(0);
low=1;mid=0;high=0;display(0);
low=0;mid=1;high=0;display(0);
low=1;mid=1;high=0;display(0);
low=0;mid=0;high=1;display(0);
low=1;mid=0;high=1;display(Count%1/100);
low=0;mid=1;high=1;display(Count%100/10);
low=1;mid=1;high=1;display(Count%10);
}
//是否清零
voidIsClear(unit*count){
if(PRESSED==Key3){//当按键按下
delay_1ms(10);//去抖动
if(PRESSED==Key3){//当按键按下
*count=0;
}
}
}
//是否暂停
voidIsSuspend(unit*count){
if(PRESSED==Key2){//当按键按下
delay_1ms(10);//去抖动
if(PRESSED==Key2){//当按键按下
while(SUSPEND){
IsClear(count);//监测是否需要清零
if(PRESSED==Key1)return;//跳出暂停
DisplayNumByOrder(*count);//显示原数值
}
}
}
}
//扫描键盘
voidmain(){
intcount=0;
while(1){
IsSuspend(&count);
IsClear(&count);
count++;
DisplayNumByOrder(count);
if(count==)count=0;
}
}
#include
#define unit unsigned int
#define uchar unsigned char
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
//10.按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
sbit Key1=P3^0;//开始
sbit Key2=P3^1;//暂停
sbit Key3=P3^2;//清零
constbit PRESSED=0;//按下
constbit SUSPEND=1;//0的时候运行,1的时候暂停
//延时
voiddelay_1ms(unit x){
unit i=x;
unit j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在数码管上显示对应的值
**/
voiddisplay(unsignedcharNum)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0;//送完段选信号后,进行消影的处理
}
/**
控制数码管显示后3位,并分解计数值
**/
voidDisplayNumByOrder(unit Count){
low=0;mid=0;high=0;display(0);
low=1;mid=0;high=0;display(0);
low=0;mid=1;high=0;display(0);
low=1;mid=1;high=0;display(0);
low=0;mid=0;high=1;display(0);
low=1;mid=0;high=1;display(Count%1/100);
low=0;mid=1;high=1;display(Count%100/10);
low=1;mid=1;high=1;display(Count%10);
}
//是否清零
voidIsClear(unit*count){
if(PRESSED==Key3){//当按键按下
delay_1ms(10);//去抖动
if(PRESSED==Key3){//当按键按下
*count=0;
}
}
}
//是否暂停
voidIsSuspend(unit*count){
if(PRESSED==Key2){//当按键按下
delay_1ms(10);//去抖动
if(PRESSED==Key2){//当按键按下
while(SUSPEND){
IsClear(count);//监测是否需要清零
if(PRESSED==Key1)return;//跳出暂停
DisplayNumByOrder(*count);//显示原数值
}
}
}
}
uchar scanKey(){
uchar tmp,key;
P3=0xf0;
tmp=P3;
tmp=tmp&0xf0;
if(tmp!=0xf0){//确定列
switch(tmp){
case0xe0:key=1;break;
case0xd0:key=2;break;
case0xb0:key=3;break;
case0x70:key=4;break;
}
}
//确定行
P3=0x0f;
tmp=P3;
tmp=tmp&0x0f;
if(tmp!=0x0f){
switch(tmp){
case0x0d:key=key;break;
case0x0b:key=4+key;break;
case0x07:key=8+key;break;
}
}
returnkey;
}
//扫描键盘
voidmain(){
// int count=0;
while(1){
unit key=scanKey();
DisplayNumByOrder(key*key);
}
}
if(PRESSED==IsCountKey){//当按键按下
while(PRESSED==IsCountKey){//当按键一直按下
DisplayNumByOrder(count);//显示原数值
}
}
}
}
//扫描键盘
voidmain(){
intcount=0;
while(1){
IsCount(count);
count++;
DisplayNumByOrder(count);
if(count==)count=0;
}
}
9.在上题的基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。
#include#define unit unsigned int
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
//数码管前三位显示一个跑表,从到之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
sbit Key1=P3^0;//开始
sbit Key2=P3^1;//暂停
sbit Key3=P3^2;//清零
constbit PRESSED=0;//按下
constbit SUSPEND=1;//0的时候运行,1的时候暂停
//监测
voiddelay_1ms(unit x){
unit i=x;
unit j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在数码管上显示对应的值
**/
voiddisplay(unsignedcharNum)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0;//送完段选信号后,进行消影的处理
}
/**
控制数码管显示后3位,并分解计数值
**/
voidDisplayNumByOrder(unit Count){
low=0;mid=0;high=0;display(0);
low=1;mid=0;high=0;display(0);
low=0;mid=1;high=0;display(0);
low=1;mid=1;high=0;display(0);
low=0;mid=0;high=1;display(0);
low=1;mid=0;high=1;display(Count%1/100);
low=0;mid=1;high=1;display(Count%100/10);
low=1;mid=1;high=1;display(Count%10);
}
//是否清零
voidIsClear(unit*count){
if(PRESSED==Key3){//当按键按下
delay_1ms(10);//去抖动
if(PRESSED==Key3){//当按键按下
*count=0;
}
}
}
//是否暂停
voidIsSuspend(unit*count){
if(PRESSED==Key2){//当按键按下
delay_1ms(10);//去抖动
if(PRESSED==Key2){//当按键按下
while(SUSPEND){
IsClear(count);//监测是否需要清零
if(PRESSED==Key1)return;//跳出暂停
DisplayNumByOrder(*count);//显示原数值
}
}
}
}
//扫描键盘
voidmain(){
intcount=0;
while(1){
IsSuspend(&count);
IsClear(&count);
count++;
DisplayNumByOrder(count);
if(count==)count=0;
}
}
10.按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
#include#include
#define unit unsigned int
#define uchar unsigned char
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
//10.按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
sbit Key1=P3^0;//开始
sbit Key2=P3^1;//暂停
sbit Key3=P3^2;//清零
constbit PRESSED=0;//按下
constbit SUSPEND=1;//0的时候运行,1的时候暂停
//延时
voiddelay_1ms(unit x){
unit i=x;
unit j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在数码管上显示对应的值
**/
voiddisplay(unsignedcharNum)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0;//送完段选信号后,进行消影的处理
}
/**
控制数码管显示后3位,并分解计数值
**/
voidDisplayNumByOrder(unit Count){
low=0;mid=0;high=0;display(0);
low=1;mid=0;high=0;display(0);
low=0;mid=1;high=0;display(0);
low=1;mid=1;high=0;display(0);
low=0;mid=0;high=1;display(0);
low=1;mid=0;high=1;display(Count%1/100);
low=0;mid=1;high=1;display(Count%100/10);
low=1;mid=1;high=1;display(Count%10);
}
//是否清零
voidIsClear(unit*count){
if(PRESSED==Key3){//当按键按下
delay_1ms(10);//去抖动
if(PRESSED==Key3){//当按键按下
*count=0;
}
}
}
//是否暂停
voidIsSuspend(unit*count){
if(PRESSED==Key2){//当按键按下
delay_1ms(10);//去抖动
if(PRESSED==Key2){//当按键按下
while(SUSPEND){
IsClear(count);//监测是否需要清零
if(PRESSED==Key1)return;//跳出暂停
DisplayNumByOrder(*count);//显示原数值
}
}
}
}
uchar scanKey(){
uchar tmp,key;
P3=0xf0;
tmp=P3;
tmp=tmp&0xf0;
if(tmp!=0xf0){//确定列
switch(tmp){
case0xe0:key=1;break;
case0xd0:key=2;break;
case0xb0:key=3;break;
case0x70:key=4;break;
}
}
//确定行
P3=0x0f;
tmp=P3;
tmp=tmp&0x0f;
if(tmp!=0x0f){
switch(tmp){
case0x0d:key=key;break;
case0x0b:key=4+key;break;
case0x07:key=8+key;break;
}
}
returnkey;
}
//扫描键盘
voidmain(){
// int count=0;
while(1){
unit key=scanKey();
DisplayNumByOrder(key*key);
}
}
单片机IO口数码管显 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)