/*我写的这个计算器可以算255范围以内的整数计算,本打算再加入小数与做最后的处理工作。可是又太费时间,所以就放那里了。看见了你的提问,也懒得改一改,你看看能不能用。*/
#include<reg51.h>
unsigned char Line,Row,Val;
void delay()
{
unsigned char count;
for(count=0;count<255;count++)
;
}
void delay1()
{
unsigned char count,rt;
for(count=0;count<40;count++)
for(rt=0;rt<100;rt++)
;
}
void InitialCPU(void)
{
P0=0xFF;
P1=0x0F;
P2=0xFF;
P3=0xFF;
}
unsigned char leddata[]=; //"0-9"
unsigned char ledbai(unsigned char dat)
{
unsigned char bai;
bai=dat/100;
if(bai==0)
return 0x00;
P2=0x20;
P0=leddata[bai];
delay();
P2=0x00;
return 0x00;
}
unsigned char ledshi(unsigned char dat)
{
unsigned char shi;
shi=(dat%100)/10;
if(shi==0)
return 0x00;
P2=0x40;
P0=leddata[shi];
delay();
P2=0x00;
return 0x00;
}
void ledge(unsigned char dat)
{
unsigned char ge;
ge=dat%10;
P2=0x80;
P0=leddata[ge];
delay();
}
unsigned char bin=1;
void ledplay(unsigned char dat)
{ //LED显示函数
if(bin==1){
ledbai(dat);
bin++;
}
else if(bin==2){
ledshi(dat);
bin++;
}
else if(bin==3){
ledge(dat);
bin=1;
}
}
unsigned char futemp=0,data1=0,data2=0;
void InitialTimer0(void)
{
TMOD=0x01;
TH0=(65536-1000)/256;
TR0=1; //启动T0
EA=1;
ET0=1; //允许T0中断
}
void Timer0(void) interrupt 1 using 3
{
TR0=0;
if(data1==0&&futemp==0&&data2==0){ //LED显示data1,即初始值
ledplay(data1);
}
else if(data1!=0&&futemp==0&&data2==0) // data1有值了,显示data1,
ledplay(data1);
else if(data1==0&&futemp!=0&&data2==0) //有两种可能,1、数据data1为零;2、直接data1没有给它值。总之显示data1
ledplay(data1);
else if(data1!=0&&futemp!=0&&data2==0) //输入的是符号,接着显示data1
ledplay(data1);
else if(data1!=0&&futemp!=0&&data2!=0) //显示的是data2
ledplay(data2);
TH0=(65536-100)/256;
TR0=1;
}
void denghou()
{
data2=0;
futemp=0;
}
unsigned char KeyTemp,CheckValue,Key1=0x00,Key2=0x00;
void Dispose()
{
unsigned char Val;
if(Line==0x01)
Line=0;
else if(Line==0x02)
Line=1;
else if(Line==0x04)
Line=2;
else if(Line==0x08)
Line=3;
if(Row==0x10)
Row=0;
else if(Row==0x20)
Row=1;
else if(Row==0x40)
Row=2;
else if(Row==0x80)
Row=3;
Val=Line*4+Row;
if(Val<10){ //存数
if(futemp==0){ //存在data1中
if(data1==0)
data1=Val;
else
data1=data1*10+Val;
}
else{ //存在data2中
if(data2==0)
data2=Val;
else
data2=data2*10+Val;
}
}
else if(Val>9&&Val<16){
if(Val!=13&&Val!=12)
futemp=Val; //存符号并进行响应处理
else if(Val==12){
data1=0;
data2=0;
futemp=0;
}
else if(Val==13){
if(futemp==10){
data1=data1*data2;
denghou();
}
else if(futemp==11){
data1=data1/data2;
denghou();
}
else if(futemp==14){
data1=data1-data2;
denghou();
}
else if(futemp==15){
data1=data1+data2;
denghou();
}
else{
while(1){
P2=0xff;
P0=0x00;
}
}
}
}
else
while(1){
P2=0xff;
P0=0x00;
} //显示错误
}
unsigned char GetKey1(void)
{
P1=0x0F;
CheckValue=P1^0x0F;
if(CheckValue==0x00)
return 0x00;
else if(CheckValue==0x01)
Line=CheckValue;
else if(CheckValue==0x02)
Line=CheckValue;
else if(CheckValue==0x04)
Line=CheckValue;
else if(CheckValue==0x08)
Line=CheckValue;
Key1=0x0F;
return Key1;
}
unsigned char GetKey2(void)
{
P1=0xF0;
CheckValue=P1^0xF0;
if(CheckValue==0x00)
return 0x00;
else if(CheckValue==0x10)
Row=CheckValue;
else if(CheckValue==0x20)
Row=CheckValue;
else if(CheckValue==0x40)
Row=CheckValue;
else if(CheckValue==0x80)
Row=CheckValue;
delay1();
KeyTemp = P1^0xF0;
if(KeyTemp==CheckValue)
return 0x00;
Key2=0xF0;
return Key2;
}
void main()
{
unsigned char Key1,Key2;
InitialCPU();
InitialTimer0();
while(1)
{
Key1=GetKey1();
Key2=GetKey2();
if(Key1!=0x00&&Key2!=0x00)
{
Dispose();
P3=0x00;
}
}
}
温馨提示:内容为网友见解,仅供参考
键盘输入电路有哪些
独立键盘直接是一个脚接地一个脚接单片机IO口,4*4矩阵键盘如下图:电脑键盘一般时通过门电路控制8个引脚可以控制128个键,一般笔记本代工厂测试键盘就是那样扫描的。。
一天一个设计实例-FPGA和PS\/2键盘
图12 单次操作测试完成后的RTL电路 使用键盘时,5~6个按键同时按下,电脑会发出“哔哔”警报声,键盘立即失效。这是键盘限制设计,不同产品有不同的按键数量限制。默认下,最大按键数量为5~7个。组合键指的是两个以上按键产生的有效按键。例如,按下键输出“字符 a”,按下 + 输出“字符 A”。...
C51单片机用IO口做为几个按键的控制,现在想用4X4键盘控制,请问下面显示...
思路二但是我们在不知道行列式按键之前我们肯定是依次将IO口接一个按键到GND或者到VCC,然后去读IO口去判断哪个按键按下,这也是最简单的方法,但是很浪费IO口,下面这种就结合了这种简单方法和行列式的思路,实现了又多增加3个按键,如下图:这里我们的思路是先依次读IO1、2、3的电平来识别S1、2、3...
按键电路分析
你这应该是视听家电上的电路,上面是红外遥控信号接收部分;左侧是遥控接收部分的电源电路,它取自待机电源,经过电阻分压滤波后给遥控接收模块用;右侧是键盘。左侧对右侧没有直接的影响,因为他们在电路结构上是分离的,只不过电路图画着方便就画在了一起。遥控探头输入信号REMOCON送给遥控解码电路,解码后...
键盘计算机电路板示意图
计算机键盘只是三张软膜,有电路图也没多大用
键盘里面的电路板四根线断了应该按照怎样的顺序连接?
分别确认好断线和电路板上面的+5V和地线后接上,其他2根先不接,上机通电,正常的话上机时3个发光二极管会闪一下,不闪的话重新检查一下。再接上另外2根线,上机通电,看有没有报错,没有的话装回键盘,再试!报错的话把2根线位置对调,上机,看能否正常使用了!参考一下这两幅图 ...
at89c51 3×4键盘电路硬件连接图以及原理
在P1口接一只10K的排阻到电源(上拉),,,然后P1.0--P1.3是接列(4列),,,P1.4---P1.6接行(3行).原理是用扫苗编程查询,先使P1口输出全1,,,然后P1.4-P1.6轮着逐一变低,变低时读取P1口,屏掉高4位,只留低4 位,检查那位为0就是该键按下了....
Dell键盘电路板的接线图
记下2、4、5、6脚分别对应的颜色。 现在再确定键盘印板上接线已脱落的4个焊点:如果对应的位置上有“V、G、L、D”这四个字母,那么:V代表接2脚+5V电源,G代表接5脚接地线,L代表接时钟脉冲的6脚,D则是接4脚数据线。若没有上述标志,则可试按以下办法查找: 键盘印刷电路板上一般都有一只电解...
电路原理图中4*4矩阵键盘怎么画
以下为4*4矩阵连接:A1接B1 A1接B2 A1接B3 A1接B4 A2接B1 A2接B2 A2接B3 A2接B4 A3接B1 A3接B2 A3接B3 A3接B4 A4接B1 A4接B2 A4接B3 A4接B4 共有16种输出状态。
请教各位大神一个问题,电路图如下,单片机3个IO口检6个按键,还能检到S1...
从图中可以看出,使用了12个二极管和16个按键,此方法识别按键过程如下:1. 先将3个IO口都配置成1,相当于上拉输入,然后读取IO的值,只要3个IO的值为非全1,就说明按键BT01~BT07有按键按下,如果读取值全为1,则进行下一步扫描识别。2. 依次的设置其中一个IO口为0,其他两个IO口读,根据要...