⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test728x.c

📁 c51写的
💻 C
字号:
#include <reg51.h>//*** 函数定义 ***void delay(unsigned char);				// 短暂延时void write728x(unsigned char, unsigned char);	// 写入到BC728xunsigned char read728x(unsigned char);		// 从BC728x读出void send_byte(unsigned char);			// 发送一个字节unsigned char receive_byte(void);			// 接收一个字节void delay10ms(unsigned char);void key_int(void);//*** 变量及I/O口定义 ***unsigned char digit[5];unsigned char key_number, j;unsigned int tmr;sbit clk=P3^5;		// clk 连接于 P3.5sbit dat=P3^7;		// dat 连接于 P3.7sbit key=P3^3;		// key 连接于 P3.3(INT1)//*** 主程序 ***main(){	unsigned char i,disp_data;	delay10ms(20);				// 等待 BC728x 完成复位 (200ms)	write728x(0x12,0x80);		// 初始化BC728x为164模式,不反相// ************************ 快速计数测试 ****************************		for (j=0;j<5;j++)			// 计数初始化	{		digit[j]=0;	}	while (digit[4]<5)			// 计数最大值50000	{		if (!key)		{			key_int();		}		digit[0]++;				// 个位加1		if (digit[0]>9)			// 判断是否有进位		{			digit[0]=0;			// 有进位,个位清零			digit[1]++;			// 十位加一			if (digit[1]>9)			{				digit[1]=0;				digit[2]++;				if (digit[2]>9)				{					digit[2]=0;					digit[3]++;					if (digit[3]>9)					{						digit[3]=0;						digit[4]++;					}				}			}		}		write728x(0x14,digit[0]);			// 刷新个位		if (digit[0]==0)					// 个位是否为零?		{			write728x(0x14,0x10+digit[1]);	// 个位为零,表示有进位,刷新十位			if (digit[1]==0)				// 十位是否为零?			{				write728x(0x14,0x20+digit[2]);	// 十位为零,刷新百位				if (digit[2]==0)				{					write728x(0x14,0x30+digit[3]);					if (digit[3]==0)					{						write728x(0x15,0x40+digit[4]);					}				}			}		}	}//********************* 寄存器直接读写测试 ************************	delay10ms(100);	write728x(0x16,0);				// 显示清屏	write728x(0x17,0);	write728x(0,0xb6);				// 在第0位显示一个‘三’字	delay10ms(100);	for (i=0;i<0x0f;i++)	{		disp_data=read728x(i);		// 读显示寄存器		write728x(i+1,disp_data);	// 写入下一位		write728x(i,0xff);			// 前一位清零		delay10ms(15);				// 延时	}	for (i=0x0f;i>0;i--)	{		disp_data=read728x(i);		// 读显示寄存器		write728x(i-1,disp_data);	// 写入前一位		write728x(i,0xff);			// 当前位清零		delay10ms(10);				// 延时200ms	}// ********************* hex 译码测试 *****************************	for (i=0;i<0x10;i++)	{		write728x(0x15,i*16+i);		// 在0-15位分别显示0-F		delay10ms(50);				// 延时1s	}// ********************* 闪烁功能测试 *****************************	disp_data=0xff;	for (i=0;i<8;i++)				// 每过一会增加一个闪烁位,直至全部闪烁	{		disp_data=disp_data/2;		write728x(0x10,disp_data);		delay10ms(150);	}	write728x(0x10,0xf0);			// 低四位闪烁	delay10ms(150);					// 延时	write728x(0x10,0x0f);			// 高四位闪烁	delay10ms(150);	disp_data=read728x(0x11);		// 读出闪烁速度控制寄存器	write728x(0,0xff);				// 第0-3位显示清零	write728x(1,0xff);	write728x(2,0xff);	write728x(3,0xff);		for (i=disp_data;i>0;i--)		// 闪烁速度测试——速度逐渐加快	{		write728x(0x15,(i-1)&0x0f);	// 在第0和第1位上输出闪烁速度控制寄存器值		write728x(0x15,(((i-1)&0xf0)/16)|0x10);		write728x(0x11,i-1);		// 更新闪烁速度寄存器		delay10ms(30);				// 延时300ms	}	delay10ms(200);					// 延时2s		for (i=0;i<0xff;i++)			// 闪烁速度测试——速度逐渐减慢	{		write728x(0x15,(i+1)&0x0f);	// 在第0和第1位上输出闪烁速度控制寄存器值		write728x(0x15,(((i+1)&0xf0)/16)|0x10);		write728x(0x11,i+1);		// 更新闪烁速度寄存器		delay10ms(30);	}	delay10ms(200);	write728x(0x10,0xff);			// 停止闪烁	write728x(0x11,0x40);			// 置闪烁寄存器为初始值// ***************************** 光柱译码测试 *****************************	for (i=0;i<=0x40;i++)	{		write728x(0x16,0x40-i);		// 光柱一递减显示		write728x(0x17,i);			// 光柱二递增显示		delay10ms(10);	}// ***************************** 段寻址测试 ******************************	write728x(0x17,0);				//  清 除 显 示	for (i=0;i<0x80;i++)			// 从第0段开始逐个点亮和熄灭	{		write728x(0x18,i);			// 段点亮		delay10ms(10);		write728x(0x18,i|0x80);		// 段熄灭	}// ******************************** 键盘测试 ****************************	write728x(0x10,0xfc);			// 第0、1位置为闪烁状态	write728x(8,0xf7);				// 在第8位显示"_"	key_int();	write728x(0x10,0xff);			// 停止闪烁}void key_int(void){	unsigned int timer;	while (1)	{		timer=0;		while(key && timer<0xf000)					// 等待按键		{			timer++;		}		if (timer>=0xf000)		{			return;		}		key_number=read728x(0x13);	// 读键值			write728x(0x15,0x90+(key_number&0xf0)/16);							// 在第1位上以HEX译码方式显示键码的高4位		write728x(0x15,0x80+(key_number&0x0f));	}						// 在第0位上以HEX译码方式显示键码的低4位}// ***********************************************************// * 写入BC728X, 第一个参数为目标寄存器地址, 第二个参数为要写入的数据 *// ***********************************************************void write728x(unsigned char reg_add, unsigned char write_data){	send_byte(reg_add);		// 发送寄存器地址	send_byte(write_data);	// 发送数据字节}// **********************************************************// *      读出 BC728X 内部寄存器的值, 调用参数为寄存器地址        *// **********************************************************unsigned char read728x(unsigned char reg_add){	send_byte(reg_add|0x80);	// 发送读指令(bit7=1)	return(receive_byte());	// 接收数据字节并返回}// ***********************************************************// *                向 BC728X 发送一个字节                     *// ***********************************************************void send_byte(unsigned char send_byte){	unsigned char bit_counter;	clk=0;			// 产生一 clk 脉冲	clk=1;	while (dat);		// 等待 BC728X 输出 dat 低电平响应	clk=0;			// 再次输出一 clk 脉冲	clk=1;	while (!dat);		// 等待 BC728X 进入接收状态	for (bit_counter=0;bit_counter<8;bit_counter++)	{			// 发送 8 个比特		if ((send_byte&0x80)==0) 		{  			dat=0;// 如果待发bit为0, 置 dat 为 0  	 	}  	 	else  	 	{  	 		dat=1;		// 反之置为 1  	  	} 		send_byte=send_byte*2;	// send_byte 左移一位		clk=0;			// 输出一 clk 脉冲		clk=1;		delay(1);		// 短暂延时	}	dat=1;				// 恢复 dat 为高电平}// ************************************************************// *                 从 BC728X 接收一个字节                     *// ************************************************************unsigned char receive_byte(void){	unsigned char bit_counter, in_byte;	clk=0;			// 发出一 clk 脉冲	clk=1;	while (dat);		// 等待 BC728X 响应	clk=0;		// 收到响应, 再一脉冲等待接收数据	clk=1;	for (bit_counter=0;bit_counter<8;bit_counter++)	{			// 接收8个bit		delay(1);	// 短暂延时		in_byte=in_byte*2;	// in_byte 左移一位		if (dat)	// 如果 dat 为'1'		{			in_byte=in_byte|0x01;	// bit0=1		}		clk=0;		// 输出一 clk 脉冲		clk=1;	}	return(in_byte);}// ***********************************************************// *  短暂延时程序, 延时时间与参数time成正比, 范围是几个uS到几百个uS *// ***********************************************************void delay(unsigned char time){	while (time!=0)	{		time--;	}}// ************************* 延时 n*10ms *************************void delay10ms(unsigned char time){	unsigned char i;	unsigned int j;	for (i=0;i<time;i++)	{		for(j=0;j<0x390;j++)		{			if (!key)			{				key_int();			}		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -