|
如果没有改的话,应该适用于仪电学院的嵌入式内容吧。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h> //此文件中定义了单片机的一些特殊功能寄存器
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define out P3 //作为译码管信号输出端口
- #define outk P1
- uchar scan(void);
- uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- void led(void);
- void delay(int m);
- unsigned char L[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
- void main()
- {
- uchar key;
- unsigned char i;
- while(1)
- {
- for(i=0;i<8;i++)
- {
- P0=~L[i];
- key=scan();
- if(key!=-1)
- out=seg[key];
- delay(200);
- }
- }
- }
- //键盘扫描函数
- uchar scan(void)
- {
- uchar k=-1,m,n,temp;
- outk=0xf0; //设置按键是否有被按下
- if((outk&0xf0)!=0xf0)
- {
- for(m=0;m<4;m++) //分别扫描1-4行
- {
- outk=~(0x01<<m); //设置第一行对应位=0,其余为1(将0x01转换为2进制,左移m位,后面补0)
- for(n=0;n<4;n++) //扫描列
- {
- temp=outk;
- temp=temp>>(4+n); //高4位挪到低4位,然后再移位比较
- if((temp&0x01)==0) //用最低位判断是否为0
- {
- delay(20);
- if((temp&0x01)==0)
- {k=n+m*4;break;} //哪一行的那一列计算,二次判断去抖
- }
- }
- if(k!=-1){break;}
- }
- }
- return(k);
- }
- //延时函数
- void delay(int m)
- {
- int i,j;
- for(i=0;i<m;i++)
- {for(j=0;j<125;j++);}//时钟频率为12MHz,ms
- }
复制代码
Keil代码与Proteus8.8仿真下载:
流水灯 按键显示.zip
(114.9 KB, 下载次数: 33)
|
评分
-
查看全部评分
|