随手上传
单片机源程序如下:
- /****************************************************
- 电路图说明:
- 使用P3口做为矩阵键盘的输入端,前四位控制行线,后
- 四位控制列线。
- 程序功能:逐列扫描识别法 + 定时查询方式
- 使用数码管显示,4*4矩阵键盘,按下的键号,键盘键号
- 使用行扫描法。
-
- ****************************************************/
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit duan=P2^0;
- sbit wei=P2^1;
- uchar num;//存放数码管显示数值
- uchar code d_table[]={
- 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
- 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,
- 0x39 , 0x5e , 0x79 , 0x71 , 0x00};//共阴0~F段码
- uchar code w_table[]={
- 0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//1-6位选码
- void init();//启动定时器0
- void delay(uint);//最小1ms延迟
- uchar keyscan();//键盘是否按下扫描函数,
- //函数返回按下按键键值,无按键按下时返回16
- void display_2wei(uint);//数码管两位动态显示函数
- void main()
- {
- init();
- while(1)
- {
- ;
- }
- }
- void init()
- {
- num=16;
- EA=1;
- ET0=1;
- ET1=1;
- PT0=1;//将数码管刷新定时器中断定为高优先级
- //以保证数码管正常显示
- TMOD=0x11;
- TH0=(65535-20000)/256;
- TL0=(65535-20000)%256;
- TH1=(65535-10000)/256;
- TL1=(65535-10000)%256;
- TR0=1;
- TR1=1;
- }
- void delay(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- uchar keyscan()//如果无按键按下返回16
- {
- uchar temp,i,key_read;
- static uchar key_value=16;
- temp=0xef;//预置第0列输出0的设置值
- for(i=0;i<4;i++)//4次列扫描
- {
- P3=temp;//4次循环,依次置0->1->2->3列输出0
- if((key_read=P3)!=temp)//判断该列上有无按键按下
- {
- delay(10);
- if((key_read=P3)!=temp)
- {
- key_read=~key_read;
- while(P3!=temp);
- switch(key_read&0x0f)//只留行值
- {
- case 0x01:key_value=i; break;//得第0行按键键号
-
- case 0x02:key_value=4+i; break;//得第1行按键键号
-
- case 0x04:key_value=8+i; break;//得第2行按键键号
-
- case 0x08:key_value=12+i;break;//得第3行按键键号
-
- default: key_value=16;break;
- }
- return key_value;
- }
- }
- temp=(temp<<1)|0x01; //得使下一列输出0的设置值
- }
- return key_value;
- }
- void display_2wei(uint m_num)
- {
- uchar ge,shi;
- ge=m_num%10;
- shi=(m_num/10)%10;
-
- //十位数
- P0=w_table[1];
- wei=1;
- wei=0;
-
- P0=d_table[shi];
- duan=1;
- duan=0;
-
- delay(5);
-
- //个位数
- P0=w_table[2];
- wei=1;
- wei=0;
-
- P0=d_table[ge];
- duan=1;
- duan=0;
-
- delay(5);
- }
- void timer0_20ms() interrupt 1
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
矩阵.rar
(12.49 KB, 下载次数: 10)
|