📄 main.c
字号:
/*
* Copyright (C) 2006, 华中科技大学电气与电子科技创新中心
* All Rights Reserved.
*
* 文件名: main.c
* 文件描述: STI51开发板测试程序主文件
*
* 当前版本: 1.0
* 作者: SangWei(swkyer@gmail.com)
* 完成日期: 2005年12月22日
*
*/
#include <REGX52.h>
#include <INTRINS.H>
#include "SEG7\SEG7.h"
#ifdef __AT89X52_H__
#include "UART\uart.h"
#endif
#include "SMC162\SMC162.h"
#include "TLC549\TLC549.h"
#include "TLC5620\TLC5620.h"
/* 蜂鸣器控制引脚 */
#define BEEP_PIN 0x10
/* 定时时间高低字节数据 */
#define TIMERH 0xEE
#define TIMERL 0xFF
/* 蜂鸣器定时时间 */
#define BEEPTMH 0xFF
#define BEEPTML 0x80
void InitTimer0(void);
void InitTimer1(void);
unsigned char beepcnt1;
unsigned int beepcount;
void Beep(unsigned char tms);
#define KEY1 0x20
#define KEY2 0x40
#define KEY3 0x80
unsigned char key, key_old, key_oold;
bit bkey1, bkey2, bkey3;
unsigned char advalue, adcnt;
unsigned int adsum, addisplay;
#ifdef __AT89X52_H__
unsigned char uartbuf, uart_status;
#endif
void main(void)
{
unsigned char i, j;
unsigned char outdat[4];
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
Beep(3);
TLC5620_Init();
LcdInit();
PutStr(0, 0, " STI51 Dev Board ");
PutStr(0, 1, " HUST STI ");
/* 测试单路输出电压 */
TLC5620_SetOutput(CHL0, 0);
TLC5620_SetOutput(CHL1, 0x3F);
TLC5620_SetOutput(CHL2, 0x7F);
TLC5620_SetOutput(CHL3, 0xFF);
#ifdef __AT89X52_H__
uart_status = 0;
UartInit(BAUDRATE_38400);
SendString("STI51 Dev Board, HUST-STI\r\n");
#endif
adcnt = 0;
adsum = 0;
key = P1&0xE0;
key_oold = key_old = key;
bkey1 = bkey2 = bkey3 = 0;
InitTimer1();
dispram[0] = 0;
dispram[1] = 1;
dispram[2] = 2;
dispram[3] = 3;
TR1 = 1;
i = j = 0;
while(1)
{
i++;
/* 四路同时输出相位不同的锯齿波电压 */
outdat[CHL0] = i;
outdat[CHL1] = i + 64;
outdat[CHL2] = i + 128;
outdat[CHL3] = i + 192;
TLC5620_AllOutput(outdat);
if(bkey3 == 1)
{
advalue = TLC549_GetAD();
if(adcnt == 255)
{
adcnt = 0;
addisplay = adsum / 128; /* 求累加和,平均值滤波 */
dispram[0] = 0x10; /* 刷新显示值 */
dispram[1] = (addisplay/100) | 0x80;/* 添加小数点 */
dispram[2] = (addisplay%100)/10;
dispram[3] = addisplay%10;
adsum = 0; /* 累加值清零 */
}
else
{
adcnt++;
adsum += advalue; /* 累加128次 */
}
}
if(key == key_old && key_old == key_oold && key != 0xE0)
{
EA = 0;
if(!(key&KEY1))
{
bkey1 ^= 1;
if(bkey1 == 0)
{
PutStr(0, 0, " STI51 Dev Board ");
PutStr(0, 1, " HUST STI ");
}
else
{
PutStr(0, 0, " KEY S3 Pressed ");
PutStr(0, 1, " <--- Back ");
}
}
else if(!(key&KEY2))
{
bkey2 ^= 1;
bkey3 = 0;
if(bkey2 == 0)
{
dispram[0] = 4;
dispram[1] = 5;
dispram[2] = 6;
dispram[3] = 7;
}
else
{
dispram[0] = 0;
dispram[1] = 1;
dispram[2] = 2;
dispram[3] = 3;
}
}
else if(!(key&KEY3))
{
bkey3 = 1;
}
EA = 1;
}
if(i == 255)
{
if(j >= 3)
j = 0;
else
j++;
}
P1 = 0xE0 | (~(1<<j));
#ifdef __AT89X52_H__
/* 串口协议(0xAA, 0x55, 0xAA)处理 */
if(IsUartReceived())
{
ReadChar(&uartbuf);
if(uart_status == 0)
{
if(uartbuf == 0xAA)
uart_status = 1;
else
uart_status = 0;
}
else if(uart_status == 1)
{
if(uartbuf == 0x55)
uart_status = 2;
else
uart_status = 0;
}
else if(uart_status == 2)
{
uart_status = 0;
if(uartbuf == 0xAA)
SendString("Protocol: 0xAA, 0x55, 0xAA Received\r\n");
}
else
uart_status = 0;
}
#endif
}
}
/**************************************
说明: 定时器1初始化
定时时间10mS
**************************************/
void InitTimer1(void)
{
/* 变量初始化 */
seg7cs = 0;
dispram[0] = dispram[1] = dispram[2] = dispram[3] = 0;
/* 初始化定时器,定时时间10mS,允许定时器中断 */
TMOD = 0x90;
TH1 = TIMERH;
TL1 = TIMERL;
/* 开定时器中断 */
EA = 1;
ET1 = 1;
}
/**************************************
说明: 定时器1中断处理函数
**************************************/
void Timer1ISR(void) interrupt 3 using 2
{
/* 定时器重装 */
TH1 = TIMERH;
TL1 = TIMERL;
/* 清中断标志 */
TF1 = 0;
/* 键盘检测 */
key_oold = key_old;
key_old = key;
key = P1 & 0xE0;
/* 循环显示 */
if(seg7cs >= 3)
seg7cs = 0;
else
seg7cs++;
WriteSegData(dispram[seg7cs]);
WriteCsData(1<<seg7cs);
}
/**************************************
说明: 定时器初始化
定时时间0.5mS
**************************************/
void InitTimer0(void)
{
/* 变量初始化 */
beepcnt1 = 0;
beepcount = 0;
/* 初始化定时器,定时时间0.5mS,允许定时器中断 */
TMOD = 0x09;
TH0 = BEEPTMH;
TL0 = BEEPTML;
/* 开定时器中断 */
EA = 1;
ET0 = 1;
}
/**************************************
说明: 定时器0中断处理函数
**************************************/
void Timer0ISR(void) interrupt 1 using 3
{
/* 定时器重装 */
TH0 = BEEPTMH;
TL0 = BEEPTML;
/* 清中断标志 */
TF0 = 0;
/* 循环显示 */
if(beepcnt1%2)
P1 ^= BEEP_PIN;
beepcount++;
}
void Beep(unsigned char tms)
{
InitTimer0();
TR0 = 1;
while(1)
{
if(beepcount == 1000)
{
EA = 0;
beepcount = 0;
EA = 1;
if(beepcnt1 == 2*tms)
break;
else
beepcnt1++;
}
}
TR0 = 0;
EA = 0;
ET0 = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -