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