?? 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 + -