|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
因为TM1652是单数据线接口,对时序要求比较严,需要针对应用的硬件作精确延时,除此之外跟其他TM驱动芯片没有区别,
#include "stc8g.h"
#include <intrins.h>
sbit PIN_SDA = P3^3;
sbit PIN_UP = P5^4;
sbit PIN_DOWN = P5^5;
sbit PIN_START = P3^2;
sbit PIN_UVLED = P3^1;
#define KEY_UP 0xA0
#define KEY_DOWN 0xA1
#define KEY_START 0xA2
#define KEY_ADJUST 0xA3
#define STATUS_IDLE 0 //空闲
#define STATUS_RUNNING 1 //运行
#define STATUS_ADJUST 2 //调节
const unsigned char DT[] = {
//[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [A], [-]
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x40
};
unsigned char status = 0; //状态
unsigned char worktime = 6; //工作时长1~99
unsigned short cnt250ms, cnt500ms, cnt1s;
bit flag1ms, flag250ms, flag500ms, flag1s;
void TM0_Isr() interrupt 1
{
flag1ms = 1;
if (++cnt250ms >= 250) { cnt250ms=0; flag250ms=1; }
if (++cnt500ms >= 500) { cnt500ms=0; flag500ms=1; }
if (++cnt1s >= 1000) { cnt1s = 0; flag1s = 1; }
}
void delay_52us(void)
{
unsigned i = 200;
while(i--) {
_nop_();
}
}
void tm1652_start(void)
{
PIN_SDA = 0;
delay_52us();
}
void tm1652_stop(void)
{
PIN_SDA = 1;
delay_52us();
}
void tm1652_wr_8bits(unsigned char ch)
{
char i, cnt=0;
tm1652_start();
for (i=0; i<8; i++)
{
if (ch & 0x01) {
PIN_SDA = 1;
cnt += 1;
} else {
PIN_SDA = 0;
}
delay_52us();
ch >>= 1;
}
PIN_SDA = (bit)(cnt%1);
delay_52us();
tm1652_stop();
}
void tm1652_wr_cmd(unsigned char cmd) //0xFE
{
tm1652_wr_8bits(0x18); //控制
tm1652_wr_8bits(cmd);
}
void tm1652_wr_data(unsigned char h, unsigned char l)
{
tm1652_wr_8bits(0x08); //地址GR1
tm1652_wr_8bits(DT[h]);
tm1652_wr_8bits(DT[l]);
}
void display_worktime(void)
{
char h = worktime/10;
char l = worktime%10;
tm1652_wr_data(h, l);
tm1652_wr_cmd(0xFE);
}
#define KEYDLY 3000
unsigned char keytmp=0, keybak=0;
unsigned short keycnt=0;
unsigned char keyget(void)
{
//PIN_UP = 1;
//PIN_DOWN = 1;
//PIN_START = 1;
//_nop_();
if (PIN_START && PIN_UP && PIN_DOWN) {
keytmp = 0;
keybak = 0;
keycnt = 0;
return 0xFF;
}
if (!PIN_START) {
keytmp = KEY_START;
} else if (!PIN_UP) {
keytmp = KEY_UP;
} else if (!PIN_DOWN) {
keytmp = KEY_DOWN;
}
if (keybak == keytmp)
{
if (keycnt < KEYDLY) {
if (keycnt == 10) { //short press
keycnt++;
return keytmp;
} else if (keycnt==(KEYDLY-1)) { //long press
keycnt = KEYDLY;
if (keytmp == KEY_UP)
return KEY_ADJUST;
}
keycnt++;
}
} else {
keybak = keytmp;
}
return 0xFF;
}
void main(void)
{
unsigned char key=0xFF;
P3M0 = 0x0; //设置P3.0~P3.7为双向模式
P3M1 = 0x0;
P5M0 = 0x0; //设置P5.0~P5.7为双向模式
P5M1 = 0x0;
TMOD = 0x00;
TL0 = 0x66; //65535-11.0592M/12/1000 (1ms)
TH0 = 0xFC;
TR0 = 1; //启动定时器
ET0 = 1; //使能定时器中断
EA = 1;
status = STATUS_IDLE;
worktime = 6;
PIN_UVLED = 0;
display_worktime();
while(1)
{
if (flag1ms) {
flag1ms = 0;
key = keyget();
if (key == 0xFF) continue;
if (status == STATUS_IDLE) {
if (key == KEY_START) {
status = STATUS_RUNNING;
PIN_UVLED = 1;
} else if (key == KEY_ADJUST) {
status = STATUS_ADJUST;
}
} else if (status == STATUS_RUNNING) {
if (flag1s) {
flag1s = 0;
if (worktime > 0) {
worktime -= 1;
//display update
display_worktime();
}
if (worktime == 0) {
status = STATUS_IDLE;
PIN_UVLED = 0;
}
}
} else if (status == STATUS_ADJUST) {
if (key == KEY_UP) {
if (worktime < 99) worktime++;
display_worktime();
} else if (key == KEY_DOWN) {
if (worktime > 0) worktime--;
display_worktime();
} else if (key == KEY_START) { //退出调节
status = STATUS_IDLE;
}
}
}
}
}
|
|