📄 key_display.c
字号:
/**************COPYRIGHT RESERVED BY DU************************/
//key_display.c
#include "c8051F020.h"
#include "intrins.h"
#include "CH452CMD.H" // 定义常用命令码及外部子程序
#include "pin.h"
#include "math.h"
#ifndef __UNSIGNEDS
#define __UNSIGNEDS
#define uint unsigned int
#define uchar unsigned char
#define ushort unsigned short
#define ulong unsigned long
#endif
/***********关看门狗*********************/
void Reset_Sources_Init()
{
WDTCN = 0xDE;
WDTCN = 0xAD;
}
/***********系统时钟4M*********************/
void Oscillator_Init()
{
OSCICN = 0x05;
}
/***********ADC输入初始化,改变AMX0SL=0x01-0x07为AIN1-AIN7*********************/
void ADC_Init()
{
AMX0SL = 0x01; //AIN1作为AD输入,30管脚
//ADC0CF = 0x08;
ADC0CN = 0x80; //ADC使能
}
/***********DAC输出初始化*********************/
void DAC_Init()
{
DAC0CN = 0x80; //DAC使能
}
/***********参考电压初始化*********************/
void Voltage_Reference_Init()
{
REF0CN = 0x03; //内部参考电压2.5V
}
/***输出占空比不同的PWM可以设定P0.0,0.1...改变PCA0CPH0.PCA0CPM1改变占空比 *****/
void PCA_Init()
{
PCA0CN = 0x40; /*允许PCA定时器/计数器*/
PCA0L = 0x00;
PCA0H = 0x00;//PCA0MD = 0x80;
PCA0CPM0 = 0x43; /*8位PWM方式,当CCF0=1时,允许辅捉/比较标志的中断申请*/
PCA0CPL0 = 0x00; /*置初值*/
PCA0CPH0 = 0x80; // PCA0CPH0 = 0xC0 //PCA0MD = 0x01; /*PCA定时器/计数器溢出中断禁止*/
PCA0CPM1 = 0x43; /*8位PWM方式,当CCF1=1时,允许辅捉/比较标志的中断申请*/
PCA0CPL1 = 0x00; /*置初值*/
PCA0CPH1 = 0x80;
}
/***定时器0,1初始化 TMOD设置几位什么方式CKCON是时基是系统的几倍*****/
void Timer_Init()
{
TR0=0; //关定时器0
TR1=0; //关定时器1
TMOD = 0x11;
CKCON=0x00; //定时器1的时基与系统1/12
TH0=0x7D ; //全程定时
TL0=0xCC ;
TH1=0x7D ; //初值 1s
TL1=0xFB ;
}
/***********延时n ms******************/
void delayms(uint n)
{
uint i,j,k;
for(i=0;i<n;i++)
for(j=0;j<200;j++)
for(k=0;k<10;k++)
_nop_();
}
/***********ADC输入实现****************uchar i,uchar j*****/
float AD_IN(void)
{
// float tmp;
uint temp;
// AMX0P = 0x10;
delayms(10);
AD0BUSY=1;
while(AD0INT == 0);
temp=ADC0H<<8;
temp+=ADC0L;
// tmp=(2.5*(temp/4095.0))*1000;
//return(tmp);
return(temp);
}
/***********DAC输出实现*********************/
void DA_OUT(uint dat)
{
uint dah,dal;
dah=dat>>8;
dal=dat&0x00FF;
DAC0L=(uchar)dal;
DAC0H=(uchar)dah;
}
/***********CH452写入*********************/
void CH452_Write(ushort cmd)
{
uchar i;
DISABLE_KEY_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
CH452_LOAD_CLR; //命令开始,LOAD=0
CH452_LOAD_D_OUT; // 设置LOAD为输出方向
CH452_DOUT_D_IN; // 设置DOUT为输入方向
CH452_DIN_D_OUT; // 设置DIN为输出方向
CH452_DCLK_D_OUT; // 设置DCLK为输出方向
for(i=0;i!=12;i++) //送入12位数据,低位在前
{
if (cmd&1) {CH452_DIN_SET;}
else {CH452_DIN_CLR;} // 输出位数据
// 另外的表达CH452_DIN=cmd&1;
CH452_DCLK_CLR;
cmd>>=1;
DELAY_1US;
DELAY_1US;
CH452_DCLK_SET; //上升沿有效
}
CH452_LOAD_SET; //加载数据,LOAD上升沿
DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
ENABLE_KEY_INTERRUPT;
}
/***********CH452读出*********************/
uchar CH452_Read( void )
{
uchar i;
uchar cmd,keycode; //定义命令字,和数据存储器
DISABLE_KEY_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
cmd=0x07; //读按键的命令字
CH452_LOAD_CLR;
for(i=0;i!=4;i++) // 只需要发出高4位,多发也可以,但应该确保最后留下的4位是该命令码
{
if (cmd&1) {CH452_DIN_SET;}
else {CH452_DIN_CLR;} // 输出位数据
CH452_DCLK_CLR;
cmd>>=1; //往右移一位
CH452_DCLK_SET; //产生时钟上升沿锁通知CH451输入位数据
}
CH452_LOAD_SET; //产生加载上升沿通知CH451处理命令数据
keycode=0; //清除keycode
for(i=0;i!=7;i++)
{
keycode<<=1; //数据移入keycode,高位在前,低位在后
if (CH452_DOUT) keycode++; //从高到低读入451的数据
CH452_DCLK_CLR; //产生时钟下升沿通知CH451输出下一位
CH452_DCLK_SET;
}
CLEAR_KEY_INTER_FLAG; //清中断标志
ENABLE_KEY_INTERRUPT;
return(keycode); //反回键值
}
/***********CH452初始化*********************/
void CH452_Init(void)
{
//CH452_Write(CH452_RESET); //此套020板子千万不可用020复位,否则数码管不亮
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
CH452_Write( CH452_SYSON2 ); /* 启用键盘和数码管 */
CH452_Write( CH452_BCD ); /* BCD译码,8个数码管 */ // | CH452_SCANLIMIT_7
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
}
/***********键盘数字转换(0-9)******************/
uchar key_tran(uchar x)
{
uchar a;
if(x==0x78){a=1;}
if(x==0x50){a=2;}
if(x==0x58){a=3;}
if(x==0x79){a=4;}
if(x==0x51){a=5;}
if(x==0x59){a=6;}
if(x==0x7A){a=7;}
if(x==0x52){a=8;}
if(x==0x5A){a=9;}
if(x==0x7B){a=0;}
return(a);
}
/***********在数码管上0-3显示数字(包括小数点和负数)*****************/
void BCDdisplay_l(float n)
{
signed int x;
signed char a[4],b,t;
x=abs((int)n);
for(t=0;t<4;t++)
CH452_Write((CH452_DIG0+ (t<<8))|16);
//if( ( n < 0.00000001 ) || ( n > -0.00000001 ) ) CH452_Write((CH452_DIG0));
//else
//{
for(t=0;t<4;t++)
{
a[t]=x%10;
x=x/10;
if(a[t]) b=t;
}
x=abs((int)n);
if(x-(int)n)
{
x=b+1;x<<=8;
CH452_Write((CH452_DIG1+x)|18);
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
}
for(t=0;t<=b;t++)
{
x=t;x<<=8;
CH452_Write((CH452_DIG1+x)|a[t]);
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
}
CH452_Write(0x1F9);//写小数点
n=(n-(int)n);
t=(int)(n*10);
n=n*10-t;
t=abs(t);
if( (int)( n*10 )>=5 || (int) ( n * 10 ) <=-5 ) t++;
CH452_Write(CH452_DIG0|t);
//}
}
/***********在数码管上4-7显示数字(包括小数点和负数)*****************/
void BCDdisplay_h(float n)
{
signed int x;
signed char a[4],b,t;
x=abs((int)n);
for(t=4;t<8;t++)
CH452_Write((CH452_DIG0+ (t<<8))|16);
//if( ( n < 0.00000001 ) || ( n > -0.00000001 ) ) CH452_Write((CH452_DIG4));
//else
//{
for(t=0;t<4;t++)
{
a[t]=x%10;
x=x/10;
if(a[t]) b=t;
}
x=abs((int)n);
if(x-(int)n)
{
x=b+5;x<<=8;
CH452_Write((CH452_DIG1+x)|18);
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
}
for(t=0;t<=b;t++)
{
x=t;x<<=8;
CH452_Write((CH452_DIG5+x)|a[t]);
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
}
CH452_Write(0x1fd);//写小数点
n=(n-(int)n);
t=(int)(n*10);
n=n*10-t;
t=abs(t);
if( (int)( n*10 )>=5 || (int) ( n * 10 ) <=-5 ) t++;
CH452_Write(CH452_DIG4|t);
//}
}
/***********显示(包括数)******************/
void BCDdisplay1(uint n)
{ uint x;
uchar a[8],t,b;
x=n;
//CH452_Write(CH452_RESET);
CH452_Write(CH452_SYSON2);//打开键盘显示
CH452_Write(CH452_BCD); // BCD译码,8个数码管
for(t=0;t<8;t++)
CH452_Write((CH452_DIG0+ (t<<8))|16);
if(n==0) CH452_Write((CH452_DIG0));
else
{
for(t=0;t<8;t++)
{ a[t]=x%10;
x=x/10;
if(a[t]) b=t;
}
for(t=0;t<=b;t++)
{
x=t;x<<=8;
CH452_Write((CH452_DIG0+x)|a[t]);
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;}
}
}
//H_L为1,选择高四位数码管写整数;H_L为0,选择低四位数码管写整数
void BCD_H_L(signed int n,unsigned char H_L)
{
unsigned int x;
unsigned char a[4],b,t;
for(t=0;t<4;t++)
{
x=t+(H_L<<2);
x<<=8;
CH452_Write((CH452_DIG0 + x)|16);
}
x=(H_L<<2);
x<<=8;
if( n == 0 )
CH452_Write(CH452_DIG0 +x);
else
{ x=abs(n);
for(t=0;t<4;t++)
{
a[t]=x%10;
x=x/10;
if(a[t]) b=t;
}
if(abs(n)-n)
{
x=b + (H_L<<2)+1;
x<<=8;
CH452_Write((CH452_DIG0+x)|18);
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
}
for(t=0;t<=b;t++)
{
x=t+(H_L<<2);
CH452_Write((CH452_DIG0+ (x << 8))|a[t]);
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -