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

📄 display.c

📁 显示模块,利用51单片机UART口通讯
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include <intrins.h>

#define uint  unsigned int
#define uchar unsigned char
/*------------------------位变量定义--------------------------*/
//control signal
sbit CST  = P2^7;                //连接非门输出,逻辑取反
sbit DC	  = P2^6;	
sbit WRT  = P3^6;	
sbit READ =	P3^7;	
sbit RST  = P1^0;	
sbit BS1  = P1^2;
sbit BS2  = P1^1;
//key
sbit S1 = P4^0;                  //连接非门输入,逻辑取反
sbit S2 = P4^1;
sbit S3 = P4^2;
//test led
sbit TLED1 = P4^3;               //连接非门输出,逻辑取反
sbit TLED2 = P1^7;
/*************************全局变量设置*************************/
//key press flag
bit F_S1;
bit F_S2;
bit F_S3;

bit F_SRV;                       //串行接收标志

uchar xdata HZbuff[16][8];       //字符显示缓冲区
uchar T_500ms;                   //0.5秒定时计数变量
uchar counter;                   //按键计数变量(例子)
uchar serial_R_dat;              //接收到的串行数据
/*************************点阵子模声明*************************/
unsigned char code HzDot1[16][2];
unsigned char code HzDot[16][2];
unsigned char code HzDot2[16][2];
unsigned char code shang[16][2];
unsigned char code hai[16][2];
unsigned char code wei[16][2];
unsigned char code er[16][2];
unsigned char code tai[16][2];
unsigned char code yi[16][2];
unsigned char code biao[16][2];

unsigned char code na[16][2];
unsigned char code mo[16][2];
unsigned char code a[16][2];
unsigned char code mi[16][2];
unsigned char code tuo[16][2];
unsigned char code fo[16][2];

unsigned char code Num[16*10][2];

/***************************函数声明**********************************/
void data_out(uchar dat);		                 //数据写入
void write_command(uchar dat);	                 //命令写入
void oled_initial();		                     //复位
void delay (uint counter);		                 //延时
void clear_RAM();                                //清屏
void sub_comm();                                 //初始化OLED
void PsetCH(uchar X,uchar Y);                    //定位显示16X8区域
bit  Odd_Even(uchar A);                          //奇数偶数判别
void MatrixConvert(uchar DotHZ[16][2]);          //16X16点阵子模转换成16X8 OLED子模
void MatrixConvertEN(uchar DotEN[16*10][2],uchar Num);//16X16数字子模转换成16X8 OLED子模
void showCH();                                   //子模显示
void KeyUp();                                    //按键处理

void T2_Serie_init();                            //定时器2作为波特率发生器
void Timer0_init();                              //定时器0初始化
void Timer1_init();                              //定时器1初始化

void Serie_Data();                               //串行数据接收处理

/*=====================================================================*/
/*                            主函数                                   */
/*=====================================================================*/
main()  
{

	BS1 = 0;                 
    BS2 = 1;                 

	F_S1 = 0;                 //初始化按键标志
	F_S2 = 0;
	F_S3 = 0;

	F_SRV = 0;

	TLED1 = 0;
	TLED2 = 1;
	T_500ms = 0;

	counter = 0;
	//...........................................
	IE = 0x00;                //关闭所有中断

	/*设定定时器和中断*/ 
	TMOD = 0x01;
	IE = 0x12;                //T0,串行口 中断允许
	//EX0 = 1;                  //外部中断0允许

	/*初始化timer0*/
	Timer0_init();
	/*初始化串行口*/
	T2_Serie_init();

	EA=1;                     //所有中断使能
    //............................................
	oled_initial();           //复位OLED
	clear_RAM();              //清屏
	sub_comm();               //初始化OLED设置
	//............................................

		MatrixConvert(na);
		PsetCH(8,10);
		showCH();

		MatrixConvert(mo);
		PsetCH(16,10);
		showCH();

		MatrixConvert(a);
		PsetCH(24,10);
		showCH();

		MatrixConvert(mi);
		PsetCH(32,10);
		showCH();

		MatrixConvert(tuo);
		PsetCH(40,10);
		showCH();

		MatrixConvert(fo);
		PsetCH(48,10);
		showCH();

	while(1)
	{
		KeyUp();
		Serie_Data();
	}


}
/*********************************************************************/
/*                            中断处理程序                           */ 
/*********************************************************************/ 
//外部0中断子程序  使用中断0,寄存器组0
void EX0_int() interrupt 0 using 0
{
	//添加外部中断0串口中断代码
	
}
/*------------------------------------------------------------------*/
//T0中断子程序  使用中断1,寄存器组3
void T0_int() interrupt 1 using 1
{
	if(++T_500ms == 20)
	{
		T_500ms = 0;
		//TLED1 = ~TLED1;
		TLED2 = ~TLED2;
	}

	Timer0_init();
}
/*------------------------------------------------------------------*/
//串口中断程序
void serial() interrupt 4 using 2
{
	ES = 0;
	if(RI == 1)
	{
		RI = 0;
		//添加接收串口中断代码
		F_SRV = 1; //串行接收标志
		serial_R_dat = SBUF;
		TLED1 = ~TLED1;
	}
	if(TI == 1)
	{
		TI = 0;
		//添加发送串口中断代码
		TLED1 = ~TLED1;
	}
	ES = 1;
}

/*******************************************************************/
/*                        定义函数                                 */
/*******************************************************************/
/*----------------------------定时器2初始化--------------------------*/
void T2_Serie_init()
{
/*使用T2作波特率发生器(34800)*/ 
  RCLK = 1;
  TCLK = 1;         
/*晶振11.0592MHz/
  TH2 = 0xFF;
  TL2 = 0xF7;
  RCAP2H = 0xFF;
  RCAP2L = 0xF7; 

/*晶振18.432MHz/
  TH2 = 0xFF;
  TL2 = 0xF1;
  RCAP2H = 0xFF;
  RCAP2L = 0xF1;

/*晶振22.1184MHz*/
  TH2 = 0xFF;
  TL2 = 0xEE;
  RCAP2H = 0xFF;
  RCAP2L = 0xEE;  

  SCON = 0x50;    //mode 1,allow receive data
  //SCON = 0xD0;    //mode 3,allow receive data
  TR2 = 1;
}
/*----------------------------定时器0初始化--------------------------*/
void Timer0_init()      //25ms定时
{
 TR0  = 0;
/*晶振11.0592MHz
 TH0  = 0xA5;
 TL0  = 0xFF;  */
/*晶振18.432MHz/
 TH0  = 0x6A;
 TL0  = 0x00;
/*晶振22.1184MHz*/
 TH0  = 0x4B;
 TL0  = 0xFF;  

 TR0  = 1;
}
/*----------------------------定时器1初始化--------------------------*/
void Timer1_init()
{
 TR1  = 0;
 TH1  = 0xFB;//0xD8;
 TL1  = 0x64;//0xF0;
 TR1  = 1;
}
/*----------------------------串行数据接收处理----------------------*/
void Serie_Data()
{
	if(F_SRV)
	{    //以下代码是接收0~9数字并显示的例子程序
		if((serial_R_dat <= 9)&&(serial_R_dat >= 0))
		{
			MatrixConvertEN(Num,serial_R_dat);
			PsetCH(24,26);
			showCH();
		}
		F_SRV = 0;//恢复串行接收标志
	}
}
/*----------------------------手动按键处理---------------------------*/
void KeyUp()
{
	if((S1 == 1)&&(F_S1 == 0)){F_S1 = 1;}   //按键1
	delay(1);                               //去抖动
	if((S1 == 0)&&(F_S1 == 1))
	{
		F_S1 = 0;                           //清除按键1标志
		SBUF = 0x55;                        //发送键值 
		//添加按键1处理代码
		clear_RAM();

		MatrixConvert(HzDot1);
		PsetCH(10,10);
		showCH();

		MatrixConvert(HzDot);
		PsetCH(18,10);
		showCH();

		MatrixConvert(HzDot2);
		PsetCH(26,10);
		showCH();
		
	}
	//___________________________________________

	if((S2 == 1)&&(F_S2 == 0)){F_S2 = 1;}   //按键2
	delay(1);                               //去抖动
	if((S2 == 0)&&(F_S2 == 1))
	{
		F_S2 = 0;                           //清除按键2标志
		SBUF = 0xAA;                        //发送键值 
		//添加按键2处理代码
		clear_RAM();

		MatrixConvertEN(Num,counter);
		PsetCH(10,26);
		showCH();
		if(++counter == 10){counter = 0;}	

	}
	//___________________________________________

	if((S3 == 1)&&(F_S3 == 0)){F_S3 = 1;}   //按键3
	delay(1);                               //去抖动
	if((S3 == 0)&&(F_S3 == 1))
	{
		F_S3 = 0;                           //清除按键3标志
		SBUF = 0xA5;                        //发送键值 
		//添加按键3处理代码
		clear_RAM();

		MatrixConvert(shang);
		PsetCH(0,10);
		showCH();

		MatrixConvert(hai);
		PsetCH(8,10);
		showCH();

		MatrixConvert(wei);
		PsetCH(16,10);
		showCH();

		MatrixConvert(er);
		PsetCH(24,10);
		showCH();

		MatrixConvert(tai);
		PsetCH(32,10);
		showCH();

		MatrixConvert(yi);
		PsetCH(40,10);
		showCH();

		MatrixConvert(biao);
		PsetCH(48,10);
		showCH();

	}
}
/*----------------------------显示字符---------------------------------*/
void showCH()
{
	uchar i,j;
	for(i=0;i<16;i++)
	{
		for(j=0;j<8;j++)
		{
			data_out(HZbuff[i][j]);
		}
	}

⌨️ 快捷键说明

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