标题:
51单片机键盘芯片74C922驱动代码
[打印本页]
作者:
irisice008
时间:
2019-5-28 10:40
标题:
51单片机键盘芯片74C922驱动代码
74C922.PNG
(81.93 KB, 下载次数: 39)
下载附件
2019-5-31 08:11 上传
#include <reg51.h>
#include <intrins.h>
#include <math.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()
const float ZERO = 0.1;
uchar key = 16;
long intValue = 0;
float pointValue = 0.0;
float mixValue = 0.0;
uchar pointPos = 0;
uchar numCount = 0;
uchar pointCount = 0;
uchar intFlag = 0;
uchar code SEG_DAT[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code BIT_CS[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void display(float floatValue);
sbit SH_CP = P0^0; //移位串行时钟脉冲
sbit DS = P0^1; //串行数据输入
sbit ST_CP = P0^2; //数据并行输出锁存器控制脉冲
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
{
if (intFlag == 1)
{
display(mixValue*100);
}
else
{
display(mixValue);
}
for(j=0;j<120;j++);
}
}
//串行输入子程序
void Serial_Input_595(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++)
{
if (dat&0x80) //发送高位
{
DS = 1;
}
else
{
DS = 0;
}
dat <<= 1; //次高位左移到高位
SH_CP = 0; //移位时钟线拉低
nop();
nop();
SH_CP = 1; //DS位上的0或1在移位脉冲上升沿被移入595
nop();
nop();
}
}
//并行输出子程序
void Parallel_Output_595()
{
ST_CP = 0;
nop();
nop();
ST_CP = 1; //上升沿将数据送到输出锁存器
nop();
nop();
}
void display(float floatValue)
{
uchar i=0;
uchar a[6];
uchar temp;
long intValue;
if (floatValue<ZERO)
{
numCount = 0;
pointPos = 0;
pointCount = 0;
intValue = 0;
pointValue = 0;
mixValue = 0;
intFlag = 0;
floatValue = 0;
}
switch (pointCount)
{
case 0:
intValue = floatValue;
break;
case 1:
intValue = floatValue*10;
break;
case 2:
intValue = floatValue*100;
break;
case 3:
intValue = floatValue*1000;
break;
case 4:
intValue = floatValue*10000;
break;
case 5:
intValue = floatValue*100000;
break;
case 6:
intValue = floatValue*1000000;
break;
default:
break;
}
a[0]=intValue/100000;
a[1]=(intValue%100000)/10000;
a[2]=(intValue%10000)/1000;
a[3]=(intValue%10000%1000)/100;
a[4]=(intValue%10000%1000%100)/10;
a[5]=intValue%10;
for(i = 0; i <= 5; i++)
{
Serial_Input_595(BIT_CS[i]);
temp=a[i];
if (pointPos == 0)
{
Serial_Input_595(SEG_DAT[temp]);
Parallel_Output_595();
}
else
{
//if (i == (5 + pointPos - numCount))
if (i == 5 - (numCount - pointPos))
{
Serial_Input_595(SEG_DAT[temp]|0x80);
}
else
{
Serial_Input_595(SEG_DAT[temp]);
}
Parallel_Output_595();
}
}
}
uchar translate(uint keyCode)
{
switch(keyCode)
{
case 0:
return '7';
break;
case 1:
return '4';
break;
case 2:
return '1';
break;
case 3:
return 'c';
break;
case 4:
return '8';
break;
case 5:
return '5';
break;
case 6:
return '2';
break;
case 7:
return '0';
break;
case 8:
return '9';
break;
case 9:
return '6';
break;
case 10:
return '3';
break;
case 11:
return '=';
break;
case 12:
return '/';
break;
case 13:
return '*';
break;
case 14:
return '-';
break;
case 15:
return '+';
break;
default:
break;
}
}
void extern0_init(void)
{
IT0=1;
EX0=1;
EA=1;
}
void extern0(void) interrupt 0
{
key = translate(P1 & 0x0f);
if (key <= '9' && key >= '0') //判断按下的键是否为数值
{
numCount++;
if (pointPos == 0)
{
intValue = intValue*10 + (key-'0');
}
else
{
pointCount++;
switch (pointCount)
{
case 1:
pointValue = pointValue + (key-'0')*0.1;
break;
case 2:
pointValue = pointValue + (key-'0')*0.01;
break;
case 3:
pointValue = pointValue + (key-'0')*0.001;
break;
case 4:
pointValue = pointValue + (key-'0')*0.0001;
break;
case 5:
pointValue = pointValue + (key-'0')*0.00001;
break;
case 6:
pointValue = pointValue + (key-'0')*0.000001;
break;
}
}
mixValue = intValue + pointValue;
if(mixValue>=ZERO && mixValue<=999999.0) //当前数值是否超出限定范围
{
}
else
{
numCount = 0;
pointPos = 0;
pointCount = 0;
intValue = 0;
pointValue = 0;
mixValue = 0;
intFlag = 0;
}
}
else
{
switch (key)
{
case 'c':
numCount = 0;
pointPos = 0;
pointCount = 0;
intValue = 0;
pointValue = 0;
mixValue = 0;
intFlag = 0;
break;
case '=':
pointPos = numCount; //记录小数点的位置
break;
case '-':
if (pointCount == 0)
{
numCount = 0;
pointPos = -2;
intFlag = 1;
}
while(mixValue>ZERO)
{
mixValue = mixValue - 0.254;
delay(10);
}
if (mixValue<=ZERO)
{
numCount = 0;
pointPos = 0;
pointCount = 0;
intValue = 0;
pointValue = 0;
mixValue = 0;
intFlag = 0;
}
break;
}
}
}
void main(void)
{
extern0_init();
mixValue = -5;
while(1)
{
if (intFlag == 1)
{
display(mixValue*100);
}
else
{
display(mixValue);
}
}
}
复制代码
全部资料51hei下载地址:
74C922.rar
(84.54 KB, 下载次数: 10)
2019-5-31 08:11 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-5-28 19:47
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1