?? w79e825.c
字號:
/****************************************************************************/
/* 深圳恒森微電子有限公司 (華邦單片機香港及中國區代理商) */
/* 香港恒森科技有限公司 (華邦單片機香港及中國區代理商) */
/* 陳文 email:chenwen@hengsen.cn (有 bug 請提交) */
/****************************************************************************/
/* 文件名: W79e825.c */
/* 版本 1.0 */
/* 創建日期: 2007-10-29 10:58 */
/* 概述: 本文件為 w79e825 kit demo 軟件 */
/*--------------------------------------------------------------------------*/
/* 歷史修改記錄: */
/* 名字 日期 注釋 */
/* 陳文 2007.10.28 ver 1.0 */
/****************************************************************************/
#include <w79e825.h>
#include <intrins.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define uchar unsigned char
#define uint unsigned int
uint8 led[2];
//led code 共陽極 0 1 2 3 4 5 6 7 8 9 a b c d e f 滅 高位先出 bit順序 h,g,f,e,d,c,b,a : Q1--a.....Q8--h
//uint8 code tab[17] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x0a,0x86,0x8e,0xff};
uint8 code tab[17] = {0x41,0xf5,0x0d,0x15,0xb1,0x13,0x03,0xd5,0x01,0x11,0x81,0x83,0xc6,0x0a,0x86,0x8e,0xff};
sbit Csg1 = P1^6;
sbit Csg0 = P1^7;
#define nop() _nop_();_nop_();_nop_();_nop_();
void init_cpu(void);
void Display(void);
uchar key_scan(void);
void ADC_Select(ADC_C);
void ADC_EN(void);
void ADC_DIS(void);
uchar basetime;
uchar sec;
uchar min;
uchar adc_save;
uchar key_time;
uchar key_valume;
//每10毫秒中斷一次
void Timer0_int(void) interrupt 1 using 1
{
TL0 = 0x0f;
TH0 = 0xdb;
TF0 = 0;
key_time++;
if(99 != basetime)
{
basetime++;
return;
}
basetime = 0;
if(59 != sec) //1分鐘
{
sec++;
return;
}
else
{
sec = 0;
min++;
}
}
void main(void)
{
uchar sec_save;
uchar base_save;
key_time = 0;
init_cpu();
P07 = 0;
led[0] = 0;
led[1] = 0x10;
Display();
for(;;)
{
if(key_time>=2)
{
key_valume = key_scan(); //20ms
}
if(base_save != basetime)
{
base_save = basetime;
if(key_valume != 0xff)
{
led[0] = key_valume;
led[1] = 0x10;
}
Display();
}
if(sec_save != sec)
{
sec_save = sec;
P07 = (!P07);
}
}
}
void init_cpu(void)
{
P0M1 = 0x00;
P0M2 = 0x1f;
P0 = 0xff;
P1M1 = 0x00;
P1M2 = 0xc0;
P1 = 0xff;
// P2M1 = 0x03;
// P2M2 = 0;
// P2 = 0x03; //IO初始化完成
TMOD = 0x21;
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TH1 = 0xfd; /* TH1: reload value for 9600 baud @ 11.0592MHz */
TL1 = 0xfd;
TR1 = 1; //T1 timer run
// ES = 1; //uart interrupt enable
EA = 1; //all interrupt enable
P1 = 0xff;
TL0 = 0x0f;
TH0 = 0xdb;
ET0 = 1;
TR0 = 1;
basetime = 0; //init timer
sec = 0;
min = 0;
}
void Display(void)
{
bit B_disp_flag;
uint8 temp;
Csg1 = 1;
Csg0 = 1;
if(B_disp_flag == 1)
{
B_disp_flag = 0;
temp = led[0];
temp = tab[temp];
P0 &= 0xe0;
P0 |= (temp&0x1f);
P1 &= 0xe3;
P1 |= ((temp >> 3)&0x1c);
Csg1 = 1;
Csg0 = 0;
}
else
{
B_disp_flag = 1;
temp = led[1];
temp = tab[temp];//&0xfe; //小數點
P0 &= 0xe0;
P0 |= (temp&0x1f);
P1 &= 0xe3;
P1 |= ((temp >> 3)&0x1c);
Csg0 = 1;
Csg1 = 0;
}
}
void ADC_Select(ADC_C)
{
switch(ADC_C)
{
case 0:P0M1|=0x08;P0M2&=0xF7;ADCCON=0;P0|=0x08;break;
case 1:P0M1|=0x10;P0M2&=0xef;ADCCON=1;P0|=0x10;break;
case 2:P0M1|=0x20;P0M2&=0xdf;ADCCON=2;P0|=0x20;break;
case 3:P0M1|=0x40;P0M2&=0xbf;ADCCON=3;P0|=0x40;break;
default: break;
}
}
void ADC_EN(void)
{
AUXR1|=0x04;
}
void ADC_DIS(void)
{
AUXR1&=0xFB;
}
#define k1_adc 678
#define k2_adc 512
#define k3_adc 308
#define k4_adc 167
uchar key_scan(void)
{
uchar adc_h,adc_l;
uint adc_data;
ADC_Select(3); //select channel
ADC_EN(); //enable adc
ADCCON = ADCCON | 0x08; //start adc
while(!(ADCCON & 0x10));//wait adc finish
adc_h = ADCH;
ADCCON = ADCCON & 0xF7; //DISABLE adc
adc_l = ADCCON;
ADC_DIS();
adc_l = adc_l>>6;
adc_data = adc_h;
adc_data = adc_data<<2;
adc_data = adc_data | adc_l;
if((adc_data>k1_adc-32)&&(adc_data<k1_adc+32)) //+/-32是電阻誤差范圍
{
return 1;
}
if((adc_data>k2_adc-32)&&(adc_data<k2_adc+32))
{
return 2;
}
if((adc_data>k3_adc-32)&&(adc_data<k3_adc+32))
{
return 3;
}
if((adc_data>k4_adc-32)&&(adc_data<k4_adc+32))
{
return 4;
}
return 0xff;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -