|
最近使用15做電壓測試,順便使用下12864顯示,程序如下:
#include <STC15F2K60S2.H>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
#define FOSC 11059200L //系統頻率
sbit CS=P0^4; //片選信號 4RS(CS)H/L并行的指令/數據選擇信號;串行的片選信號
sbit SID=P0^3; //數據信號 5R/W(SID)H/L并行的讀寫選擇信號;串行的數據口
sbit SCLK=P0^2; //時鐘信號 6E(CLK)H/L并行的使能信號;串行的同步時鐘
// sbit RST=P0^1; //復位信號 17/RETH/L復位低電平有效 //**可以直接接到VCC,模塊自帶上電復位電路
sbit CH_PSB = P0^0; //并行、串行選擇信號 15PSBH/L并/串行接口選擇:H-并行;L-串行
//L:串行數據選擇,H-并行速度快占用I/O多,因為需要8位數據連接;L-串行接線較少,但是速度要慢
sbit stop = P3^2;
//宏定義ADC的操作命令
#define ADC_POWER 0x80 //ADC電源控制位
#define ADC_FLAG 0x10 //ADC完成標志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540個時鐘
//宏定義ADC參考電壓mV
#define VCC_V 5010
////定義變量
ulint ADC_RESH; //ADC變量
uint count; //中間變量
float Vin;
uchar dis_buf[5];
//delayms_1ms
void delayms(uint time)
{
uint x,y;
for(x=0; x<time; x++)
for(y=0; y<112; y++);
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0x01; //設置P1.0口為AD口
ADC_RES = 0; //清除結果寄存器
ADC_RESL = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
delayms(2); //ADC上電并延時
}
/*----------------------------
讀取ADC結果
----------------------------*/
uint GetADCResult(uchar ch)
{
uint ADC_H,ADC_L,ADCReuslt;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4個NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
ADC_CONTR &= ~ADC_FLAG; //清除完成標志
ADC_H = ADC_RES; //取出高8位
ADC_L = ADC_RESL; //取出低8位
ADC_L = ADC_L & 0x03; //清除無用位,獲取低兩位
ADC_H = ADC_H<<2; // 高位左移兩位
ADCReuslt = ADC_H | ADC_L; // 高低字節拼接成一個10位數。
return ADCReuslt; //返回10位ADC結果
}
/********************************************************************
* 名稱 : delay()
* 功能 : 延時,延時時間為 100us * t。這是通過軟件延時,有一定誤差。
* 輸入 : t
* 輸出 : 無
***********************************************************************/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/********************************************************************
* 名稱 : sendbyte()
* 功能 : 按照液晶的串口通信協議,發送數據
* 輸入 : zdata
* 輸出 : 無
***********************************************************************/
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;
}
}
/********************************************************************
* 名稱 : write_com()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
***********************************************************************/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8);
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名稱 : write_data()
* 功能 : 寫串口數據
* 輸入 : cmdcode
* 輸出 : 無
***********************************************************************/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名稱 : lcdinit()
* 功能 : 初始化函數
* 輸入 : cmdcode
* 輸出 : 無
***********************************************************************/
void lcdinit()
{
// RST = 0;
delay(100);
// RST = 1;
delay(20000);
write_com(0x30); //開顯示,光標設置,8位數據
delay(50);
write_com(0x0c); //顯示開,無游標,不反白0c
delay(50);
}
/********************************************************************
* 名稱 : hzkdis()
* 功能 : 顯示字符串
* 輸入 : *s
* 輸出 : 無
***********************************************************************/
void hzkdis(unsigned char code *s)
{
while(*s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
* 名稱 : Test()
* 功能 : 顯示子函數
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Test()
{
delayms(1000);
P1M0 = 0x00; //P1.0高阻
P1M1 = 0x01; //P1.0高阻 0000 0001
P_SW1= 0x40; //P3.6/P3.7串口1 RXD/TXD //初始化串口
InitADC();
write_com(0x03);
delay(50);
write_com(0x80);
hzkdis("團戰可以輸---");
write_com(0x90);
hzkdis("提莫必須死---");
write_com(0x88);
hzkdis("Voltage Display");
write_com(0x98);
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main()
{
CH_PSB = 0; //L:串行數據選擇,H-并行速度快占用I/O多,因為需要8位數據連接;L-串行接線較少,但是速度要慢
delay(1);
lcdinit();
delay(10);
while(1)
{
while (1)
{
Test();
ADC_RESH=GetADCResult(0);
count=(VCC_V*ADC_RESH/1024+5);///10; //四舍五入+5,1023/1024
dis_buf[0] = count/1000%10+'0'; //+30
dis_buf[1] = 0x2e; //.
dis_buf[2] = count/100%10+'0';
dis_buf[3] = count/10%10+'0';
dis_buf[4] = count%10+'0';
dis_buf[5] = 0x56; //V
write_data(dis_buf[0]);
write_data(dis_buf[1]);
write_data(dis_buf[2]);
write_data(dis_buf[3]);
write_data(dis_buf[4]);
write_data(dis_buf[5]);
delayms(500);
}
}
}
//復位
void int0() interrupt 0
{
if(stop==0)
{
delayms(20);
if(stop==0)
{
while(!stop);
IAP_CONTR = 0x20;//軟件復位
}
}
}
|
評分
-
查看全部評分
|