高级会员
主题
回帖0
积分702
阅读权限30
注册时间2009-11-30
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2013-5-26 23:42
|
显示全部楼层
自己练习的部分代码:
/*********************************************************************
*
*
*
*
*
* 2013.05.22
/*********************************************************************/
// #include "STC12C2052AD.H"
// #include <regX52.h>
#include "STC15F2K08S2.H"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define led_1_close LED_1 = 0;
#define led_1_open LED_1 = 1;
#define led_2_close LED_2 = 0;
#define led_2_open LED_2 = 1;
#define delay_number 25 //按键去抖动延时阀值
// sbit led0 = P1^0; //LED 发光二极管
sbit led0 = P1^1;
// sbit led2 = P1^2;
sbit led1 = P2^1;
sbit led2 = P2^2;
sbit Func_key_in = P3^2;
sbit LED_1 = P2^6; //正视左边第一个数码管位选
sbit LED_2 = P2^7; //正视右边第一个数码管位选
bit bit_1s;
bit bwei;
const unsigned char code LED_SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//0-9
//数码管:正向位置;共阳极;正向连接
const unsigned char code Segment_7code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,
0x83,0xC6,0xA1,0x86,0x8E,0xFF};//0-9,A-F,灭
/*
P -> 0x8c,t -> 0x87,C -> 0xc6,c -> 0xa7,
*/
unsigned char key_lock1,Counter = 99;
unsigned char time_10ms,time_100ms,time_300ms,buffer[2];
unsigned char key_step,key_value;/*keyvalue == 8*/
unsigned char t1_value,t2_value,t3_value,T;
unsigned char P1_value,P2_value,P3_value; //Product1,
unsigned int delay_cnt1;
unsigned int C1,C2,C3;
void DelayMs(uint x);
void key_scan() //按键扫描函数
{
Func_key_in = 1; //置1 输入,准备读入按键
if(Func_key_in == 1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
key_lock1 = 0;
delay_cnt1 = 0;
}
else if(Func_key_in == 0)
{
++delay_cnt1; //延时计数器
if(delay_cnt1 > delay_number)
{
delay_cnt1 = 0;
key_lock1 = 1;
key_value = 1; //触发1号键
key_step++;
if(key_step > 6){ //4
key_step = 0;
}
}
}
}
void key_process()
{
switch(key_step)
{
case 1:
if(bit_1s){
P0 = 0x87;//t
P26 = 0;
DelayMs(2);
P26 = 1;
P0 = Segment_7code[1]; //1
P27 = 0;
DelayMs(2);
P27 = 1;
}else{
P0 = Segment_7code[2];
P26 = 0;
DelayMs(2);
P26 = 1;
P0 = Segment_7code[6]; //1
P27 = 0;
DelayMs(2);
P27 = 1;
}
break;
case 2:
P0 = 0x87;//t
P26 = 0;
DelayMs(2);
P26 = 1;
P0 = Segment_7code[2];
P27 = 0;
DelayMs(2);
P27 = 1;
break;
case 3:
P0 = 0x87;//t
P26 = 0;
DelayMs(2);
P26 = 1;
P0 = Segment_7code[3]; //1
P27 = 0;
DelayMs(2);
P27 = 1;
break;
case 4:
P0 = 0x8c;//t
P26 = 0;
DelayMs(2);
P26 = 1;
P0 = Segment_7code[1]; //1
P27 = 0;
DelayMs(2);
P27 = 1;
break;
case 5:
P0 = 0x8c;//t
P26 = 0;
DelayMs(2);
P26 = 1;
P0 = Segment_7code[2]; //1
P27 = 0;
DelayMs(2);
P27 = 1;
break;
case 6:
P0 = 0x8c;//t
P26 = 0;
DelayMs(2);
P26 = 1;
P0 = Segment_7code[3]; //1
P27 = 0;
DelayMs(2);
P27 = 1;
break;
case 7:
P0 = 0xff;
break;
default:
break;
}
}
void DelayMs(uint x)
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}
void timer0_ser() interrupt 1{
static unsigned char t;
TR0 = 0;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
t++;
if(t >= 20){ //50ms*20=1s
t = 0;
// bit_1s = 1;
bit_1s = ~bit_1s;
led0 = ~led0;
Counter--;
if(Counter <= 0){
Counter = 99;
}
}
TR0 = 1;
}
void display_data(){
P0 = buffer[1];
P26 = 1;
DelayMs(2);
P26 = 0;
P0 = buffer[0];
P27 = 1;
DelayMs(2);
P27 = 0;
}
/*****************************************************************/
void timer1_ser(void)interrupt 3
{
TR1 = 0;
TH1 = 0Xf8; //2ms value
TL1 = 0Xcd;
time_10ms++;
//2ms 定时中断到了,这里显示数码管驱动
if(time_10ms >=5){
time_10ms = 0;
key_scan(); //10MS 到了 定时扫描按键
}
time_100ms++;
if(time_100ms >= 50){//100ms flash
time_100ms = 0;
led1 = ~led1;
time_300ms++;
if(time_300ms >= 3){//300ms flash
time_300ms = 0;
led2 = ~led2;
}
}
TR1 = 1;
}
void main(void)
{
TMOD |= 0x11; // timer 0 and timer1 mode 1 16bit
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
TH1 = 0Xf8; //2ms 11.0592M
TL1 = 0Xcd;
TR0 = 1;
ET0 = 1;
TR1 = 1;
ET1 = 1;
EA = 1;
P26 = 1;
P27 = 1;
while(1)
{
key_process();
// numberToBuffer();
// display_data();
//
}
}
|
|