📄 power2.c
字号:
#include <reg51.h>
#include <INTRINS.H>
/*
#include "seg7.h"
*/
#define TIMERH 0XEE
#define TIMERL 0XFF
#define KEY1 0x20
#define KEY2 0x40
/* 变量定义 */
unsigned char cs;
unsigned char dispram[4];
unsigned char key, key_old, keycode,flag;
bit bkey1, bkey2;
/*声明*/
void WriteSegData(unsigned char );
void WriteCsData(unsigned char );
void InitTimer1(void);
void InitTimer0(void);
void delay1 (unsigned int ms);
/* 段码表 */
/*unsigned char code seg_code[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 0--9
0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00, 0x40}; // A, b, C, d, E, F, 消隐, -*/
/*unsigned char code seg_code[] = {0xBF, 0x86, 0xDB, 0xCF, 0xE6, 0xED, 0xFD, 0x87, 0xFF, 0xEF, // 0--9
0xF7, 0xFC, 0xB9, 0xDE, 0xF9, 0xF1, 0x80, 0xC0}; // A, b, C, d, E, F, 消隐, 带点*/
unsigned char code seg_code[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 0--9
0xBF, 0x86, 0xDB, 0xCF, 0xE6, 0xED, 0xFD, 0x87, 0xFF, 0xEF}; // 0.--9.
/**************************************
说明: 写段码数据
seg: 待显示的段码数据, 0-9, A-F
**************************************/
void main(void)
{
P2=0XFF;
P0=0XFF;
P1=0xFF;
key = P1&0xE0;
key_old = key;
bkey1 = bkey2 = 0;
InitTimer1();
InitTimer0();
TR1=1;
TR0=1;
dispram[0]=0;
dispram[1]=0;
dispram[2]=9;
dispram[3]=3;
P1=dispram[2];
while(1)
{
;
// key=P1;
}
}
/*初始化*/
void InitTimer1(void)
{
cs=0;
dispram[0]=dispram[1]=dispram[2]=dispram[3]=0;
TMOD=0X90;
TH1=TIMERH;
TL1=TIMERL;
EA=1;
ET1=1;
}
void InitTimer0(void)
{
P1=0X00;
TMOD=0X01;
TH1=TIMERH;
TL1=TIMERL;
EA=1;
ET0=1;
}
void Timer1IER(void) interrupt 3 using 2
{
/* 定时器重装 */
TH1 = TIMERH;
TL1 = TIMERL;
/* 清中断标志 */
TF1 = 0;
/* 键盘检测 */
key_old = key;
key = P1 & 0xE0;
/* 循环显示 */
if(cs >= 3)
cs = 0;
else
cs++;
WriteSegData(dispram[cs]);
WriteCsData(1<<cs);
flag=1;
}
void Timer0IER(void) interrupt 1 using 1
{
unsigned char k1,k2,key,flag;
TF0 = 0;
P1|=0xE0;
;;;
k1=(~P1)&0xE0; //从P1口读取按键信息
P1|=0xE0;
if(dispram[0]>9)
{dispram[0]=0;
dispram[1]++;}
if(dispram[1]>9)
{dispram[1]=0;
dispram[2]++;}
if(dispram[2]>9)dispram[2]=0;
if(k1!=0xE0&&flag==1)
{
k2=(~P1)&0xE0;
if(k1==k2)
{
; ; ;//延时一段时间
delay1(255);
k2=(~P1)&0xE0; //再次读取信息
key=k1|k2; //两次信息的交集
if(key==0x20)
dispram[2]++;
else if(key==0x40)
dispram[1]++;
else if(key==0x80)
dispram[0]++;
}
}
else
;
if(k1==k2)flag=0;
else flag=1;
}
void WriteSegData(unsigned char seg)
{
seg = seg & 0x7F;
/* 越界判断,并查找对应的段码 */
if(seg > 20)
seg = 20;
seg = seg_code[seg];
/* 小数点 */
if(seg & 0x80)
seg |= 0x80;
/* 将段码数据送到数据总线上 */
P0 = seg;
/* 等待数据稳定 */
_nop_();
_nop_();
/* P2.5-P2.7 = 000, 控制138译码器,使片选信号CS0=0 */
P2 &= 0x1F;
/* 延时,维持CS0为低电平 */
_nop_();
_nop_();
/* P2.5-P2.7 = 111, CS0=1, 产生上升延脉冲,将数据总线上的数据锁存 */
P2 |= 0xE0;
}
/**************************************
说明: 写位选数据
cs: cs低四位为位选位,1: 有效,0: 无效
**************************************/
void WriteCsData(unsigned char cs)
{
/* 低四位有效,屏蔽高四位 */
cs &= 0x0F;
/* cs信号为低有效,将cs反向后送入数据总线 */
P0 = ~cs;
/* 等待数据稳定 */
_nop_();
_nop_();
/* P2.5 = 0, P2.6-P2.7 = 0, 控制138译码器,使片选信号CS1 = 0 */
P2 &= 0x3F;
/* 延时,维持CS1为低电平 */
_nop_();
_nop_();
/* P2.5-P2.7 = 111, CS0=1, 产生上升延脉冲,将数据总线上的数据锁存 */
P2 |= 0xE0;
}
void delay1(unsigned int us)
{
while(us--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -