出这个题的目的是让学生掌握IO口作输出口的同时也做输入口,编程时按分时轮换改变IO口状态,在实际电路中检测按键时短暂关闭LED是观察不到的。仿真的效果不如实际电路好。
- #include <REG51.H>
- #define uint unsigned int
- #define uchar unsigned char
- sbit a=P3^0;
- sbit b=P3^6;
- sbit c=P3^7;
- uchar code table1[]={0xfe,0xfd,0xfb,0xf7};
- uchar code table2[]={0xf7,0xfb,0xfd,0xfe};
- uchar key=0x0f;
- void delay(uint k)//延时程序
- {
- uint i,j;
- for(i=k;i>0;i--)
- for(j=125;j>0;j--);
- }
- void keyscan()//按键扫描程序
- {
- uchar i;
- P0=0xff;
- i=P0&0x0f;
- if(i!=0x0f)
- {
- key=i;
- }
- }
- void display()//显示程序
- {
- static uint i=0,j=0;
- if(key==0x0e)
- {
- if(i<250)
- P0&=0x00;
- else P0=0x0f;
- }
- if(key==0x0d)
- {
- P0=0x00;
- }
- if(key==0x0b)
- {
- P0=table1[j];
- }
- if(key==0x07)
- {
- P0=table2[j];
- }
- i++;
- if(i>=500)
- {
- i=0;
- j++;
- j%=4;
- }
- }
- void main(void)
- {
- b=0;
- c=0;
- while(1)
- {
- a=0;
- keyscan();
- a=1;
- display();
- delay(1);
- }
- }
复制代码
|