📄 text1.c
字号:
#include "c8051f020.h"
sbit key_key = P3^6;
sbit Clock_7281 = P3^5;
sbit Data_7281 = P3^4;
unsigned char Timer3Counter1;
unsigned char key_value[8]={0};
unsigned char key_value1[8];
unsigned char add[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char add1[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
bit key_flag;
//外部中断6(键盘用)
void ExtentInt6 (void) interrupt 18 {
P3IF &= 0XBF;
key_flag = 1;
}
//定时器3中断
void Timer3Int(void) interrupt 14 {
TMR3CN &= 0X7F; //清中断标志
Timer3Counter1++;
}
/******************** 系统函数 ********************/
// 端口初始化
void PortInitialization ( void ) {
//*******************************//
//PXDIN : 0=模拟输入;1=数字输入.//
//*******************************//
//*******************************//
//PXDOUT : 0=漏极开路;1=推挽输出.//
//*******************************//
XBR0 = 0X00;
XBR1 = 0X00; //
XBR2 = 0X00; //关闭弱上拉
EMI0CN = 0; //
EMI0CF = 0X2c; //外部存储器高端复用方式
EMI0TC = 0Xcf; //时序选择,地址建立时间很重要哦
P3MDOUT = 0X20; //
P3 = 0X70; //
XBR2 = 0X40; //交叉开关使能
P74OUT = 0XFF; //推挽输出,总线上都接上拉电阻;
//如果漏开则不行因为1将其置为高阻
}
// 将系统时钟设置为外部时钟 24 MHZ
void ExternalClock ( void ) {
unsigned int i;
OSCXCN = 0x67; // 定义外部时钟,并使能
for (i = 3000;i > 0;i--); // 等待 1 ms,使外部时钟稳定
while ((OSCXCN & 0x80) == 0); // 检测时钟准备好标志
OSCICN = 0x08; // 禁止内部时钟,选择外部时钟
}
void ExternIntInit(void){ //外部中断初始化
P3IF = 0X00; //下降沿触发,中断向量为18
EIE2 = 0X10; //允许EX6中断
}
void Timer3Init(){ //定时器3初始化
TMR3CN = 0X00;
TMR3RLL = 0X30; //1ms定时
TMR3RLH = 0XF8;
TMR3L = 0X30;
TMR3H = 0XF8;
EIE2 |= 0X01; //ET3 = 1;
}
void Delay ( unsigned int n ) {
for ( ; n > 0; n --);
}
//R=3K3,C=20PF,OSC=4.5MHz
//#pragma disable //关中断
void Write_7281 ( unsigned char ddata ) {
unsigned char i;
Data_7281 = 1; //漏开置1
Clock_7281 = 0; //9us
Clock_7281 = 1;
do { // 建立握手信号,发送一系列脉冲
Clock_7281 = 0;
Delay(6);
Clock_7281 = 1;
Delay(6);
} while ( Data_7281 ); // 等待bc7281a 发送低电平,表示准备好
Clock_7281 = 0; // 15us内再发送一时钟信号
Delay(6);
Clock_7281 = 1;
Delay(6);
while ( !Data_7281 ); // Data_7281 回高电平
for( i = 0; i < 8; i ++ ) {
if ( ddata & 0x80 ) // 发送第7..0位
Data_7281 = 1;
else
Data_7281 = 0;
Delay(10);
ddata = ddata << 1; // 发送一时钟信号
Clock_7281 = 0;
Delay(6);
Clock_7281 = 1;
Delay ( 6 ); // 延时
}
Data_7281 = 1; // 回高电平
Clock_7281 = 1;
Delay ( 1 );
}
// bc7281a 字节读
//#pragma disable //关中断
unsigned char Read_7281 ( void ) {
unsigned char i;
unsigned char ddata =0 ;
Data_7281 = 1; //漏开置1
Clock_7281 = 0; // 发送一单一握手脉冲 25us
Delay(6);
Clock_7281 = 1;
Delay(6);
while ( Data_7281 ); // 等待bc7281a 发送低电平,表示准备好
Data_7281 = 1; //漏开置1
Clock_7281 = 0; // 15us内再发送一时钟信号 9us
Delay(6);
Clock_7281 = 1;
Delay(6);
for ( i = 0; i < 8; i ++ ) {
Delay ( 20 );
Data_7281 = 1; //漏开置1
ddata = ddata << 1;
if ( Data_7281 ) // 接收第7..0位
ddata = ddata | 0x01;
Clock_7281 = 0; // 15 us内发送一时钟信号
Delay ( 10 );
Clock_7281 = 1;
Delay(10);
}
Clock_7281 = 0; // 发送一时钟信号,表示接收完毕
Delay ( 12 );
Clock_7281 = 1;
Delay ( 20 );
return ddata;
}
void BC7281Init(){
Write_7281 ( 0x12 ); // 写BC7281B工作模式寄存器
Write_7281 ( 0x8e ); // 扫描使能,扩展开关,164模式,扩展闪烁模式,输出反向,键盘工作模式为' 1 '
Write_7281 ( 0x11 ); // 写闪烁速度控制寄存器
Write_7281 ( 0x80 ); // 闪烁频率 2 HZ
Write_7281 ( 0x10 ); // 初始化时,不闪烁显示
Write_7281 ( 0xFF ); // 1不闪烁
Write_7281 ( 0x19 );
Write_7281 ( 0xFF );
}
min(unsigned char a,b,c,d){
unsigned char m;
m=a;
if(a>=b) m=b;
if(m>c) m=c;
if(m>d) m=d;
return( m);
}
zs(unsigned char j)
{unsigned char i;
unsigned int m;
m=1;
for(i=0;i<j;i++)
m*=10;
return m;}
///////////////////////////////////////////////////
//主函数
void main(){
unsigned char a,b,c,d, i,j,k,m,n,count1,count0,count2,count3,count4,read,k1[8],k2,m1;
unsigned int x,y,z;
n=0;a=0x10;b=0x10;c=0x10;d=0x10;count1=0;count2=0;count3=0;count4=0;count0=0;
WDTCN = 0XDE; //禁止看门狗
WDTCN = 0XAD;
PortInitialization (); // 初始化端口
ExternalClock (); // 起振外部时钟,使它成为系统时钟
Timer3Init();
ExternIntInit();
BC7281Init();
EA = 1; //开总中断
TMR3CN |= 0X04; //启动定时器
Write_7281(0x15);Write_7281(0x00);
Write_7281(0x15);Write_7281(0x10);
Write_7281(0x15);Write_7281(0x20);
Write_7281(0x15);Write_7281(0x30);
Write_7281(0x15);Write_7281(0x40);
Write_7281(0x15);Write_7281(0x50);
Write_7281(0x15);Write_7281(0x60); //hex译码,显示0
Write_7281(0x15);Write_7281(0x70); //hex译码,显示0*/
Delay(6);
while(1){
if(key_flag == 1){
key_flag = 0;
Write_7281(0x13 | 0x80);
Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);
Delay(6);Delay(6);
read=Read_7281 ();
Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);
n++;
m=min(a,b,c,d);
switch(read)
{case 0x0f:{ //F时所有有值复位
for(k=0;k<8;k++) {key_value[k]=0x00;
key_value1[k]=0x00;
k1[k]=0x00;}
n=0; read=0;
a=0x10;b=0x10;c=0x10;d=0x10;
k2=0;m1=0;
count1=0;count2=0;count3=0;count4=0;count0=0;
x=0;y=0;z=0;
Write_7281(0x15);Write_7281(0x00);
Write_7281(0x15);Write_7281(0x10);
Write_7281(0x15);Write_7281(0x20);
Write_7281(0x15);Write_7281(0x30);
Write_7281(0x15);Write_7281(0x40);
Write_7281(0x15);Write_7281(0x50);
Write_7281(0x15);Write_7281(0x60);
Write_7281(0x15);Write_7281(0x70);
Write_7281 ( 0x10 );
Write_7281 ( 0xFF );
}break;
case 0x0a:{
if(count1!=1){a=n;count1++;k2=0x0a;}
else n--;
}break;
case 0x0b:{
if(count2!=1){b=n;count1++;k2=0x0b;}
else n--;
}break;
case 0x0c:{
if(count3!=1){c=n;count1++;k2=0x0c;}
else n--;
}break;
case 0x0d:{
if(count4!=1){d=n;count1++;k2=0x0d;}
else n--;
}break;
case 0x0e:{
if(count0!=1){count0++;m1=n;
for(i=0;i<m-1;i++)x+=key_value[8-m1+m-i]*zs(i);
for(i=0;i<=(m1-m-2);i++)y+=key_value[7-i]*zs(i);
if (k2==0x0a) z=x+y;
if (k2==0x0b) z=x-y;
if (k2==0x0c) z=x*y;
if (k2==0x0d) z=x/y;
for(i=0;i<8;i++)
k1[7-i]=z/zs(i)%10;
for(i=0;i<8;i++)
{Write_7281(add1[i]);Write_7281(add[k1[i]]); }
}else n--;
}break;
default :{for(i=0;i<7;i++)
key_value[i]=key_value[i+1];
key_value[7] =read;
if(m==0x10)for(j=0;j<8;j++)
{Write_7281(add1[j]);Write_7281(add[key_value[j]]);}
if(m!=0x10) {
for(i=0;i<7;i++)
key_value1[i]=key_value1[i+1];
key_value1[7] =read;
for(j=0;j<8;j++)
{Write_7281(add1[j]);Write_7281(add[key_value1[j]]);}}
};
}
Delay(6); Delay(6);Delay(6);Delay(6);Delay(6); }}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -