📄 kk.c
字号:
#include<kk.h>
uchar min=0;
uchar sec=0;
uchar flag_return=0;
bit light_red_green=0;
bit light_yellow=0;
uint sec_counter=0;
void main (void) {
while(1){
//min=0;
//sec=0;
//P0=0;
//P2=0x80;
init_device();
/*P1=0xff;//查询按键,选择功能,keyA为分秒计时,keyA为交通灯
if(keyA==0){
delayMs(1);
if(keyA==0){
while(!keyA);
min=0;
sec=0;
display_DCB();
}
}
if(keyB==0){
delayMs(1);
if(keyB==0){
while(!keyB);
min=0;
sec=0;
display2();
}
} */
key_scan();
}
}
void init_device(void)
{
min=0;
sec=0;
P0=0;
P2=0x80;
}
void key_scan(void)
{
P1=0xff;//查询按键,选择功能,keyA为分秒计时,keyA为交通灯
if(keyA==0){
delayMs(1);
if(keyA==0){
while(!keyA);
min=0;
sec=0;
display_DCB();
}
}
if(keyB==0){
delayMs(1);
if(keyB==0){
while(!keyB);
min=0;
sec=0;
display2();
}
}
}
void display_DCB (void) {
//此处启动定时器
StartTimer0();
while(1){
if(flag_return==1) {flag_return=0;break;}//是否返回选择
//P0=0x1f&(0xf0|(min/10));
//P0=0x2f&(0xf0|(min%10));
//P0=0x4f&(0xf0|(sec/10));
//P0=0x8f&(0xf0|(sec%10));
P0 = 0x10|(min/10);
P0 = 0x20|(min%10);
P0 = 0x40|(sec/10);
P0 = 0x80|(sec%10);
P1=0xff;//查询按键,keyC停止,keyD返回选择
if(keyC==0){ //按下keyC停止
delayMs(1);
if(keyC==0){
while(!keyC);
TR0=0;
while(1){
P0=0x1f&(0xf0|(min/10));
P0=0x2f&(0xf0|(min%10));
P0=0x4f&(0xf0|(sec/10));
P0=0x8f&(0xf0|(sec%10));
P1=0xff;//查询按键,keyC启动,keyD返回选择
if(keyC==0) {
delayMs(1);
if(keyC==0) {
while(!keyC);
TR0=1;
break;
}
}
if(keyD==0) {
delayMs(1);
if(keyD==0) {
while(!keyD);
flag_return=1;
break;
}
}
}
}
}
if(keyD==0){
delayMs(1);
if(keyD==0){
while(!keyD);
flag_return=1;
}
}
}
}
void display2(void) {
StartTimer1();
P2=0x91;//绿灯亮
while(1){
if(flag_return==1) {flag_return=0;break;}//是否返回选择
P0=0x1f&(0xf0|((25-sec)/10));P0=0x1f&(0xf0|((25-sec)/10));
P0=0x1f&(0xf0|((25-sec)/10));P0=0x1f&(0xf0|((25-sec)/10));
P0=0x2f&(0xf0|((25-sec)%10));delayUs(1);
P0=0x4f&(0xf0|((25-sec)/10));delayUs(1);
P0=0x8f&(0xf0|((25-sec)%10));
P1=0xff;//查询按键,keyC停止,keyD返回选择
if(keyC==0){ //按下keyC停止
delayMs(1);
if(keyC==0){
while(!keyC);
TR1=0;
while(1){
P0=0x1f&(0xf0|((25-sec)/10));P0=0x1f&(0xf0|((25-sec)/10));
P0=0x1f&(0xf0|((25-sec)/10));P0=0x1f&(0xf0|((25-sec)/10));
P0=0x2f&(0xf0|((25-sec)%10));delayUs(1);
P0=0x4f&(0xf0|((25-sec)/10));delayUs(1);
P0=0x8f&(0xf0|((25-sec)%10));
P1=0xff;//查询按键,keyC启动,keyD返回选择
if(keyC==0) {
delayMs(1);
if(keyC==0) {
while(!keyC);
TR1=1;
break;
}
}
if(keyD==0) {
delayMs(1);
if(keyD==0) {
while(!keyD);
flag_return=1;
break;
}
}
}
}
}
if(keyD==0){
delayMs(1);
if(keyD==0){
while(!keyD);
flag_return=1;
}
}
}
}
void StartTimer0(void)
{
TMOD=0x01;
TH0=0xd8;
TL0=0xf0; //10ms计数;
EA=1;
ET0=1;
TR0=1;
TR1=0;
sec_counter=0;
}
void timer0() interrupt 1
{
TH0=0xd1;
TL0=0xf0;
sec_counter++;
if(sec_counter==100) { //定时1s到时
sec_counter=0;
sec++;
if(sec==60){
sec=0;
min++;
if(min==60) {min=0;}
}
}
}
void StartTimer1(void)
{
TMOD=0x10;
TH1=0xd8;
TL1=0xf0; //10ms计数;
EA=1;
ET1=1;
TR1=1;
TR0=0;
sec_counter=0;
}
void timer1() interrupt 3
{
TH1=0xd8;
TL1=0xf0;
sec_counter++;
if(sec_counter==100) { //定时1s到时,秒加一
sec_counter=0;
sec++;
if(sec==25){
sec=0;
light_red_green=~light_red_green;//30秒后,红绿灯交换
if(light_red_green==0)P2=0x91;
if(light_red_green==1)P2=0x8a;
}
}
if(sec_counter%5==0&&sec>=20) {
light_yellow=~light_yellow;//绿灯变红灯时黄灯闪10秒
//if(light_red_green==0&&light_yellow==0)P2=0x90;
//if(light_red_green==0&&light_yellow==1)P2=0x94;
//if(light_red_green==1&&light_yellow==0)P2=0x82;
//if(light_red_green==1&&light_yellow==1)P2=0xa2;
if(light_red_green==0&&light_yellow==0)P2 = 0x91;
if(light_red_green==0&&light_yellow==1)P2 = 0xb5;
if(light_red_green==1&&light_yellow==0)P2 = 0x8a;
if(light_red_green==1&&light_yellow==1)P2 = 0xae;
}
}
void delayMs(uchar ms) {
uchar i;
while(ms--){ for(i=0;i<250;i++){;}};
}
void delayUs(uchar ms) {
uchar i;
while(ms--){ for(i=0;i<1;i++){;}};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -