📄 text1.c
字号:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
//数据口定义
#define lcd1602_bus P0
/******************tlc549 port*********************/
sbit cs_0838=P1^3;
sbit sda_0838=P1^0;
sbit scl_0838=P1^1;
/*******************tlc5620 port***********************/
sbit load_5620=P1^5;
sbit clk_5620=P1^6;
sbit data_5620=P1^7;
/***************lcd1602 port******************************/
//引脚定义
sbit rs_1602=P2^5;
sbit rw_1602=P2^6;
sbit e_1602=P2^7;
uchar set[3]; //setting
uchar mea[4]; //measure
uchar j;
bit b;
uchar data5620;
unsigned char bdata adc_0838; //bdata //bit data area
sbit adc_0838low=adc_0838^0; //最低位
uchar bdata u;
sbit us=u^7;
uchar code table[10]=
{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/**************adc_549convert*******************/
unsigned char adc_0838convert()
{
uchar i;
u=0x80;
scl_0838=0;
sda_0838=1;
cs_0838=0;
_nop_();
_nop_();
scl_0838=1;
_nop_();
_nop_();
for(i=0;i<4;i++)
{
scl_0838=0;
sda_0838=us;
_nop_();
_nop_();
scl_0838=1;
u=u<<1;
}
sda_0838=1;
_nop_();
_nop_();
scl_0838=0;
_nop_();
_nop_();
adc_0838=0;
for(i=0;i<8;i++)
{
adc_0838=adc_0838<<1;
scl_0838=1;
_nop_();
_nop_();
scl_0838=0;
_nop_();
_nop_();
adc_0838low=sda_0838;
}
return(adc_0838);
}
void dac_5620(unsigned char dataa,unsigned char datab,
unsigned char datac,unsigned char datad)
{
unsigned char i;
/****************dataa************/
load_5620=1;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1; data_5620=0; clk_5620=0;
for(i=0;i<8;i++)
{
clk_5620=1;
if(dataa & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
dataa=dataa<<1;
}
load_5620=0;
_nop_();
load_5620=1;
/************datab*************/
load_5620=1;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=0; clk_5620=0;
for(i=0;i<8;i++)
{
clk_5620=1;
if(datab & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
datab=datab<<1;
}
load_5620=0;
_nop_();
load_5620=1;
/************datac*******************/
load_5620=1;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1;data_5620=0; clk_5620=0;
for(i=0;i<8;i++)
{
clk_5620=1;
if(datac & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
datac=datac<<1;
}
load_5620=0;
_nop_();
load_5620=1;
/***************datad***************/
load_5620=1;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=0; clk_5620=0;
for(i=0;i<8;i++)
{
clk_5620=1;
if(datad & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
datad=datad<<1;
}
load_5620=0;
_nop_();
load_5620=1;
}
/*********延时子程序**********/
void delay_1602(uchar dy)
{
while(--dy);
}
/***********忙判断标志,返回一个位BF********************/
bit lcd1602_busy(void)
{
unsigned char busy_flag;
rs_1602=0;
rw_1602=1;
_nop_();
e_1602=1;
_nop_();
lcd1602_bus=0xff;
busy_flag=lcd1602_bus; //e在高电平时读
e_1602=0;
return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
}
/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0
***************/
void lcd1602_wrcmd(unsigned char lcdcmd)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcdcmd;
rs_1602=0;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0; //产生一个下沿
}
/***************向液晶写数据******************/
void lcd1602_wrdata(unsigned char lcddata)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcddata; //在下沿的时候写数据
rs_1602=1;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0;
//lcd_bus=0xff;
}
/************液晶的清屏************/
void lcd1602_clear(void)
{
lcd1602_wrcmd(0x01); //液晶清屏控制字 并延时>40us
delay_1602(100);
}
/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
delay_1602(100);
lcd1602_wrcmd(0x0c); //显示开关控制----显示开关开,光标开关关,闪烁开关关
delay_1602(100);
lcd1602_wrcmd(0x06); //输入方式设置,AC自增1, S=0;
delay_1602(100);
lcd1602_wrcmd(0x01); //清屏
delay_1602(100);
}
/************键盘扫描*************/
uchar keyscan(void)
{
uchar scancode,tmpcode;
P3 = 0xf0;
if ((P3&0xf0)!=0xf0)
{
delay_1602(125);
if ((P3&0xf0)!=0xf0)
{
scancode = 0xfe;
while((scancode&0x10)!=0)
{
P3 = scancode;
if ((P3&0xf0)!=0xf0)
{
tmpcode = (P3&0xf0)|0x0f;
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01;
}
}
}
return(0);
}
void fen(unsigned int hex,uchar a[4])
{
a[0]=table[hex/1000];
hex=hex%1000;
a[1]=table[hex/100];
hex=hex%100;
a[2]=table[hex/10];
hex=hex%10;
a[3]=table[hex];
}
void jia(n)
{
uchar i;
set[j]=table[n];
lcd1602_wrcmd(0x8a-j);
for(i=0;i<=j;i++)
lcd1602_wrdata(set[i]);
j++;
data5620=data5620*10+n;
}
main()
{
uchar key,i;
unsigned char str0[]="setting: *10mA ";
unsigned char str1[]="measure: mA ";
uchar data549=0;
unsigned int cov549=0;
b=0;j=0;
data5620=0;
delay_1602(2);
lcd1602_bus=0xff;
lcd1602_init();
lcd1602_wrcmd(0x80);
for(i=0;i<16;i++)
lcd1602_wrdata(str0[i]);
while(1)
{
lcd1602_wrcmd(0x8a);
key=0;
while(key==0)
key=keyscan();
while(P3!=0xf0)
P3=0xf0;
if(key==0x18)
{
dac_5620(data5620,data5620,data5620,data5620);
b=1;j=0;
data549=adc_0838convert();
cov549=data549*19.6;
fen(cov549,mea);
lcd1602_wrcmd(0xc0);
for(i=0;i<14;i++)
lcd1602_wrdata(str1[i]);
lcd1602_wrcmd(0xc8);
for(i=0;i<4;i++)
lcd1602_wrdata(mea[i]);
}
else if(key==0x12)
{
if(j>0)
{
j--;
data5620=(data5620-(set[j]-0x30))/10;
lcd1602_wrcmd(0x8a-j);
lcd1602_wrdata(0);
for(i=0;i<j;i++)
lcd1602_wrdata(set[i]);
}
}
else
{
if(j<3)
{
if(b==1)
{
set[0]=0;set[1]=0;set[2]=0;
data5620=0;
j=0;
lcd1602_wrcmd(0xc0);
for(i=0;i<14;i++)
lcd1602_wrdata(0);
lcd1602_wrcmd(0x87);
for(i=0;i<3;i++)
lcd1602_wrdata(0);
b=0;
}
switch(key)
{
case 0x14:jia(0);break;
case 0x28:jia(1);break;
case 0x24:jia(2);break;
case 0x22:jia(3);break;
case 0x48:jia(4);break;
case 0x44:jia(5);break;
case 0x42:jia(6);break;
case 0x88:jia(7);break;
case 0x84:jia(8);break;
case 0x82:jia(9);break;
default : break;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -