📄 7841.c
字号:
#include <REG52.H>
#include <stdio.h>
#include <string.h>
#include <absacc.h>
#include <intrins.h>
#define TRUE 1
#define FALSE 0
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define LCD_DATA P0 //数据口
sbit RS = P2^0; //并行的指令/数据选择信号, H数据, L命令
sbit RW = P2^1; //并行读写选择信号, H读, L写
sbit E = P2^2; //并行使能端, H有效, L无效
sbit LED=P3^7;
sbit DCLK=P2^3;
sbit DIN=P2^4;
//sbit CS=P2^5;
sbit DOUT=P2^6;
typedef struct __SYSTEMTIME__
{
unsigned char gewei;
unsigned char shiwei;
unsigned char baiwei;
unsigned char qianwei;
unsigned char DateString[5];
}SYSTEMTIME; //定义的时间类型
uint datax;
/*****************************************************************************
* 名称 :void Start_7841(void)
* 功能描述:启动7841进行转换,CS变低,开始转换过程
* 输入参量:无
* 输出参量:无
* 调用子程:无
* 使用方法:进行读数据之前要开始转换
-------------------*/
void Start_7841(void)
{
//CS=0;
DIN=0;
DCLK=0;
}
/****************************************************************************
* 名称 :void Stop_7841(void)
* 功能描述:停止7841进行转换
* 输入参量:无
* 输出参量:无
* 调用子程:无
* 使用方法:当不用ad转换时停止转换器
------------------*/
void Stop_7841(void)
{
// CS=1;
DIN=0;
DCLK=0;
}
/****************************************************************
* 名称 : void Write_Byte_3W(unsigned char cmd)
* 功能描述: 写命令字节
* 输入参量: 需要写的字节
* 输出参量: 无
* 调用子程: 无
* 使用方法:
-------------------------------------------------*/
void Write_Command(unsigned char cmd)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
if(cmd & 0x80)
{
DIN=1;
}
else
{
DIN=0;
}
DCLK=0;
DCLK=1;
cmd<<= 1;
}
DIN=0;
DCLK=0;
}
/****************************************************************
* 名称 : unsigned int Read_Data(void)
* 功能描述: 读AD转换后的数据
* 输入参量: 需要写的字节
* 输出参量: 读出的数据
* 调用子程: 无
* 使用方法:
----------------------------*/
unsigned int Read_Data(void)
{
unsigned char i;
unsigned int AD_data;
AD_data = 0;
for(i=0;i<12;i++)
{
DCLK=1;
DCLK=0;
if(DOUT) //DOUT为高
{
AD_data<<=1;
AD_data+=0x01;
}
else
{
AD_data <<= 1;
}
}
for(i=0;i<4;i++)
{
DCLK=0;
DCLK=1;
}
return AD_data;
}
/*****************************************************************************
* 名称 :void Read_7844_Data(unsigned char chanel)
* 功能描述:从7844读数据,12bit ,输入存储器的格式为下面
D7 D6 D5 D4 D3 D2 D1 D0
S A2 A1 A0 SD PD1 PD2
1 起始位为1
1 1 1 通道选择
1 单端转换
0 0 自动节电状态
* 输入参量:需要转换的通道号
* 输出参量:用unsigned char 形式表示的ad转换后的值
* 调用子程:
* 使用方法:
-----------------------------------------------*/
unsigned int ADC_Convert(unsigned char ch)
{
unsigned char cmd,ADS_channel;
unsigned int ADData=0;
switch(ch)
{
case 0: ADS_channel=0x10;break;
case 1: ADS_channel=0x50;break;
case 2: ADS_channel=0x20;break;
case 3: ADS_channel=0x60;break;
default: ADS_channel=0x10;break;
}
cmd=(ADS_channel)|(0x84);
Start_7841(); //开始读取
Write_Command(cmd);
ADData=Read_Data();
Stop_7841();
return ADData;
}
/*************************************************************/
//延时约2us
void delayUs()
{
_nop_();_nop_();
}
//延时 a * 1ms
void delayMs(uint a)
{
uint i, j;
for(i = a; i > 0; i--)
for(j = 100; j > 0; j--);
}
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
bit checkBusy()
{
bit busy;
RS = 0;
RW = 1;
E = 1;
delayUs();
busy = (bit)(LCD_DATA&0x80);
E = 0;
return busy;
}
//等待LCD到空闲
void wait()
{
while(checkBusy());
}
//写命令
void writeCmd(uchar cmd)
{
wait();
RS = 0;
RW = 0;
E = 0;
delayUs();
LCD_DATA = cmd;
delayUs();
E = 1;
delayUs();
E = 0;
}
//写数据
void writeData(uchar dat)
{
wait();
RS = 1;
RW = 0;
E = 0;
delayUs();
LCD_DATA = dat;
delayUs();
E = 1;
delayUs();
E = 0;
}
//初始化LCD
void init()
{
//PSB = 1; //并口方式
writeCmd(0x30); //基本指令, 扩充指令为34H
delayMs(10);
writeCmd(0x0c); //显示开, 关光标
delayMs(10);
writeCmd(0x01); //清屏
delayMs(10);
}
void setPosition(uchar x, uchar y)
{
uchar p;
switch(x%4)
{
case 0: p = 0x80; break; //第一行开始地址
case 1: p = 0x90; break; //第二行
case 2: p = 0x88; break; //第三行
case 3: p = 0x98; break; //第四行
}
p += y;
writeCmd(p);
}
void DateToStr(SYSTEMTIME *Time)
{
Time->qianwei=datax/1000;
Time->baiwei=(datax/100)%10;
Time->shiwei=(datax/10)%10;
Time->gewei=datax%10;
Time->DateString[0] = Time->qianwei + '0';
Time->DateString[1] = Time->baiwei + '0';
Time->DateString[2] = Time->shiwei + '0';
Time->DateString[3] = Time->gewei + '0';
Time->DateString[4] = '\0';
}
void writeString(uchar * str)
{
uchar i = 0;
while(str[i] != '\0')
{
writeData(str[i++]);
}
}
/******************************************************************/
void main(void)
{
SYSTEMTIME S;
while(1)
{
LED=0;
init();
setPosition(0,0);
datax=ADC_Convert(0);
DateToStr(&S);
writeString(S.DateString);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -