📄 display.c
字号:
#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 + -