首页 > 其他分享 >14-基础技能综合实训案例

14-基础技能综合实训案例

时间:2023-10-12 10:01:26浏览次数:48  
标签:0000 14 unsigned char 实训 sbit 1000 1001 技能

基础技能综合实训案例

20231012094334

20231012093944

#include <REGX52.H>

sfr AUXR = 0X8e;

sbit S4 = P3^3;
sbit S5 = P3^2;

sbit L8 = P0^7;
sbit L7 = P0^6;

unsigned char hour = 0;
unsigned char minute = 0;
unsigned char second = 0;



unsigned char stat_led = 0xff;
unsigned char command = 0x00;
unsigned  char code  tables[18]= {
	0xC0,  		// 		1100 0000  // 0
	0xf9,	    // 		1111 1001   1
	0xa4,       // 		1010 0100   2          
	0xb0,       // 		1011 0000   3
	0x99,       // 		1001 1001   4
	0x92,       // 		1001 0010   5
	0x82,       // 		1000 0010   6
	0xf8,       // 		1111 1000   7
	0x80,       // 8
	0x90,       // 9    1001 0000
	0x88,       // A    1000 1000
	0x80,       // b    1000 0011
	0xc6,       // c    1100 0110
	0xc0,       // d    1010 0001
	0x86,       // E    1000 0110
	0x8e,       // F    1000 1110
	0xbf,        // -		1011 1111
	0x7f
};
void SMG_Display(void);
void Delay_ms(unsigned int xms) {
	
	unsigned int i,j;
	
	for(i = 0; i < xms;i++) {
		for(j = 0; j<299;j++);
	}
}
void _74HC138(unsigned char n) {
	switch(n) {
		case 4: P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5: P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6: P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7: P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0: P2 = (P2 & 0x1f) | 0x00;
		break;
	}

}
void System_Init(void) {
	_74HC138(5);
	P0 = 0x00;
	_74HC138(4);
	P0 = 0xff;
	

}

void SMG_duanma(unsigned char Location,unsigned char Value) {
	_74HC138(6);
	P0 = 0x01 << Location;
	_74HC138(7);
	P0 = Value;
}
void LED_Init(){
	unsigned char i;
	_74HC138(4);
	
	for(i = 0; i < 8;i++) {
		P0 = 0xfe << i;   // 1111 1110 << i == 
		Delay_ms(500);
	}
	
	for(i = 0; i < 8 ;i++) {
		P0 = ~(0xfe << i);  // 0000 0001 
		Delay_ms(500);
	}
	
	_74HC138(0);
}

void SMG_Init() {
	unsigned char i;
	_74HC138(7);
	P0 = 0x00;
	for(i = 0; i < 8;i++) {
		_74HC138(6);     	// 1111 1110  1111 1100
		P0 = ~(0xfe << i); 	// 0000 0001   0000 0011 0000 0111
		Delay_ms(500);  // 
	}
	
	for(i = 0; i < 8;i++) {		//1111 1110  1111 1100 1111 1000
		_74HC138(6);
		P0 = 0xfe <<i;
		Delay_ms(500);
	}
}
void LocalCleak(void) {
	if(S5 == 0) {
		SMG_Display();
		if(S5 == 0) {
			while(S5 == 0) {
				SMG_Display();
			}				// 7
			_74HC138(4); 
			stat_led = (stat_led | 0x40) & (~stat_led | 0xbf);
			P0 = stat_led;
			
			_74HC138(0); 
			
			
			
		}
	}
	if(S4 == 0) {
		SMG_Display();
		
		if(S4 ==0) {
			while(S4 ==0) {
				SMG_Display();
			}
			
			_74HC138(4);
			stat_led = (stat_led | 0x80) & (~stat_led | 0x7f);
			P0 = stat_led;
			_74HC138(0);
		}
	}
	
	
}
void SMG_Delay(unsigned int t) {
	while(t--);
}
void SMG_Display(void) {
	SMG_duanma(0,tables[hour/10]);
	SMG_Delay(500);
	SMG_duanma(1,tables[hour%10]);
	SMG_Delay(500);
	SMG_duanma(2,tables[16]);
	SMG_Delay(500);
	SMG_duanma(3,tables[second/10]);
	SMG_Delay(500);
	SMG_duanma(4,tables[second%10]);
	SMG_Delay(500);
	SMG_duanma(5,tables[16]);
	SMG_Delay(500);
	SMG_duanma(6,tables[minute/10]);
	SMG_Delay(500);
	SMG_duanma(7,tables[minute%10]);
	SMG_Delay(500);
}

void Timer0Init(void) {
	TMOD = 0x21;
	// 20ms
	TH0 = (25535-20000) / 256;
	TL0 = (25535-20000) % 256;
	
	TR0 = 1;
	ET0 = 1;
	EA = 1;
	
	

}
unsigned char count = 0;


void Timer0Rountine () interrupt 1 {
	TH0 = (25535-20000) / 256;
	TL0 = (25535-20000) % 256;
	
	count++;
	
	if(count == 20) {
		count = 0;
		minute++;
		if(minute == 60) {
			minute = 0;
			second ++;
			
			if(second == 60) {
				second= 0;
				hour++;
				if(hour == 99){
					hour=0;
				}
			}
		}
	}

}



void UART_Init(void) {
	TMOD = 0x21;
	
	SCON = 0x50;
	AUXR = 0x00;
	
	TH1 = 0xfd;
	TL1 = 0xfd;
	ES = 1;
	EA = 1;
	TR1 = 1;
	
	
}
void SendByte(unsigned char dat) {
	SBUF = dat;
	
	while(TI == 0);
	TI = 0;
}

void UART1_Routine(void) interrupt 4 {
	
	if(RI == 1) {
		RI = 0;
		command = SBUF;
	}
}

void UART_work(void) {
	
	if(command != 0x00) {
		_74HC138(4);
		switch(command & 0xf0) {   //1010 0001
			case 0xa0:  // 保留高四位     0101 1110 & 0000 1111
				P0 = (P0 & 0xf0) | (~command & 0x0f);
				command = 0;
			break;
			case 0xb0:
				SendByte((hour/10 << 4)|(hour % 10));
				SendByte((second/10 << 4)|(second % 10));
				SendByte((minute/10 << 4)|(minute % 10));
				command = 0;
			break;
		}
	}
}

void main(void) {
	System_Init();
	LED_Init();
	SMG_Init(); 
	Timer0Init();
	UART_Init();
		
	while(1) {
		UART_work();
		SMG_Display();
		
		LocalCleak();
	}
}

标签:0000,14,unsigned,char,实训,sbit,1000,1001,技能
From: https://www.cnblogs.com/bky111/p/17758819.html

相关文章

  • 14.2 Socket 反向远程命令行
    在本节,我们将继续深入探讨套接字通信技术,并介绍一种常见的用法,实现反向远程命令执行功能。对于安全从业者而言,经常需要在远程主机上执行命令并获取执行结果。本节将介绍如何利用_popen()函数来启动命令行进程,并将输出通过套接字发送回服务端,从而实现远程命令执行的功能。在实现......
  • CS144-lab5
    Checkpoint5Writeup该lab较简单,没什么好说的有两点是route函数for循环时必须用引用,还是ttl递减后要重新计算checksum,写的时候被坑到了。至于找到最长前缀匹配,遍历路由表即可,注意prefix为0时要特判;为了方便判断是否在路由表中找到符合项,max_prefix设置为int8_t。voidRouter:......
  • CF1401B [Ternary Sequence]
    Problem题目简述两个序列\(A,B\)。这两个序列都是由\(0,1,2\)这三个数构成。\(x_1,y_1,z_1\)和\(x_2,y_2,z_2\)分别代表\(A\)序列和\(B\)序列中\(0,1,2\)出现的次数。你可以重新排列两个序列中的元素,然后生成一个新序列\(C\),\(C\)的生成规则如下:\[C_i......
  • 144-11
    给定二叉树,删除结点值为x的左右子树利用层次遍历找到结点值为x的左右子树,分别删除;删除算法voidDelete(Tree&T){if(T){Delete(T->lchild);Delete(T->rchild);free(T);}}完整算法#include<stdio.h>#include<stdlib.h>#d......
  • 144-10 感觉有点难
    二叉树使用二叉链表存储,求先序序列中第k个结点的值首先明确先序遍历是根-左-右,使用递归算法,先左子树,后右子树。为了防止在找到第k个结点之前就进入右子树的遍历,可以在递归调用时,将左子树的返回值存储在一个变量中,并进行判断。如果左子树的返回值不等于特定的值(例如-1),则表示已经......
  • P1457 [USACO2.1] 城堡 The Castle 题解
    分析感觉没有蓝题难度一道bfs题目,相较于大部分bfs题,它较为复杂,但分析一下还是很好水过的。建立墙时,可以用三维数组,\(wall_{~i,~j,~pos}\)表示第\(i\)行第\(j\)列\(pos\)方向有墙。观察发现,\(8=2^3,4=2^2,2=2^1,1=2^1\),于是可以用位运算快速储存。这里给出......
  • CSP模拟52联测14 C.天竺葵
    CSP模拟52联测14C.天竺葵目录CSP模拟52联测14C.天竺葵题目大意思路code题目大意给定两个长度为\(n\)的序列\(a,b\)需要在\(a\)序列中好到最长的序列\(c\)满足\(c_{i+1}>b_i\timesc_i\)输出长度\(1\len\le10^6\)思路感觉和\(n(\logn)\)求最长上升......
  • 144-9
    链式存储的二叉树,交换左右结点位置递归#include<stdio.h>#include<stdlib.h>#defineMaxSize100typedefstructnode{intdata;structnode*lchild,*rchild;}TreeNode,*Tree;voidCreateTree(Tree&T){intx;scanf("%d",&x)......
  • 143-8
    二叉树采用二叉链表存储,计算给定二叉树的所有双分支结点个数递归思想当根结点不存在左右结点时,return0;当根节点存在左右结点时,returnCount(T->lchild)+Count(T->rchild)+1;当根节点只存在一个结点时,returnCount(T->lchild)+Count(T->rchild);#include<stdio.h>#include......
  • 143-7
    树结点由二叉链表存储,判定给定的树是否是完全二叉树用到了辅助队列只要出队的结点非空,就将其左右结点入队,无论左右结点是否为空。若出队的结点为空,就让队列结点依次出队,若存在非空结点,就说明树不是完全二叉树。#include<stdio.h>#include<stdlib.h>#defineMaxSize100......