1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
| /\* Main.c file generated by New Project wizard \* \* Created: 周三 6月 29 2022 \* Processor: AT89C51 \* Compiler: Keil for 8051 \*/ /\*----------------------------------------------- 名称:单个独立按键依次输入控制 内容:如计算器输入数据形式相同 从左往右 利用整个端口扫描读取按键值 ------------------------------------------------\*/ #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define KeyPort P1 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存
unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[10]; //存储显示值的全局变量
void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 void Init\_Timer0(void);//定时器初始化 /\*------------------------------------------------ 主函数 ------------------------------------------------\*/ void main (void) { unsigned char num,i,j;
Init\_Timer0();
while (1) //主循环 { num=KeyScan(); if(num) { if(i<8) TempData[i]= DuanMa[num]; i++; if(i==9)//多出一个按键输入为了清屏 原本应该为8 { i=0; for(j=0;j<8;j++)//清屏 TempData[j]=0; } } //Display(0,8); //显示全部8位 //主循环中添加其他需要一直工作的程序 } } /\*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------\*/ void DelayUs2x(unsigned char t) { while(--t); } /\*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------\*/ void DelayMs(unsigned char t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } /\*------------------------------------------------ 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2 ------------------------------------------------\*/ void Display(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0;
DataPort=0; //清空数据,防止有交替重影 LATCH1=1; //段锁存 LATCH1=0;
DataPort= WeiMa[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0;
DataPort=TempData[i]; //取显示数据,段码 LATCH1=1; //段锁存 LATCH1=0; i++; if(i==Num) i=0;
} /\*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------\*/ void Init\_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } /\*------------------------------------------------ 定时器中断子程序 ------------------------------------------------\*/ void Timer0\_isr(void) interrupt 1 { TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256; Display(0,8); // 调用数码管扫描
}
/\*------------------------------------------------ 按键扫描函数,返回扫描键值 ------------------------------------------------\*/ unsigned char KeyScan(void) { unsigned char keyvalue; if(KeyPort!=0xff) { DelayMs(10); if(KeyPort!=0xff) { keyvalue=KeyPort; while(KeyPort!=0xff); switch(keyvalue) { case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default:return 0;break; } } } return 0; }
|