- #include <STC8.H>
- #include <intrins.h>
- #include <string.h>
- #include <stdio.h>
- #include <math.h>
- #define A0 P30
- #define CS_O P31
- #define CLK P32
- #define MISO P33
- #define MOSI P54
- #define CS_F P55
- #define FOSC 11059200UL
- #define Command 0
- #define Data 1
- #define Enable 0
- #define Disable 1
-
- unsigned char FPS;
- unsigned int Temp,Frame,Video;
- unsigned char xdata Buffer[4][64];
- unsigned char code String[10][5]=
- {
- /*----------------------------数字----------------------------*/
- 0x7E,0x81,0x81,0x81,0x7E,
- 0x00,0x82,0xFF,0x80,0x00,
- 0xC2,0xA1,0x91,0x89,0x86,
- 0x42,0x81,0x89,0x89,0x76,
- 0x18,0x14,0x12,0xFF,0x10,
- 0x4F,0x89,0x89,0x89,0x71,
- 0x7C,0x8A,0x89,0x89,0x70,
- 0x01,0xC1,0x31,0x0D,0x03,
- 0x76,0x89,0x89,0x89,0x76,
- 0x0E,0x91,0x91,0x51,0x3E,
- };
-
- /*----------------------------延时10us@STC-Y6@11.0592MHz----------------------------*/
- //void Delay_10us(void)
- //{
- // unsigned char i;
- // i=35;
- // while(--i);
- //}
-
- /*----------------------------延时x10us----------------------------*/
- //void Delay_x10us(unsigned char x)
- //{
- // while(x--)
- // Delay_10us();
- //}
-
- /*----------------------------延时10ms@STC-Y6@11.0592MHz----------------------------*/
- void Delay_10ms(void)
- {
- unsigned char i,j;
- _nop_();
- _nop_();
- i=144;
- j=157;
- do
- {
- while(--j);
- }while(--i);
- }
-
- /*----------------------------延时x10ms----------------------------*/
- //void Delay_x10ms(unsigned char x)
- //{
- // while(x--)
- // Delay_10ms();
- //}
-
- void SPI_Write(unsigned char temp)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- CLK=0;
- temp<<=1;
- MOSI=CY;
- CLK=1;
- }
- }
-
- unsigned char SPI_Read(void)
- {
- unsigned char i,temp;
- for(i=0;i<8;i++)
- {
- temp<<=1;
- CLK=0;
- CLK=1;
- if(MISO)
- temp|=0x01;
- }
- return temp;
- }
-
- void SH1106_Init(void)
- {
- A0=Command;
- SPI_Write(0xae); //关闭显示
- SPI_Write(0xa8); //设置驱动路数为32路
- SPI_Write(0x1f); //设置驱动路数为32路
- SPI_Write(0xc8); //设置Common输出扫描方向
- SPI_Write(0xa1); //设置镜像
- // SPI_Write(0xa7); //设置反白
- SPI_Write(0xaf); //打开显示
- }
-
- void SH1106_Set_Posi(unsigned char page,unsigned char column)
- {
- A0=Command;
- SPI_Write(0xb0+(page&0x0f));
- SPI_Write(0x00+(column&0x0f));
- SPI_Write(0x12+((column&0xf0)>>4));
- }
-
- void SH1106_Clear_Screen(void)
- {
- unsigned char i,j;
- for(i=0;i<4;i++)
- {
- A0=Command;
- SPI_Write(0xb0+i);
- SPI_Write(0x00);
- SPI_Write(0x12);
- A0=Data;
- for(j=0;j<64;j++)
- {
- SPI_Write(0x00);
- }
- }
- }
-
- void Display_String(unsigned char page,unsigned char column,unsigned char temp)
- {
- unsigned char i;
- SH1106_Set_Posi(page,column);
- A0=Data;
- for(i=0;i<5;i++)
- {
- SPI_Write(String[temp][i]);
- }
- }
-
- void Display_Buffer(void)
- {
- unsigned char i,j;
- CS_O=Enable;
- for(i=0;i<4;i++)
- {
- SH1106_Set_Posi(i,0);
- A0=Data;
- for(j=0;j<64;j++)
- {
- SPI_Write(Buffer[i][j]);
- }
- }
- CS_O=Disable;
- }
-
- void Flash_Read(unsigned int temp)
- {
- unsigned char i,j;
- CS_F=Enable;
- SPI_Write(0x03);
- SPI_Write(temp/256);
- SPI_Write(temp%256);
- SPI_Write(0x00);
- for(i=0;i<4;i++)
- {
- CS_F=Enable;
- for(j=0;j<64;j++)
- {
- Buffer[i][j]=SPI_Read();
- }
- }
- CS_F=Disable;
- }
-
- void Config_Read(void)
- {
- CS_F=Enable;
- SPI_Write(0x03);
- SPI_Write(0);
- SPI_Write(0);
- SPI_Write(0x00);
- FPS=SPI_Read();
- Video=SPI_Read();
- Video<<=8;
- Video|=SPI_Read();
- CS_F=Disable;
- }
-
- void Init_OLED(void)
- {
- CS_O=Enable;
- SH1106_Init();
- SH1106_Set_Posi(0,0);
- SH1106_Clear_Screen();
- CS_O=Disable;
- }
-
- void Init(void)
- {
- P3M0=0x04;
- P3M1=0x08;
- P5M0=0x30;
- P5M1=0x00;
- P3PU=0x03;
- P5PU=0x00;
- Config_Read();
- Temp=0x10000-FOSC/12/FPS;
- TH0=Temp>>8; //设置定时初始值
- TL0=Temp; //设置定时初始值
- TF0=0; //清除TF0标志
- ET0=1; //打开定时器0中断
- EA=1; //打开总中断
- }
-
- void main(void)
- {
- Init();
- if(P30)
- {
- Init_OLED();
- TR0=1; //打开定时器0
- while(1);
- }
- else
- {
- while(!P30);
- Delay_10ms();
- Init_OLED();
- Delay_10ms();
- CS_O=Enable;
- Display_String(0,0,FPS/100);
- Display_String(0,6,FPS%100/10);
- Display_String(0,12,FPS%10);
- Display_String(1,0,Video/10000);
- Display_String(1,6,Video%10000/1000);
- Display_String(1,12,Video%1000/100);
- Display_String(1,18,Video%100/10);
- Display_String(1,24,Video%10);
- CS_O=Disable;
- P3M0=0x00;
- P3M1=0x0C;
- P5M0=0x00;
- P5M1=0x30;
- P3PU=0x03;
- P5PU=0x00;
- while(1);
- }
- }
-
- void Timer0(void) interrupt 1
- {
- unsigned char i;
- Flash_Read(Frame);
- if(Frame==0)
- {
- for(i=0;i<3;i++)
- {
- Buffer[0][i]=0x00;
- }
- }
- Display_Buffer();
- Frame++;
- if(Frame==Video)
- Frame=0;
- }
复制代码
|